Jenkins(部署、基础项目)

文章目录

Jenkins基础

Jenkins插件:https://plugins.jenkins.io/

Jenkins是一个开源持续集成的工具,是由JAVA开发而成

Jenkins是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作

通过Jenkins完成,CI、CD任务,包括构建、测试和部署等

  • DevOps
  • DevSecOps
    • dev开发
    • ops运行
    • sec安全

Jenkins部署

官方文档:https://www.jenkins.io/zh/doc/

官方下载地址:Jenkins Mirrors

Jenkins支持的JDK对应版本

Supported Java versions Long term support (LTS) release Weekly release
Java 17, Java 21, or Java 25 N/A 2.534 (October 2025)
Java 17 or Java 21 2.479.1 (October 2024) 2.463 (June 2024)
Java 11, Java 17, or Java 21 2.426.1 (November 2023) 2.419 (August 2023)
Java 11 or Java 17 2.361.1 (September 2022) 2.357 (June 2022)
Java 8, Java 11, or Java 17 2.346.1 (June 2022) 2.340 (March 2022)
Java 8 or Java 11 2.164.1 (March 2019) 2.164 (February 2019)
Java 8 2.60.1 (June 2017) 2.54 (April 2017)
Java 7 1.625.1 (October 2015) 1.612 (May 2015)

yum安装Jenkins(LTS)

shell 复制代码
#1.检查是否已安装 Java
java --version
#2.若未安装(根据 Tomcat 版本选择兼容的 Java 版本)
yum install -y wget ; mkdir -p /download ; wget https://download.java.net/java/GA/jdk21.0.2/f2283984656d49d69e91c558476027ac/13/GPL/openjdk-21.0.2_linux-x64_bin.tar.gz -O /download/openjdk-21.0.2_linux-x64_bin.tar.gz
#3.解压并链接到/usr/local/jdk21
tar -zxvf /download/openjdk-21.0.2_linux-x64_bin.tar.gz -C /usr/local/
ln -s /usr/local/jdk-21.0.2 /usr/local/jdk21
#4.配置jdk环境变量
echo 'export JAVA_HOME=/usr/local/jdk21' >> /etc/profile
echo 'export PATH=${PATH}:$JAVA_HOME/bin' >> /etc/profile
source  /etc/profile
#5.查看jdk版本
java --version

#6.安装Jenkins 2.479.1(LTS)
rpm -ivh jenkins-2.479-1.1.noarch.rpm

#7.设置jenkins systemctl启动配置文件(设置JAVA的环境变量,不然识别不到报错)
#/lib/systemd/system/jenkins.service
##在service下面添加
Environment="JAVA_HOME=/usr/local/jdk21"  

#8.启动jenkins,并放行相关端口
systemctl enable --now jenkins && ss -tulnp |grep 8080

windows添加hosts解析,域名+8080端口访问

根据提示复制密码粘贴到下面

先跳过安装插件,后续再安装

设置插件加速源

若要扩展Jenkins的功能,就需要为其安装适合的插件

shell 复制代码
#9.设置Plugin的更新站点
###进入 Jenkins 核心工作目录
cd /var/lib/jenkins
###替换更新中心源地址
sed -i 's#https://updates.jenkins.io/update-center.json#https://mirrors.huaweicloud.com/jenkins/updates/dynamic-2.479/#gi' hudson.model.UpdateCenter.xml
###删除/备份 旧插件缓存文件
rm -f /var/lib/jenkins/updates/default.json
###重启 Jenkins 服务,使配置生效(安装完插件也要重启Jenkins才能生效)
systemctl restart jenkins

安装BuleOcean插件,为Jenkins创建Job提供新的界面

安装和删除插件需要重启Jenkins,并且需要在Jenkins空闲的时候进行

Jenkins创建CICD任务流程与UI相关设置

如何使用Jenkins创建CICD任务

概述

典型的CICD操作过程可以抽象为Pipeline形式

  • 由构建、测试、打包阶段组成

  • 为了便于用户定义CICD具体步骤,Jenkins提供了不同类型的Job

CICD过程拥有输入输出

  • 输入就是将某个代码仓库克隆
  • 输出就是代码编译后的产物(如jar、war)
  • 需要完成认证才能访问代码仓库,Jenkins支持将认证(凭据)事先定义,并可以在Pipeline中自动引用

触发任务

  • 使用触发器指定触发机制
  • 指出的触发机制
    • 手动触发
    • 定时触发
    • 由其他流水线的执行结果触发
    • 由特定的事件触发,例如代码仓库上的PR事件等
    • ...

交付部署

将CICD流水线交付的结果部署到目标环境中

  • 部署新版本的操作过程,是触发系统故障的常见原有之一
  • 因而,部署操作通常需要人工介入,或借助专用的部署工具遵循特定的部署策略进行
    • 滚动部署和金丝雀发布
    • 蓝绿部署
部署策略 核心逻辑 零停机 回滚难度 适用场景 你的技术栈适配度
滚动部署(Rolling) 分批更新服务器(比如先更 1 台,验证 OK 再更下 1 台),旧版本和新版本短暂共存 中等 中小规模集群、无状态服务 最高(无需额外工具)
金丝雀发布(Canary) 先部署 1 台 "金丝雀服务器"(小流量验证),没问题再全量部署其余服务器 低(直接停金丝雀) 高风险版本、核心业务(怕全量故障) 高(需标签 / 路由配合)
蓝绿部署(Blue/Green) 两套完全相同的环境(蓝 = 当前运行,绿 = 待部署),验证 OK 后切换路由 是(切换瞬间) 极低(切回蓝环境) 核心业务、零停机要求高(如电商) 中(需两套环境 + 路由)
  • 部署操作通常还需要同流量迁移机制协同进行
  • 需要执行自动化部署时,在Jenkins流水线的定义中,添加一个调用部署工作的步骤即可

通知与报告

流水线执行结束后,其状态通常要存档,并在必要时通知给相关人员

  • Jenkins使用"构建后操作"来定义这部分操作

Jenkins UI相关设置

指定bash解释器

  • (configure system)系统配置中修改--指定命令解释器shell

关闭ssh-主机校验host key

使用凭据保存敏感信息

Jenkins的Job中可能会使用到敏感数据,例如

  • 基于ssh连接目标主机时使用的私钥,或者用户名与密码

  • 从私有代码仓库中克隆代码时使用的认证信息

  • 将构建后的Package推送至目标存储服务时使用的认证信息

为确保自动化的Job能自动访问到这些信息,Jenkins则通过"凭据"来保存它们

  • 创建的"凭据"可基于其名称等进行引用

Jenkins项目类型

无论是哪个版本的Jenkins,都要通过新建一个指定类型的项目来添加一个新"job"

Jenkins中所谓的"项目类型"的定义,主要是用于分类一个具体的CI任务在其"构建"定义上的区别,

  • 开放式配置可以用于执行任何任务:自由风格类型的项目、流水线项目
  • 针对高级或具有复杂场景的用例:多配置项目
  • 针对组织的任务:文件夹、多分支流水线、GitHub组织、Bitbucket团队等项目
  • 自动配置和构建的任务:多分支流水线、GitHub组织、Bitbucket团队等项目
项目类型 核心用途 适配场景
自由风格项目(Freestyle) 基础灵活,支持任意自动化操作(执行脚本、调用工具等) 中小项目、临时任务、已有部署脚本需快速落地
Maven 项目(Maven Project) 专为 Maven 优化,内置编译打包逻辑,简化 JDK/Maven 配置 Java Web 项目(Jar/War 包)、依赖 Maven 构建的项目
Pipeline 项目 代码化定义 CI/CD 流程(支持分支判断、审批、滚动 / 金丝雀发布),流程可版本控制 中大型项目、复杂部署需求、需流程固化 / 团队协作
多配置项目(Multi-configuration) 一次构建,并行执行多环境 / 多版本测试 多环境(测试 / 生产)并行部署、多 JDK 版本兼容性测试
文件夹(Folder) 归类管理多个 Jenkins 项目,方便权限 / 分类控制 团队项目数量≥10 个,需按业务线 / 环境分组
Github 组织或 Gitlab 组 自动发现组织 / 组内所有仓库,批量创建 Pipeline,统一管理分支构建规则,支持团队协作权限隔离 多仓库协作项目、跨团队开发场景、需统一 CI/CD 标准的组织级项目、需自动同步仓库 / 分支的场景

构建流水线

准备构建工具

首先按照你部署的需求要准备构建工具

  • JDK、maven、Golang、Node.js...

构建、构建系统和构建工具

  • 构建:将程序源代码转换成一个可用的目标(target)的过程,该过程可能会包括获取依赖、编译、打包等环节;目标就是构建的最终产物,比如说是jar包、可执行程序、配置脚本,该文件就是所谓的产物

    • Nexus就是存储构建后的产物
  • 程序开发完成后,程序员完全可以在本地进行构建,但是基于标准、统一构建环境进行构建,能保证构建质量(①主要解决环境不一致的问题②减少手动操作,避免在编译过程中忘记安装哪些构建依赖等)

    • Jenkins是构建服务器,自身并未提供构建工具
    • 但Jenkins可集成用户所需的大部分主流构建工具(流水线中执行的shell脚本进行构建的步骤,依赖的是操作系统上可用的shell命令)
  • 构建工具与源程序的编程语言有关系,因此Jenkins需要集成构建工具,取决于实际需求

程序类型 使用工具 工具使用方式(关键命令 / 操作) 构建产物
java Maven、Gradle 1. Jenkins 集成Maven Plugin; 2. 配置 Maven 路径 + 私服(如 Nexus); 3. 执行命令:mvn clean package Jar 包(如user-service-1.0.0.jar
前端程序 npm / cnpm / pnpm / yarn 1. Jenkins 集成NodeJS Plugin; 2. 配置 Node.js 版本; 3. 执行命令:npm install && npm run build 静态资源包(含 HTML、CSS、JS、图片等,通常在dist目录下)
Go 程序 Golang 环境 1. 服务器 / Jenkins 配置 Golang 环境(设置GOPATH); 2. 执行命令:go mod tidy && go build -o 程序名 二进制可执行文件
Python 程序(后端 / 脚本) pip + tar(系统命令) 1. Jenkins 集成Python Plugin; 2. 配置 Python 版本; 3. 执行:pip install -r requirements.txt -t lib && tar -zcvf python-app.tar.gz 源代码目录 lib tar.gz 归档包(含源代码、依赖库 lib 目录)
PHP 程序(Web / 接口) Composer + tar(系统命令) 1.服务器安装 Composer; 2. 执行:composer install --no-dev(安装生产依赖); 3. 执行:tar -zcvf php-app.tar.gz 源代码目录 vendor tar.gz 归档包(含源代码、依赖库 vendor 目录)
静态资源(纯 HTML/CSS/JS) tar(系统命令) 1.无需依赖安装; 2. 执行:tar -zcvf static-resource.tar.gz 静态文件目录(如 HTML、CSS、图片目录) tar.gz 归档包(含所有静态文件)

全局工具配置

全局工具配置中配置的工具既可以源自于操作系统的包管理器管理的应用程序,也可以是由Jenkins自动安装在$JENKINS_HOME/tools下的程序

有些工具程序可以同时存在多个版本,Pipeline任务中可以通过配置的程序的名称进行调用

手动安装,填写maven目录

自动安装,配置完成后,Jenkins都不会立即进行安装,而是在第一次被用到的时候才会安装

自由风格类型项目(部署小鸟飞飞)

  • 流程

    • 环境准备

    • 上传代码到gitlab/gitee/github仓库

    • jenkins创建任务并build

    • 在build背后执行了(克隆代码、构建、测试等操作)部署需要添加额外的构建步骤

    • 最后现象就是web集群代码更新了

角色 IP
gitlab(存放小鸟飞飞的代码) 10.0.0.121
jenkins(代码发布平台) 10.0.0.122
web01(web集群) 10.0.0.110

(1)环境准备

shell 复制代码
#1.Linux机器上配置gitlab的域名解析
cat >> /etc/hosts <<EOF
10.0.0.121 gitlab.chenshiquan.xyz
EOF
#2.生成密钥
ssh-keygen
#3.配置免密(一会部署会用到)
ssh-copy-id 10.0.0.110
ssh 10.0.0.110

#4.在远程10.0.0.110主机安装nginx
yum install -y nginx && systemctl enable --now nginx
#5.设置nginx站点配置文件
cat > /etc/nginx/conf.d/csqyouxi.xnfff.com.conf  <<EOF
server{
	listen 80;
	server_name bird.chenshiquan.xyz;
	root /app/code/bird/;
	location / {
		index index.html;
	}
}
EOF
#检查语法
nginx -t 
#6.重启nginx
systemctl restart nginx

(2)gitlab新建代码仓库

(3)模拟开发上传bird.tar.gz到gitlab仓库中

shell 复制代码
#0.在gitlab上传公钥(使用Linux就上传Linux的公钥,windows就上传windows的公钥)
cat ~/.ssh/id_ed25519.pub
#1.创建代码目录,将代码移动进去,并进入该目录
mkdir code
tar xf bird.tar.gz -C code/
cd code
#2.Git本地配置
git config --global user.name 'csq'
git config --global user.email '2033717617@qq.com'
git config --global color.ui true 
#3.初始化仓库
git init
#4.关联gitlab远程仓库(记得域名解析)
git remote add origin git@gitlab.chenshiquan.xyz:root/bird.git
#5.上传代码
git add .
git commit -m 'bird code'
git push -u origin master
#6.上传标签
git tag -a 'v0.9' -m 'bird v0.9 add code'
#7.上传指定标签
git push origin  v0.9

(4)jenkins创建任务并build

创建Item

gitlab存放jenkins的公钥

jenkins上存放私钥凭证

设置构建的最大个数

增加构建步骤使用shell

shell 复制代码
echo "#####1.打包#####"
#/var/jenkins_home/workspace/02-xxxx/ 
tar zcf  /opt/bird.tar.gz     .

echo "#####2.分发#####"
##2.ansible 
ip_list=10.0.0.110

for ip in $ip_list
do
	scp /opt/bird.tar.gz  root@$ip:/opt/
	#if
done


echo "#####3.部署#####"
#1.ssh ip 命令
#2.ansible 

for pp in $ip_list
do
	ssh root@$pp  "set -ex;
	               mkdir -p /app/code/bird/;
	               tar xf  /opt/bird.tar.gz   -C /app/code/bird/"
	#if
done

build

(5)浏览器访问web

(6)模拟开发更新代码

shell 复制代码
#1.修改小鸟飞飞飞的代码再次push
git add .
git commit -m 'brid v1.0'
git push -u origin master

(7)jenkins再次build,访问web是否改变

自由风格类型项目(部署前端代码)

流程

  • 环境准备

  • 上传代码到gitlab/gitee/github仓库

  • jenkins创建任务并build

  • 在build背后执行了(克隆代码、构建、测试等操作)部署需要添加额外的构建步骤

  • 最后现象就是web集群代码更新了

(1)环境准备

步骤参考上面

shell 复制代码
#web01设置前端站点配置文件
cat > /etc/nginx/conf.d/china.chenshiquan.xyz.conf  <<EOF
server{
	listen 80;
	server_name china.chenshiquan.xyz;
	root /app/code/china/;
	location / {
		index index.html;
	}
}
EOF
#检查语法
nginx -t
#生效配置文件
systemctl reload nginx

Jenkins下载node.js

shell 复制代码
#1.下载node.js
wget https://nodejs.org/dist/v24.11.0/node-v24.11.0-linux-x64.tar.xz -P /download
#2.解压到/usr/local/下
tar xf  /download/node-v24.11.0-linux-x64.tar.xz  -C /usr/local/
#3.软链接简化路径
ln -s /usr/local/node-v24.11.0-linux-x64/ /usr/local/node
#4.修改所有者
chown -R root:root /usr/local/node-v24.11.0-linux-x64/
#5.配置PATH环境变量
echo 'export PATH=$PATH:/usr/local/node/bin' >> /etc/profile
source  /etc/profile
#6.配置npm国内下载源
npm config set registry https://registry.npmmirror.com
cat ~/.npmrc  #源存放路径
#7.检查node.js版本和npm版本
npm --version && node --version

Jenkins下载ansible

shell 复制代码
#0.安装 Python3 版本的pip工具
yum install -y python3-pip

#1.将已安装的pip升级到最新版本
python3 -m pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple --upgrade pip

#2.配置 pip 源(永久加速)
pip3 config set global.index-url https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple

#3.安装ansible
pip3 install  ansible
ansible --version

#4.配置ansible(pip安装默认不会创建主配置文件,需要自己设置)
mkdir -p /etc/ansible/ 
cat >/etc/ansible/ansible.cfg<<'EOF'
[defaults]
host_key_checking = False
deprecation_warnings = False
interpreter_python=/usr/bin/python3
[inventory]
[privilege_escalation]
[paramiko_connection]
[ssh_connection]
[persistent_connection]
[accelerate]
[selinux]
[colors]
[diff]
EOF

#5.写入主机清单文件(分发密钥,配置主机清单)
###分发密钥
ssh-copy-id root@远程ip
###配置主机清单
cat > /etc/ansible/hosts <<EOF
[web]
10.0.0.110
[jenkins]
10.0.0.122
EOF

#6.测试连通性
ansible all -m ping

#7.编写jenkins使用的playbook
mkdir -p /ansible/playbook/
cat  > /ansible/playbook/01-frontend.yaml <<EOF
- hosts: jenkins
  tasks:
    - name: "1.在Jenkins编译"
      shell:
        cmd: npm i && npm run build
        chdir: "/var/lib/jenkins/workspace/02-china-ex-main"
      environment:
        PATH: "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/jdk21/bin:/usr/local/node/bin:/usr/local/maven/bin:/root/bin"

    - name: "2.在Jenkins打包"
      archive:
        path: "/var/lib/jenkins/workspace/02-china-ex-main/dist/*"
        dest: "/opt/china-ex-main.tar.gz"
- hosts: web
  tasks:
    - name: "1.创建站点目录"
      file:
        path: "/app/code/china"
        state: directory
        recurse: true
    - name: "2.分发部署"
      unarchive:
        src: "/opt/china-ex-main.tar.gz"
        dest: "/app/code/china/"
        creates: false
EOF

(2)gitlab新建代码仓库

(3)模拟开发上传前端代码到gitlab仓库

shell 复制代码
#0.在gitlab上传公钥(使用Linux就上传Linux的公钥,windows就上传windows的公钥)
cat ~/.ssh/id_ed25519.pub
#1.解压前端代码
unzip china-ex-main.zip
cd china-ex-main

#2.Git本地配置
git config --global user.name 'csq'
git config --global user.email '2033717617@qq.com'
git config --global color.ui true 
#3.初始化仓库
git init
#4.关联gitlab远程仓库(记得域名解析)
git remote add origin git@gitlab.chenshiquan.xyz:root/frontend.git
#5.上传代码
git add .
git commit -m 'china-ex-main code'
git push -u origin master
#6.上传标签
git tag -a 'v0.99' -m 'china-ex-main v0.90 add code'
#7.上传指定标签
git push origin  v0.99

(4)jenkins创建任务并build

(5)浏览器访问web

(6)模拟开发更新代码

shell 复制代码
#1.给代码title更改了名字
git add .
git commit -m 'china-ex-main v1.0'
git push -u origin master

(7)jenkins再次build,访问web是否改变

maven项目类型

java应用编译打包工具:

  • maven
  • gradle

(1)环境准备

shell 复制代码
#1.web01安装tomcat
###安装Java
yum install -y java-11-openjdk-devel
###安装tomcat
https://blog.csdn.net/qq_52089863/article/details/152328679

#2.jenkins本地 编写 ansible-playbook
cat  > /ansible/playbook/02-java-hello.yaml <<EOF
- hosts: web
  tasks:
    - name: "1.分发编译产物"
      copy:
        src: "/var/lib/jenkins/workspace/03-maven/target/hello-world-war-1.0.0.war"
        dest: "/opt/"
    - name: "2.关闭tomcat"
      systemd:
        name: tomcat
        state: stopped
    - name: "3.移除 ROOT 目录和 ROOT.war 文件"
      file:
        path: "{{ item }}"
        state: absent
      loop:
        - /usr/local/tomcat/webapps/ROOT
        - /usr/local/tomcat/webapps/ROOT.war
    - name: "4.创建新的软链接"
      file:
        src: /opt/hello-world-1.0.0
        path: /usr/local/tomcat/webapps/ROOT
        state: link
    - name: "5.开启tomcat"
      systemd:
        name: tomcat
        state: started
EOF

jenkins安装maven

shell 复制代码
#1.安装maven软件包
yum install -y wget;wget https://dlcdn.apache.org/maven/maven-3/3.9.11/binaries/apache-maven-3.9.11-bin.tar.gz -P /download

#2.解压maven二进制包
tar -zxvf /download/apache-maven-3.9.11-bin.tar.gz -C /usr/local/

#3.设置软链接简化路径
ln -s /usr/local/apache-maven-3.9.11/ /usr/local/maven

#4.配置环境变量,并查看maven版本
echo 'export PATH=$PATH:/usr/local/maven/bin' >> /etc/profile
source  /etc/profile
mvn --version

#5.配置maven编译加速
#mvn编译本质下载代码需要的jar包依赖,整合依赖生成war包/jar包
#mvn默认从官网下载,速度很慢
#配置maven阿里云加速
#打开 Maven 的配置文件(在maven安装目录的conf/settings.xml)
#在<mirrors></mirrors>标签中添加 mirror 子节点:
<mirror>
    <id>aliyunmaven</id>
    <mirrorOf>*</mirrorOf>
    <name>阿里云公共仓库</name>
    <url>https://maven.aliyun.com/repository/public</url>
</mirror>

配置maven、JDK存放的位置

只要是jenkins会使用到的工具,都要配置工具存放的位置(yum安装除外)

(2)gitlab新建代码仓库

(3)上传前端代码到gitlab仓库

shell 复制代码
#0.在gitlab上传公钥(使用Linux就上传Linux的公钥,windows就上传windows的公钥)
cat ~/.ssh/id_ed25519.pub
#1.解压前端代码
unzip hello-world-war-src-code.zip -d java-hello/
cd java-hello/

#2.Git本地配置
git config --global user.name 'csq'
git config --global user.email '2033717617@qq.com'
git config --global color.ui true 
#3.初始化仓库
git init
#4.关联gitlab远程仓库(记得域名解析)
git remote add gitlab git@gitlab.chenshiquan.xyz:root/java-hello.git
#5.上传代码
git add .
git commit -m 'java-hello code'
git push -u gitlab master
#6.上传标签
git tag -a 'v0.99' -m 'java-hello v0.99 add code'
#7.上传指定标签
git push gitlab  v0.99

(4)接入Jenkins

(5)浏览器访问web

(6)模拟开发更新代码

shell 复制代码
git add .
git commit -m 'java-hello shanxi'
git push -u gitlab master

(7)jenkins再次build,访问web是否改变

错误解决

构建过程中权限不足

  • 构建过程中发现权限不够,需要将运行的jenkins用户改为root
shell 复制代码
egrep -i  '^(user|group)' /lib/systemd/system/jenkins.service
#修改如下内容
User=root
Group=root
#将jenkins工作目录权限改为root
chown root:root -R  /var/lib/jenkins/
#重启jenkins
systemctl daemon-reload && systemctl restart jenkins
  • 再次Build后
相关推荐
倔强的石头1063 小时前
Linux 进程深度解析(四):环境变量 —— 进程的“环境 DNA”
linux·运维·服务器
沈健_算法小生3 小时前
Jenkins权限控制实现
运维·jenkins
Wpa.wk4 小时前
自动化测试-自动化测试用例流程设计
运维·经验分享·自动化·测试用例·测试流程·测试流程设计
qq_455760854 小时前
Docker - 镜像
linux·运维·docker
苹果醋34 小时前
java设计模式之责任链模式
java·运维·spring boot·mysql·nginx
m0_534875054 小时前
Ditto局域网同步功能实现宿主机和VMware虚拟机之间的复制粘贴共享
linux·运维·服务器
甲虫机4 小时前
超详细教程--电脑同时使用内网和外网上网
运维·服务器·网络
RisunJan4 小时前
Linux命令-hdparm命令(获取和设置硬盘参数)
linux·运维·服务器
维度攻城狮4 小时前
宿主机休眠后再启动,vmware虚拟机中Ubuntu系统无法联网问题解决办法
运维·服务器·ubuntu·vmware