Jenkins 是基于 Java 开发的一种开源的CI(Continuous integration持续集成)&CD (Continuous Delivery持续交付,Continuous Deployment持续部署)工具
一、 Jenkins 安装和启动
(一)jenkins安装
1.环境准备
用哪个版本的java环境从官网看:https://www.jenkins.io/doc/book/platform-information/support-policy-java/
bash
apt update && apt -y install openjdk-21-jdk
从网上下载jenkins稳定版的安装包后,放到主机上安装
bash
root@ubuntu10:~ dpkg -i jenkins_2.541.1_all.deb
然后就可以在客户端访问10.0.0.10:8080端口,根据提示找到密码并输入

进入后可以选择自己需要的插件安装,一直下一步


安装中文插件


下载下来的包默认地址在:/var/lib/jenkins/plugins/
中文插件需要重启 jenkins 后生效,可以在终端
bash
systemctl restart jenkins.service
也可以在浏览器中输入10.0.0.10:8080/restart

2.密码找回
先下载jenkins.cli.jar文件,可以执行下面操作进行管理jenkins
bash
wget http://10.0.0.10:8080/jnlpJars/jenkins-cli.jar
java -jar jenkins-cli.jar -s http://10.0.0.10:8080/ help
ERROR: You must authenticate to access this Jenkins.
Jenkins CLI
Usage: java -jar jenkins-cli.jar [-s URL] command [opts...] args...
Options:
-s URL : the server URL (defaults to the JENKINS_URL env var)
-webSocket : connect using WebSocket (the default; works well with most reverse proxies; requires Jetty)
-http : use a pair of HTTP(S) connections rather than WebSocket
-ssh : use SSH protocol rather than WebSocket (requires -user; SSH port must be open on server)
-i KEY : SSH private key file used for authentication (for use with -ssh)
-noCertificateCheck : bypass HTTPS certificate check entirely. Use with caution
-noKeyAuth : do not try to load the SSH authentication private key. Conflicts with -i
-user : specify user (for use with -ssh; must have registered a public key)
-strictHostKey : request strict host key checking (for use with -ssh)
-logger FINE : enable detailed logging from the client
-auth [ USER:SECRET | @FILE ] : specify username and either password or API token (or load from them both from a file);
for use with -http.
Passing credentials by file is recommended.
See https://www.jenkins.io/redirect/cli-http-connection-mode for more info and options.
-bearer [ TOKEN | @FILE ] : specify authentication using a bearer token (or load the token from file);
for use with -http. Mutually exclusive with -auth.
Passing credentials by file is recommended.
The available commands depend on the server. Run the 'help' command to see the list.
绑定用户
bash
java -jar jenkins-cli.jar -s http://admin:123456@10.0.0.10:8080/
停止服务
bash
systemctl stop jenkins
删除jenkins主目录中config.xml的如下内容
bash
vim /var/lib/jenkins/config.xml
......
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
<denyAnonymousReadAccess>true</denyAnonymousReadAccess>
</authorizationStrategy>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>true</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>
......
就可以直接进来了

但是会发现用户管理的按钮没有了

修改安全配置为Jenkins's own user database(Jenkins专有用户数据库)

可以进入admin账户修改密码

还原设置

(二)Jenkins 结合 GitLab 实现代码下载
1.架构

思路:
1.从gitlab下载jenkins
bashgit clone git@gitlab.lty.org:devops/wheel.git2.打通 jenkins 主机和 gitlab 主机的 key 验证
3.打通 jenkins 主机和10.0.011、10.0.012的key验证
3.将wheel项目文件从jenkins传到10.0.0.11、10.0.0.12
bashscp -r wheel/* root@10.0.0.11:/var/www/html scp -r wheel/* root@10.0.0.12:/var/www/html
把相关项目导入到自己的gitlab中


2.配置环境
(1) Jenkins 服务器创建访问GitLab的凭据
为了实现jenkins和gitlab的通信,并且实现自动化,需要打通key验证
在 Jenkins 服务器上生成 ssh key
注意jenkins使用的是jenkins用户执行相关命令,所以我们需要再jenkins用户下获取密钥对
bash
root@ubuntu10:/data/jenkins/scripts su - jenkins
jenkins@ubuntu10:~$ ssh-keygen
jenkins@ubuntu10:~$ cat .ssh/id_ed25519
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACArPsIxhY8SiKsbwtXceCwhzN0sQHtoXi4yYi+8XfmRLQAAAJjT5FWt0+RV
rQAAAAtzc2gtZWQyNTUxOQAAACArPsIxhY8SiKsbwtXceCwhzN0sQHtoXi4yYi+8XfmRLQ
AAAEA/71627nSjrTaMA1G2in2MKZxgznJnu2i8P2IPs4eIvSs+wjGFjxKIqxvC1dx4LCHM
3SxAe2heLjJiL7xd+ZEtAAAAEGplbmtpbnNAdWJ1bnR1MTABAgMEBQ==
-----END OPENSSH PRIVATE KEY-----
jenkins@ubuntu10:~$ cat .ssh/id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICs+wjGFjxKIqxvC1dx4LCHM3SxAe2heLjJiL7xd+ZEt jenkins@ubuntu10
(2)在 Gitlab服务器上用户中关联 Jenkins 生成的ssh 公钥key
在GitLab中项目具有访问权限的用户帐号的profile中导入Jenkins的公钥;我这里就用 lty 账户


但是在第一次使用 git clone 命令的时候会触发SSH的安全协议,在自动化过程中需要将其关闭

在jenkins 主机上配置SSH;本质就是在进行SSH传输的时候,把远程主机的公钥直接拉取过来
bash
root@ubuntu10:~ vim /etc/ssh/ssh_config
......
# CheckHostIP no
# AddressFamily any
# ConnectTimeout 0
StrictHostKeyChecking no #去除注释,把ask改成no
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
......

(3)将wheel项目文件从jenkins传到10.0.0.11、10.0.0.12
首先需要打通 jenkins 主机与 10.0.0.11、10.0.0.12 的key验证
bash
上一步中已经生成过密钥对,不然先获取密钥对 ssh-keygen
jenkins@ubuntu10:~$ ssh-copy-id root@10.0.0.11
root@ubuntu11:~ ls .ssh/
authorized_keys #生成的公钥
jenkins@ubuntu10:~$ ssh-copy-id root@10.0.0.12
bash
scp -r wheel/* root@10.0.0.11:/var/www/html
scp -r wheel/* root@10.0.0.12:/var/www/html
3.准备脚本并在jenkins执行构建
bash
创建目录
root@ubuntu10: mkdir /data/jenkins/scripts -p
root@ubuntu10: cd /data/jenkins/scripts
root@ubuntu10:/data/jenkins/scripts vim wheel.sh
#!/bin/bash
#wheel_test
NET=10.0.0
ID="
11
12"
git clone git@gitlab.lty.org:devops/wheel.git
for i in $ID;do
scp -r wheel/* root@$NET.$i:/var/www/html
在 jenkins 中


访问一下两个主机


(三)jenkins上用gitlab插件实现互联
1.使用http协议配置 Git 项目地址和凭证
安装gitlab插件

创建凭据

bash
脚本就需要变化
#!/bin/bash
#wheel_test
NET=10.0.0
ID="
11
12"
#git clone git@gitlab.lty.org:devops/wheel.git #上面的gitlab相当于完成脚本中的这一步
for i in $ID;do
#scp -r wheel/* root@$NET.$i:/var/www/html #通过插件拉取下来的工作目录会在 /vat/lib/jenkins/workspeace/freestyle-wheel 下
scp -r * root@$NET.$i:/var/www/html #所以直接 * 就可以了
done
执行构建

2.使用SSH协议
使用插件配对就无所谓使用的是什么用户,哪个主机,提取的都是这个密钥对;例如我们这里故意用10.0.0.11主机来创建
bash
root@ubuntu11:~ ssh-keygen
root@ubuntu11:~ cat .ssh/id_ed25519 .ssh/id_ed25519.pub
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW
QyNTUxOQAAACD2enizbYYIl5M7z9jO2Gl/IblKDpmDEEbuaY1cCwwunwAAAJCXCJHmlwiR
5gAAAAtzc2gtZWQyNTUxOQAAACD2enizbYYIl5M7z9jO2Gl/IblKDpmDEEbuaY1cCwwunw
AAAECJhTrmhlA7UezB5JUsk6hUvl3qQxtYRS36OlEsG6bgCPZ6eLNthgiXkzvP2M7YaX8h
uUoOmYMQRu5pjVwLDC6fAAAADXJvb3RAdWJ1bnR1MTE=
-----END OPENSSH PRIVATE KEY-----
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPZ6eLNthgiXkzvP2M7YaX8huUoOmYMQRu5pjVwLDC6f root@ubuntu11

添加私钥

gitlab的lty账号上面添加公钥


用 10.0.0.10 主机的 jenkins 账户创建密钥对,给 10.0.0.11 和 10.0.0.12 打通 key 验证
bash
jenkins@ubuntu10:~$ ssh-keygen
jenkins@ubuntu10:~$ ls .ssh/
id_ed25519 id_ed25519.pub known_hosts
jenkins@ubuntu10:~$ ssh-copy-id root@10.0.0.11
jenkins@ubuntu10:~$ ssh-copy-id root@10.0.0.12
执行构建


(四)配置 Jenkins 结合 GitLab 实现自动化前端项目的部署和回滚
1.先把脚本准备好
bash
#!/bin/bash
HOST_LIST="
10.0.0.11
10.0.0.12
"
APP=wheel
APP_PATH=/var/www/html
DATA_PATH=/opt
DATE=`date +%F_%H-%M-%S`
deploy () {
for i in ${HOST_LIST};do
ssh root@i "rm -f ${APP_PATH} && mkdir -pv ${DATA_PATH}/${APP}-${DATE}"
scp -r * root@${i}:${DATA_PATH}/${APP}-${DATE}
ssh root@${i} "ln -sv ${DATA_PATH}/${APP}-${DATE} ${APP_PATH}"
done
}
rollback() {
for i in ${HOST_LIST};do
CURRENT_VERSION=$(ssh root@${i} "readlink ${APP_PATH}")
CURRENT_VERSION=$(basename ${CURRENT_VERSION})
echo ${CURRENT_VERSION}
PRE_VERSION=$(ssh root@${i} "ls -1 ${DATA_PATH} | grep -B1 ${CURRENT_VERSION} | head -n1 ")
echo ${PRE_VERSION}
ssh root@${i} "rm -f ${APP_PATH} && ln -sv ${DATA_PATH}/${PRE_VERSION} ${APP_PATH}"
done
}
case $1 in
deploy)
deploy
;;
rollback)
rollback
;;
*)
exit
;;
esac
在10.0.0.11和10.0.0.12主机上将 html 目录换个地方实现脚本里面的软连接
bash
root@ubuntu12:~ mv /var/www/html/ /srv/
2.新建item


3.更新项目仓库并构建
bash
root@ubuntu14:~/wheel vim index.html
root@ubuntu14:~/wheel git commit -am "二等奖50万"
[master db435f6] 二等奖50万
1 file changed, 1 insertion(+), 1 deletion(-)
root@ubuntu14:~/wheel git push --all

根据脚本内容创建了软连接
bash
root@ubuntu11:~ ll /var/www/
总计 8
drwxr-xr-x 2 root root 4096 2月 4 18:30 ./
drwxr-xr-x 15 root root 4096 2月 3 16:18 ../
lrwxrwxrwx 1 root root 30 2月 4 18:30 html -> /opt/wheel-2026-02-04_18-30-44/
4.更新第二个版本项目
bash
root@ubuntu14:~/wheel vim index.html
root@ubuntu14:~/wheel git commit -am "一等奖500万"
root@ubuntu14:~/wheel git push --all
构建

在更新一个版本方便比较
bash
root@ubuntu14:~/wheel vim index.html
root@ubuntu14:~/wheel git commit -am "特等奖1000万"
root@ubuntu14:~/wheel git push --all
构建

5.创建一个新的item负责回退


目前版本是"特等奖1000万"

执行构建回退成功

本质就是在 10.0.0.11 和 10.0.0.12 主机的软连接指向了上一个版本
bash
root@ubuntu11:~ ll /opt
总计 28
drwxr-xr-x 7 root root 4096 2月 4 19:08 ./
drwxr-xr-x 23 root root 4096 11月 5 11:20 ../
drwxr-xr-x 4 root root 4096 2月 4 18:58 wheel-2026-02-04_18-30-44/
drwxr-xr-x 4 root root 4096 2月 4 18:43 wheel-2026-02-04_18-43-37/
drwxr-xr-x 4 root root 4096 2月 4 18:58 wheel-2026-02-04_18-58-26/
drwxr-xr-x 4 root root 4096 2月 4 19:06 wheel-2026-02-04_19-06-36/
drwxr-xr-x 4 root root 4096 2月 4 19:08 wheel-2026-02-04_19-08-22/
root@ubuntu11:~ ll /var/www/
总计 8
drwxr-xr-x 2 root root 4096 2月 4 19:13 ./
drwxr-xr-x 15 root root 4096 2月 3 16:18 ../
lrwxrwxrwx 1 root root 30 2月 4 19:13 html -> /opt/wheel-2026-02-04_19-06-36/
(五)参数化构建
常用的参数类型:
选项参数 Choice Parameter
布尔值参数 Boolean Parameter
字符参数 String Parameter
文本参数 Multi-line String Parameter
凭据参数
密码参数
文件参数
运行时参数
基于(四)项目,在一个item中完成部署和回滚





二、自由风格的任务构建基于 Spring Boot 的 JAR 包 JAVA 项目

1. Jenkins 服务器上安装 maven 和配置镜像加速
bash
root@ubuntu10:/data/jenkins/scripts apt install maven -y
镜像加速
root@ubuntu10:/data/jenkins/script vim /etc/maven/settings.xml
.....
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
2.在目标主机安装 JAVA 环境
bash
apt update && apt -y install openjdk-21-jre
3.准备相关脚本
bash
#!/bin/bash
APP=spring-boot-helloworld
APP_PATH=/data/${APP}
# 远程部署目标主机列表
HOST_LIST="
10.0.0.11
10.0.0.12
"
# 项目运行端口
PORT=80
# 本地Maven打包,跳过测试用例(加快构建速度)
mvn clean package -Dmaven.test.skip=true
# 遍历远程主机,执行批量部署
for host in ${HOST_LIST};do
ssh root@${host} "[ -e ${APP_PATH} ] || mkdir -p ${APP_PATH}"
ssh root@${host} killall -9 java &> /dev/null
scp target/${APP}-*-SNAPSHOT.jar root@${host}:${APP_PATH}/${APP}.jar
ssh root@${host} "nohup java -jar ${APP_PATH}/${APP}.jar --server.port=${PORT} &>/dev/null &"
done
4.新建item


构建

目标主机成功构建了java项目

三、利用 Git Parameter 插件实现拉取指定版本
基于 二、 的基础上
把项目拉到开发机10.0.0.14上,修改 vim src/main/java/com/neo/controller/HelloWorldController.java 文件把其中的 v0.5 改成 v0.6;然后上传仓库并重新构建

在jenkins的插件商店中安装 git parameter

支持分支等




构建

四、自由风格的任务构建若依 RuoYi 管理平台

从gitlab中导入项目
bash
root@ubuntu11:~ git clone http://gitlab.lty.org/devops/RuoYi.git
1.准备数据库
确定域名和数据库名称及密码
bash
root@ubuntu11:~ vim RuoYi/ruoyi-admin/src/main/resources/application-druid.yml

准备MySQL
bash
root@ubuntu11:~ vim /etc/mysql/mysql.conf.d/mysqld.cnf
root@ubuntu11:~ systemctl restart mysql.service

配置数据库
bash
root@ubuntu11:~ mysql
mysql> create database ry;
mysql> create user ry@'10.0.0.%' identified by '123456';
mysql> grant all on ry.* to ry@'10.0.0.%';
导入数据表
mysql> use ry
mysql> source RuoYi/sql/quartz.sql
mysql> source RuoYi/sql/ry_20240112.sql
mysql> show tables;
+--------------------------+
| Tables_in_ry |
+--------------------------+
| QRTZ_BLOB_TRIGGERS |
| QRTZ_CALENDARS |
| QRTZ_CRON_TRIGGERS |
| QRTZ_FIRED_TRIGGERS |
| QRTZ_JOB_DETAILS |
| QRTZ_LOCKS |
| QRTZ_PAUSED_TRIGGER_GRPS |
| QRTZ_SCHEDULER_STATE |
| QRTZ_SIMPLE_TRIGGERS |
| QRTZ_SIMPROP_TRIGGERS |
| QRTZ_TRIGGERS |
| gen_table |
| gen_table_column |
| sys_config |
| sys_dept |
| sys_dict_data |
| sys_dict_type |
| sys_job |
| sys_job_log |
| sys_logininfor |
| sys_menu |
| sys_notice |
| sys_oper_log |
| sys_post |
| sys_role |
| sys_role_dept |
| sys_role_menu |
| sys_user |
| sys_user_online |
| sys_user_post |
| sys_user_role |
+--------------------------+
31 rows in set (0.00 sec)
2.在Jenkins准备MAVEN和JAVA环境
bash
apt update && apt -y install maven
vim /etc/maven/settings.xml
.....
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
......
3.在部署应用的目标服务器准备环境
沿用的架构所以配置一下10.0.0.11和10.0.0.12主机
bash
vim /etc/hosts
10.0.0.10 gitlab.lty.org redis.lty.org
10.0.0.11 jenkins.lty.org mysql.lty.org
bash
mkdir -p /data/ruoyi
apt update && apt -y install openjdk-21-jre
4.写入脚本
bash
root@ubuntu10: vim /data/jenkins/scripts/freestyle-ruoyi.sh
#!/bin/bash
# 变量定义
APP=ruoyi
APP_PATH=/data/$APP
PORT=80
HOST_LIST="
10.0.0.11
10.0.0.12
"
mvn clean package -Dmaven.test.skip=true
# 循环部署到目标服务器
for host in $HOST_LIST;do
ssh root@$host "[ -e $APP_PATH ] || mkdir -p $APP_PATH"
ssh root@$host killall -9 java &> /dev/null
scp ruoyi-admin/target/*.jar root@$host:${APP_PATH}/${APP}.jar
ssh root@$host "nohup java -jar ${APP_PATH}/${APP}.jar --server.port=${PORT} &>/dev/null &"
done
5.在Jenkins创建自由风格任务
结合git parameter 插件实现参数化构建



6.执行并验证任务



五、构建后通知
(一)邮件通知
1.准备告警邮箱配置
开通这个服务

这个插件装一下

2.配置 Jenkins管理员发信件人邮箱




选择一个上面构建的项目


首次成功不发邮件,失败后成功会发,失败、连续失败都会发

打码的地方时错误的地址可以查看错误的是什么项目

(二)钉钉通知
1.配置钉钉
建群之后加入自定义机器人;根据需要选择安全设置


上面两个信息要记录好需要配置到jenkins中
2.配置jenkins
安装 DingTalk 插件;安装完插后,建议重启,否则可能通知失败

添加一个机器人,把上面的两个信息放入对应的地方

测试成功

到项目的配置中创建钉钉告警

构建



(三)企业微信
1.和钉钉差不多创建机器人
2.配置jenkins

进入一个项目配置


六、自动化构建
(一)定时和 SCM 构建
定时构建:
按时间周期性的触发构建
轮询SCM(Source Code Management):
指的是定期到代码仓库检查代码是否有变更,存在代码变更时就运行pipeline;为了能够从CI中得到更多的收益,轮询操作越频繁越好;显然,这会给SCM带去无谓的压力,所以构建的触发由SCM负责通知Jenkins最为理想;但在外部的SCM无法通知到局域网中的Jenkins时,可以采轮询SCM方式倒也不失为一种选择
首次任务会进行构建,后续查看SCM代码是否变化,来决定是否构建
1.定时构建
字段说明
MINUTE:小时内的分钟数(取值 0-59)
HOUR:一天中的小时数(取值 0-23,24 小时制)
DOM:每月的日期(取值 1-31)
MONTH:月份(取值 1-12)
DOW:每周的星期几(取值 0-7,其中 0 和 7 都代表周日)
操作符说明
要为单个字段指定多个值,可使用以下操作符(优先级按顺序排列):
*:表示 "所有有效值"
M-N:表示 "一个值的范围"
M-N/X或*/X:表示 "按 X 的间隔,遍历指定范围或所有有效值"
A,B,...,Z:表示 "枚举多个值"负载均衡建议
为了让周期性任务给系统带来更均匀的负载,应尽可能使用符号
H(即 "哈希" 符号)。例如:如果 12 个日常任务都用0 0 * * *,会导致午夜出现负载峰值;而用H H * * *,每个任务仍会每天执行一次,但不会同时触发,能更好地利用有限资源。
H符号可结合范围使用,例如H H(0-7) * * *表示在凌晨 0:00 到 7:59 之间的某个时间执行。你也可以在H中结合间隔(无论是否带范围)。
H符号可理解为 "范围内的随机值",但它实际上是基于作业名的哈希值(而非随机函数),因此对指定项目来说,这个值是稳定不变的。注意事项
在 "每月日期" 字段中,短周期配置(如
*/3或H/3)在多数月份的月末会出现执行不一致的情况(因为月份天数不同)。例如:*/3会在天数多的月份里,在 1 日、4 日......31 日执行,然后在下个月的次日再次执行;H/3的哈希值始终在 1-28 范围内,因此月末的执行间隔会变成 3 到 6 天(长周期配置也会有间隔不一致的问题,但影响相对不明显)。注释规则
空行和以
#开头的行将被视为注释,不会被执行。便捷别名
此外,还支持
@yearly、@annually、@monthly、@weekly、@daily、@midnight、@hourly这些便捷别名,它们会自动使用哈希系统实现负载均衡:
格式顺序为:分钟 小时 日期 月份 星期

2.SCM轮询构建

(二)构建 Webhook 触发器
构建触发器(webhook),也称为钩子,实际上是一个HTTP回调,其用于在开发人员向gitlab提交代码后能够触发jenkins自动执行代码构建操作。

根据提示:JENKINS_URL/job/freestyle-spring-boot-helloworld-webhook/build?token=TOKEN_NAME
完善这个内容:http://10.0.0.10:8080/job/freestyle-spring-boot-helloworld-webhook/build?token=123456

新建一个账号

bash
root@ubuntu12:~ curl http://jenkins:123456@10.0.0.10:8080/job/freestyle-spring-boot-helloworld-webhook/build?token=123456

1. Jenkins 配置生成用户的 API Token
不可能每次都用用户名密码去构建
登录刚才创建的用户jenkins

把这个内容抄下来
bash
root@ubuntu12:~ curl http://jenkins:117483d551f8fab68e04ec5fb9b1ce4053@10.0.0.10:8080/job/freestyle-spring-boot-helloworld-webhook/build?token=123456

2.配置gitlab
以管理员身份把这个功能打开


测试一下


七、构建前后多个项目关联自动触发任务执行
创建3个新的item:job1、job2、job3
(一)在前面任务里配置构建后操作
在job1中设定构建完成后启动job2的构建功能




(二)在后续构建的任务里利用构建触发器实现
在job3中设定构建job2后自动构建job3




八、实现容器化的 Docker 任务
流程思路

(一)架构

我们需要在10.0.0.10、 10.0.0.11、 10.0.0.12 主机上面装上docker;在10.0.0.10 主机上搭建一个harbor安装过程可以参考docker第九点的harbor部署。
写一个hosts文件同步到10.0.0.10、 10.0.0.11、 10.0.0.12 主机
1.根据流程图先修改脚本
bash
root@ubuntu10:~ cat /data/jenkins/scripts/spring-boot-helloworld.sh
#!/bin/bash
APP=spring-boot-helloworld
#APP_PATH=/data/${APP}
# 远程部署目标主机列表
HOST_LIST="
10.0.0.11
10.0.0.12
"
# 项目运行端口
PORT=80
HARBOR=harbor.lty.org
PROJECT=jenkins
TAG=${BUILD_NUMBER}
docker build -t ${HARBOR}/${PROJECT}/${APP}:${TAG} -f Dockerfile-multistages .
创建一个新的item



尝试构建一下

提示权限有问题
bash
root@ubuntu10:~ ll /var/run/docker.sock
srw-rw---- 1 root docker 0 1月 30 14:21 /var/run/docker.sock= #660 所有人是没有权限的
可以直接修改jenkins的配置文件让他用root身份执行,但是处于安全考虑不采用这种方式,我们把jenkins加到docker组中
bash
root@ubuntu10:~ usermod -aG docker jenkins
root@ubuntu10:~ id jenkins
uid=123(jenkins) gid=125(jenkins) 组=125(jenkins),124(docker)
注意一定要重启jenkins才能获取最新的组成员关系
systemctl restart jenkins
构建成功

2.上传到harbor上
对脚本进行修改
bash
root@ubuntu10:~ cat /data/jenkins/scripts/spring-boot-helloworld.sh
#!/bin/bash
APP=spring-boot-helloworld
#APP_PATH=/data/${APP}
# 远程部署目标主机列表
HOST_LIST="
10.0.0.11
10.0.0.12
"
# 项目运行端口
PORT=80
HARBOR=harbor.lty.org
PROJECT=jenkins
TAG=${BUILD_NUMBER}
docker build -t ${HARBOR}/${PROJECT}/${APP}:${TAG} -f Dockerfile-multistages .
docker login ${HARBOR} -u admin -p 123456 #登录
docker push ${HARBOR}/${PROJECT}/${APP}:${TAG} #推送到harbor服务器
执行构建


如果构建时出现https因信任问题报错可以修改docker的json文件,注意要给每个后台主机也传一份
bash
root@ubuntu10:~ cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://docker.1panel.live",
"https://docker.1ms.run",
"https://docker.xuanyuan.me"
],
"experimental":true,
"insecure-registries": ["harbor.lty.org"] #主要就是加上这个
}
systemctl restart docker.service
3.后端服务器运行docker容器
对脚本进行修改
bash
root@ubuntu10:~# vim /data/jenkins/scripts/spring-boot-helloworld.sh
# 项目核心配置变量
APP=spring-boot-helloworld
#APP_PATH=/data/${APP}
# 远程部署目标主机列表
HOST_LIST="
10.0.0.11
10.0.0.12
"
# 项目运行端口
PORT=80
HARBOR=harbor.lty.org
PROJECT=jenkins
TAG=${BUILD_NUMBER}
docker build -t ${HARBOR}/${PROJECT}/${APP}:${TAG} -f Dockerfile-multistages .
docker login ${HARBOR} -u admin -p 123456
docker push ${HARBOR}/${PROJECT}/${APP}:${TAG}
# 遍历远程主机,执行批量部署
for host in ${HOST_LIST};do
ssh root@$host "docker rm -f ${APP} && docker run --name ${APP} -p ${PORT}:8888 -d ${HARBOR}/${PROJECT}/${APP}:${TAG}"
done
执行构建



可以在客户机模拟一下修改代码后重新构建
bash
root@ubuntu14:~ vim /spring-boot-helloworld/src/main/java/com/neo/controller/HelloWorldController.java
package com.neo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloWorldController {
@RequestMapping("/")
public String index() {
return "Spring Boot Hello\n";
}
@RequestMapping("/hello")
public String hello() {
return "Hello World";
}
@RequestMapping("/version")
public String version() {
return "version v0.7\n"; #改成v0.7版
}
}
bash
root@ubuntu14:~/spring-boot-helloworld git commit -am 'v0.7'
[main ff4f9cc] v0.7
1 file changed, 1 insertion(+), 1 deletion(-)
root@ubuntu14:~/spring-boot-helloworld git branch
* main
root@ubuntu14:~/spring-boot-helloworld git push --all
重建构建容器



