Jenkins(持续集成与自动化部署)
链接:https://zhuanlan.zhihu.com/p/1947789995810223544
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Jenkins
是一个开源软件项目,是基于Java开发的一种持续集成工具。
前提准备:3台服务(操作系统:CentOS Stream 8 64位),分别部署GitLab、Jenkins(JDK、Maven、Git)、测试服务器(jar包项目、JDK)
机器1:GitLab安装使用
安装前提:内存至少需要4G
官方网站:https://about.gitlab.com/
安装文档:https://docs.gitlab.cn/jh/install/requirements.html
安装包:https://packages.gitlab.cn/#browse/browse
安装指南:https://gitlab.cn/install/
安装极狐GitLab指导文档:https://gitlab.cn/docs/jh/install/
基于ssh下安装
1 安装依赖
sudo yum install -y curl policycoreutils-python openssh-server perl
sudo systemctl enable sshd
sudo systemctl start sshd
# 会在系统防火墙中打开 HTTP、HTTPS 和 SSH 访问
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld
2 配置镜像
# 需要一些时间
curl -fsSL https://packages.gitlab.cn/repository/raw/scripts/setup.sh | /bin/bash
3 开始安装
# gitlab的访问地址,自己的站点ip地址,如果是公式,配置对应的域名,也需要时间
sudo EXTERNAL_URL="http://127.0.0.1" yum install -y gitlab-jh
在安装过程中指定自定义密码,否则会随机生成密码,存储在 /etc/gitlab/initial_root_password
中(该文件在24 小时后会自动删除,建议安装成功,立即修改初始密码)使用此密码和用户名 root
登录。
# 查看初始密码
cat /etc/gitlab/initial_root_password
gitlab常用命令
gitlab-ctl start # 启动所有 gitlab 组件;
gitlab-ctl stop # 停止所有 gitlab 组件;
gitlab-ctl restart # 重启所有 gitlab 组件;
gitlab-ctl status # 查看服务状态;
gitlab-ctl reconfigure # 启动服务;
vi /etc/gitlab/gitlab.rb # 修改默认的配置文件;
gitlab-ctl tail # 查看日志;
4 安装完成
安装完成,访问设置的IP地址,如果出现502的情况,需要再等待一会,在进入,输入用户名(root)和密码,进行登录。
在菜单 – 管理员 – 用户 – 找到自己的用户,进行修改密码。
5 设置中文




下面有确认按钮,点击确认后,进行刷新页面,界面就变成中文了。
6 修改个人密码

7 创建项目
创建空白项目

8 提交项目
使用开发工具,进行创建新项目,进行提交代码,然后刷新GitLab页面

基于docker下安装
安装文档:https://docs.gitlab.cn/jh/install/docker.html
前提安装好docker(可在云原生专栏查看对应安装文档)
1 使用容器安装gitlab
# 创建/srv/gitlab的目录
sudo mkdir -p /srv/gitlab
# 配置一个新的环境变量 $GITLAB_HOME,设置为您创建的目录的路径
export GITLAB_HOME=/srv/gitlab
# 进行安装
docker run --detach \
--hostname 127.0.0.1 (IP地址或者域名) \
--publish 443:443 --publish 80:80 \
--name gitlab \
--restart always \
--volume $GITLAB_HOME/config:/etc/gitlab:Z \
--volume $GITLAB_HOME/logs:/var/log/gitlab:Z \
--volume $GITLAB_HOME/data:/var/opt/gitlab:Z \
--shm-size 256m \
registry.gitlab.cn/omnibus/gitlab-jh:latest
2 启动容器
docker start gitlab
3 查看已存在的容器
docker ps -a
4 进入容器
# 进入容器内部
docker exec -it gitlab /bin/bash
# 查看默认的初始的密码
cat /etc/gitlab/initial_root_password
# 退出容器
exit
5 安装完成
安装完成,访问设置的IP地址,如果出现502的情况,需要再等待一会,在进入,输入用户名(root)和密码,进行登录。
在菜单 – 管理员 – 用户 – 找到自己的用户,进行修改密码。
机器2:Jenkins安装
安装前提:内存至少512MB、Java 17 以上、Maven环境、Git环境
中文版:https://www.jenkins.io/zh/
中文下载地址:https://www.jenkins.io/zh/download/
建议下载最新版本的,可以避免很多插件安装不兼容的问题。

1 安装JDK
oracle官网 https://www.oracle.com
下载包地址:https://www.oracle.com/java/technologies/downloads/archive/
# 安装jdk11,安装哪个版本与jdk有关
sudo dnf install -y java-17-openjdk-devel
# 安装完,查看版本
java -version
2 安装Maven
官网:https://maven.apache.org/download.cgi
Maven的安装,找到最新的版本,下载后复制到所在服务器解压缩就可以。
# 创建maven安装目录(maven目录)
mkdir /usr/local/maven
# 进入该目录
cd /usr/local/maven
# 将下载的本地包,上传到服务器上
# 压缩包进行解压
tar -zxvf apache-maven-3.6.1-bin.tar.gz
# 下一步,配置环境变量、修改Maven的setting.xml配置文件
# 验证是否安装成功
mvn -v
安装JDK和Maven详细步骤(可在云原生专栏查看对应安装文档)
3 安装Git
yum install git
# 查看是否成功
git
4 安装 Jenkins
# 创建jenkins(maven目录)
mkdir /usr/local/jenkins
# 进入该目录
cd /usr/local/jenkins
# 把下载好的jenkins.war(从官网下载),上传到服务器上
# 通过ls,查看是否上传成功
ls
# 查看java进程
ps -ef | grep java
# 然后进行运行该包(默认端口是8080,需要安全组开放此端口)
java -jar jenkins.war
nohup java -jar jenkins.war > /dev/null 2>&1 &
# 首次启动war包会在`/root/.jenkins/xxxx`生成配置文件,
# 初始化后的密码:(注意密码查看后会消失)
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
xxxxxx(初始密码)
# 查看密码,方式之一:
cat /root/.jenkins/secrets/initialAdminPassword
# 查看密码,方式之二:在启动页,下图可以看到密码

5 访问页面
# 1.得到初始密码后,进行访问:如:http://127.0.0.1:8080
# 2.在管理员密码,输入初始密码
# 3.在自定义Jenkins,选择安装推荐的插件【左侧】,(此时需要等待一下)
# 4.然后创建一个管理员用户
步骤1:页面访问

步骤2:安装插件
选择安装推荐的插件【左侧】,(此时需要等待一下),如果插件安装失败也没关系。
如果选择插件来安装【右侧】,再点击无,不安装任何插件,再点击安装,也可以。
步骤3:创建管理员用户
下面,在自定义Jenkins,选择安装推荐的插件【左侧】,安装完,点击继续,有一个图(输入初始化管理员密码)


步骤4:安装成功

步骤5:配置镜像地址
如果之前插件安装失败,我们需要将Jenkins插件管理切换国内源地址,按下图进行操作。
# 找到 config.xml 文件,可以通过该命令找到jenkins的存在的工作目录
find / -name config.xml
# 进行备份config.xml文件
cp /root/.jenkins/config.xml /root/.jenkins/config.xml.bak
# 进入jenkins的配置插件下载路径的目录
cd /root/.jenkins/
# 查看有哪些文件
ls
# 在.jenkins 中,找到 hudson.model.UpdateCenter.xml 文件打开
vim hudson.model.UpdateCenter.xml
# 将 https://updates.jenkins.io/update-center.json 替换成国内镜像网址(需要管理员权限修改)
# 国内镜像网址:
# https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
# https://archives.jenkins.io/updates/update-center.json
# https://repo.huaweicloud.com/jenkins/updates/update-center.json
# 国外镜像网址:https://mirror.xmission.com/jenkins/updates/update-center.json
# 再进入到 updates 目录下,
cd updates
# 查看有哪些文件
ls
# 编辑 default.json 文件,将该文件中国外的地址全部替换成国内的
vim default.json
# 将 https://www.google.com 替换成 https://www.baidu.com
# https://updates.jenkins.io/download 替换成 https://mirrors.tuna.tsinghua.edu.cn/jenkins
替换国内插件更新地址

配置完,输入地址栏:http://IP地址:8080/restart,进行重启,重启后需要一些时间,耐心等待。
6 页面配置
配置文件的位置

插件安装
Maven插件

安装完,下滑可以查看进度情况。该Maven插件需要安装。
Publish Over SSH插件

blue ocean
blue ocean – 可视化流水线界面
配置Maven
/usr/local/maven/apache-maven-3.6.1

查看构建控制台输出
# 可点击【左侧】Builds下所构建的任务
# 构件后存在的项目目录:
cd /root/.jenkins/workspace

机器3:测试服务安装
需要一台测试服务,存放Jenkins打好的jar包文件,前提需要:进行安装JDK(安装步骤与上面一致)
编写Shell脚本
# 编写脚本,在root目录下
vim cmm.sh
# 内容是:
#!/bin/bash
# 删除历史数据,cmm是存jar包的目录
rm -rf cmm
# 参数:可以通过参数,把对应的jar包文件进行运行
jar_name=$1
# 获取传入的参数
echo "arg:$1"
# 获取正在运行的jar包pid
pid=`ps -ef | grep $1 | grep 'java -jar' | awk '{printf $2}'`
echo $pid
# 如果pid为空,提示一下,否则,执行kill命令
if [ -z $pid ];
# 使用-z 做空值判断
then
echo "$jar_name not start"
else
kill -9 $pid
echo "$jar_name stoping ..."
check=`ps -ef | grep -w $pid | grep java`
if [ -z $check ];
then
echo "$jar_name pid:$pid is stop"
else
echo "$jar_name stop failed"
fi
fi
自动化部署配置
创建一个任务
按下图进行创建一个基于Maven的项目



配置Git

配置Maven
如果之前配置了maven,该页面不会出现重新配置,如果没有配置,上面具体的配置步骤。

Post Steps(后续步骤)

配置测试服务器
在全局系统配置,添加测试目标服务器,前提需要安装Publish Over SSH插件。


添加好,回到Post Steps页面,进行配置。

注意:Exec command填写、在高级,打开勾选Exec in pty、测试服务的端口需要开放。
# jar包存放目录
**/demo/target/demo*.jar
# 忽略的目录
demo/target
# 到目标服务器的目录
/cmm
# 运行jar包
nohup /usr/local/java/jdk1.8.0_202/bin/java -jar /root/cmm/demo*.jar >/root/log/demo.log 2>&1 & sleep 1
如果:Jar包很大的话传输会超时,需要在Exec timeout (ms),增加时长。
Pre Steps(前期步骤)

注意:Exec command填写、在高级,打开勾选Exec in pty、测试服务的端口需要开放。
构建触发器
需要勾选该选项,如果有相同的POM文件,不再重复构建,提升效率。

钩子自动构件项目
只要某个分支,代码有提交,进行回调Jenkins地址,进行构建该任务。
前提需要安装插件:(Build Authorization Token Root)

在该项目任务,进行勾选触发远程构建,填写token。
# 如果该服务执行以下地址,会自动执行构建任务。注意:前提需要提前登录。
http://IP地址:8080/job/first/build?token=123123
# 如果不想登录,安装上面的插件,执行下面的地址
http://IP地址:8080/buildByToken/build?job=first&token=123123
# first是该构建的任务名,token是下面配置的值

在代码仓库,找到WebHook,进行配置Jenkins回调地址,下图以Gitee为例。

定时构建
通过表达式进行配置。
Crontab 表达式地址:https://crontab.guru
- 第一个 * 表示每个小时的第几分钟,取值:0~59
H * * * * H:每小时执行一次
- 第二颗 * 表示小时,取值:0~23
* 15 * * * 表示每天下午3点 * 1 * * * 表示每天凌晨1点
- 第三颗 * 表示一个月的第几天,取值:1~31
* 1 5 * * 表示每月5日凌晨1点
- 第四颗 * 表示第几月,取值1~12
* 15 5 1 * 表示每年几月执行
- 第五颗 * 表示一周中的第几天,取值0~7,其中0和7代表的都是周日
- 其他符号
“`java / : 表示每隔多长时间, 比如 /10 * * * 表示 每隔10分钟
H : hash散列值 意义在于:不同的项目在不同的时间运行,即使配置的值是一样的,比如 都是15 * * * *
,表示每个小时的第15分钟开始执行任务,那么会造成同一时间内在Jenkins中启动很多job,换成H/15 * * * *
,那么在首次启动任务时,会有随机值参与进来,有的会在17分钟启动 有的会在19分钟启动,随后的启动时间也是这个值。这样就能错开相同cron值的任务执行了。 “`
常见的时间配置:
H * * * * 表示一小时内的任意时间
*/10 * * * * 每10分钟
H/10 * * * * 每10分钟,可能是7,17,27,起始时间hash,步长不变
20 1 * * 1-5 每个周一至周五,凌晨1点20 执行1次
20 3-5 * * 1-6 每个周一至周六,凌晨3点20 ,凌晨4点20,凌晨5点20 各执行1次
H(40-48) 3-5 * * 1-6 在40~48之间取值 其他同上

源码变更构建
这个构建是由Jenkins主动发起的,会主动定期检查代码托管服务器上是否有变化,一旦发生变化执行任务构建。

配置报告邮件通知
在系统配置:


在这里的添加,进行添加邮寄的服务器,用户名和授权密码。添加完,可在Credentials,显示该配置的人。



下面进行任务栏,配置收件人邮箱,构件失败会发送邮寄通知。

自动化部署到Docker容器中
需要一台测试服务器,需要提前安装Docker环境,
Docker相关文档:https://blog.csdn.net/yanshengren520/article/details/122018441
镜像地址:https://mirrors.tuna.tsinghua.edu.cn/
Docker相关常用命令
# 查看所有本地主机上的镜像
docker images
# 停止该容器
docker stop 容器id
# 删除容器
docker rm 容器id
# 删除镜像
docker rmi 镜像id
方式1:Docker外挂目录
在root目录下,创建jarfile目录,存放jar包文件。
# 创建jarfile目录,存放jar包文件
mkdir jarfile
# 我们将打服务的jar包文件,暂存该目录
拉取JDK镜像
docker pull openjdk:8
通过该镜像启动容器
# 启动容器
docker run -d -p 8090:8090 --name demo1 -v /root/jarfile/demo-1.0-SNAPSHOT.jar:/app.jar openjdk:8 java -jar app.jar
# 启动成功,访问该测试地址,是否可以访问成功。
http://xxxx:8090/home
下面,Jenkins配置docker外挂目录运行Jar包
Pre Steps(前期步骤)

Post Steps(后续步骤)

配置,进行重新构建任务,访问测试服务器地址,查看是否构建成功。
方式2:通过Dockerfile打成镜像
在代码中提交代码,创建docker目录,下有一个dockerfile文件,编写dockerfile文件
# 内容
FROM openjdk:8
EXPOSE 8090
WORKDIR /root
ADD jarfile/demo*.jar /root/app.jar
ENTRYPOINT ["java","-jar","/root/app.jar"]
打包dockerfile为镜像,镜像名为demo
# 该命令在Jenkins配置
docker build -t demo .
通过该镜像启动容器
# 该命令在Jenkins配置
docker run -d -p 8090:8090 --name demo1 demo
下面,Jenkins配置docker外挂目录运行Jar包
Pre Steps(前期步骤)

Post Steps(后续步骤)
填写新的(Add Transfer Set)进行配置。

