CICD服务器jenkins

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

bash 复制代码
git clone git@gitlab.lty.org:devops/wheel.git

2.打通 jenkins 主机和 gitlab 主机的 key 验证

3.打通 jenkins 主机和10.0.011、10.0.012的key验证

3.将wheel项目文件从jenkins传到10.0.0.11、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

把相关项目导入到自己的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符号可理解为 "范围内的随机值",但它实际上是基于作业名的哈希值(而非随机函数),因此对指定项目来说,这个值是稳定不变的。

注意事项

在 "每月日期" 字段中,短周期配置(如*/3H/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

重建构建容器

相关推荐
Mikowoo0074 小时前
VMware Tools 与 共享主机文件夹
运维·服务器
文静小土豆4 小时前
CentOS 7 升级 OpenSSL 3.5.4 详细指南
linux·运维·centos·ssl
许愿OvO4 小时前
HAProxy七层代理:高性能负载均衡实战
运维·负载均衡
Starry_hello world4 小时前
Linux 网络(8)
linux·运维·网络
优秀的颜4 小时前
Elasticsearch(7.x)集成
大数据·elasticsearch·jenkins
EverydayJoy^v^4 小时前
Linux Shell 高级编程(3)——awk
linux·运维·shell
Eine .5 小时前
LVS负载均衡
运维·负载均衡·lvs
2401_858936885 小时前
【Linux 编程】深入理解 POSIX 线程(pthread)核心接口与分离属性
运维·服务器
小贺儿开发5 小时前
Unity3D 自动化物流分拣模拟
运维·科技·unity·自动化·人机交互·传送带·物流分拣
果壳~5 小时前
Docker镜像离线迁移:从下载到本地部署完整实战指南
运维·docker·容器