Jenkins
一. Jenkins概括
1.Jenkins 是什么?
Jenkins是一款开源 CI&CD 软件,用于自动化各种任务,包括构建、测试和部署软件。
Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。
2.为什么要使用Jenkins?
Jenkins能将各种开源的软件集成为一体,从而实现不同功能的调度工作。
二.Jenkins安装部署
安装Jenkins只需要简单几步即可完成。PS:Jenkins的安装方式有很多。可参考Jenkins官网安装文档
1.Jenkin下载
#安装java环境,Jenkins是由java语言编写
[root@jenkins ~]# yum install java -y
[root@jenkins ~]# yum localinstall jenkins-2.176.1-1.1.noarch.rpm -y
[root@jenkins ~]# systemctl start jenkins
[root@jenkins ~]# netstat -lntp
PS:rpm包可在清华镜像源下载,https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/(Jenkins官网下载源在美国,可能会被墙)
2.配置windows的Host解析
10.0.0.120 jenkins.zhangxianwei.com
3.解锁Jenkins
[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
4.访问Jenkins
http://jenkins.zhangxianwei.com:8080/
5.自定义Jenkins插件
1)如果网络较好,同时你不清楚要安装哪些插件,通常选择 推荐的插件。
2)网络较差,而且对jenkins比较熟悉,建议自定义选择插件。
3)什么都不选, 简单的说就是一个插件都不安装 ,直接点击左上角关闭这一步跳过它。
6.跳过插件后,直接进入了Jenkins系统
- 用户:admin
密码:初始密码存放在Jenkins的文件中
cat /var/lib/jenkins/secrets/initialAdminPassword
2)修改初始密码
进入后台后点击右上角admin—>configure–>Password
7.Jenkins文件详解
[root@oldboy62 opt]# rpm -ql jenkins
/etc/init.d/jenkins #systemctl管理启动
/etc/logrotate.d/jenkins#日志切割
/etc/sysconfig/jenkins #jenkins主配置文件
/usr/lib/jenkins/plugins #放置所有插件的地方
/usr/lib/jenkins/jenkins.war
/usr/sbin/rcjenkins
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
三.Jenkins的插件管理?
1)在安装插件过程中如何加速?
清华源
2)通过web页面上传.hpi文件经行插件安装
https://mirror.tuna.tsinghua.edu.cn/jenkins/plugins/
或者
https://plugins.jenkins.io
3)导入之前服务器已安装的插件 (离线安装)。
[root@jenkins ~]# tar xf jenkins_2.176_plugins.tar.gz
[root@jenkins ~]# cp -rp plugins/* /var/lib/jenkins/plugins/
[root@jenkins ~]# chown -R jenkins.jenkins /var/lib/jenkins/plugins/
[root@jenkins ~]# systemctl restart jenkins
四.Jenkins自动化使用
1.Jenkins与Gitlab如何集成?
Jenkins新建freestyle项目,然后配置gitlab仓库项目对应地址。将jenkins服务器的公钥分给gitlab的用户,再将jenkins服务器的私钥填写给Jenkins的web界面,添加Jenkins凭证。这样Jenkins就有权限到gitlab拉去代码。
将jenkins服务器的私钥添加给jenkins的web界面
2.使用jenkins来实现自动化的代码上线
1)commit方式
1.Jenkins需要拉取gitlab上的仓库代码。
2.Jenkins需要将拉去下来的代码推送至web集群 (手动或者shell)
脚本如下(包括代码tag标签上线代码,代码回滚,代码重发发布功能):
[root@oldboy62 ~]# cat /server/scripts/deploy_html.sh
#!/usr/bin/bash
# func: deploy auto html
WEB_SERVER="172.16.1.7 172.16.1.9"
WEB_DIR="/code"
DATE=$(date +%F-%H-%M)
#1.打包代码
tar_code() {
cd ${WORKSPACE} && \
tar czf /opt/monitor-${DATE}.tar.gz ./*
}
#2.推送代码
scp_push_code() {
for host in $WEB_SERVER
do
scp -rp /opt/monitor-${DATE}.tar.gz root@$host:/opt
done
rm -f /opt/monitor-${DATE}.tar.gz
for host in $WEB_SERVER
do
ssh root@$host "cd $WEB_DIR && mkdir monitor-${DATE} -p && \
tar xf /opt/monitor-${DATE}.tar.gz -C $WEB_DIR/monitor-${DATE} && \
rm -f /opt/monitor-${DATE}.tar.gz && \
rm -f /code/monitor && \
ln -s /code/monitor-${DATE} /code/monitor"
done
}
#3.调用
deploy () {
tar_code
scp_push_code
}
deploy
步骤如下:
继Jenkins与gitlab集成后
2)tag标签方式代码自动上线
这里需要脚本支持进行传递参数 jenkins的参数化构建。
下面是重点难点
将构建的参数传递给shell脚本使用
脚本如下:
[root@oldboy62 ~]# cat /server/scripts/deploy_html_tag.sh
#!/usr/bin/bash
# func: deploy auto html
WEB_SERVER="172.16.1.7"
WEB_DIR="/usr/share/nginx"
DATE=$(date +%F-%H-%M)
#1.打包代码
tar_code() {
cd ${WORKSPACE} && \
tar czf /opt/monitor-${DATE}-${git_version}.tar.gz ./*
}
#2.推送代码
scp_push_code() {
for host in $WEB_SERVER
do
scp -rp /opt/monitor-${DATE}-${git_version}.tar.gz root@$host:/opt
ssh root@$host "cd $WEB_DIR && mkdir monitor-${DATE}-${git_version} -p && \
tar xf /opt/monitor-${DATE}-${git_version}.tar.gz -C $WEB_DIR/monitor-${DATE}-${git_version} && \
rm -f /opt/monitor-${DATE}-${git_version}.tar.gz && \
rm -f /code/monitor && \
ln -s $WEB_DIR/monitor-${DATE}-${git_version} $WEB_DIR/monitor"
done
}
#3.调用
deploy () {
tar_code
scp_push_code
}
deploy
3. Jenkins实现项目tag发布与回退
思路:1.添加一个选项参数构建:deploy_env
2.编写shell脚本:
如果传递的字符串是deploy就调用deploy的函数
如果传递的字符串是rollback就调用back函数执行回退
3.back函数怎么写?
1)获取要退回的版本的站点目录路径
2)删除软链接
3)重新创建软链接,将软链接指向要回退的版本的站点目录
脚本:
[root@oldboy62 ~]# cat /server/scripts/deploy_html_tag_rollback.sh
#!/usr/bin/bash
# func: deploy auto html
WEB_SERVER="172.16.1.7"
WEB_DIR="/usr/share/nginx"
DATE=$(date +%F-%H-%M)
#1.打包代码
tar_code() {
cd ${WORKSPACE} && \
tar czf /opt/monitor-${DATE}-${git_version}.tar.gz ./*
}
#2.推送代码
scp_push_code() {
for host in $WEB_SERVER
do
scp -rp /opt/monitor-${DATE}-${git_version}.tar.gz root@$host:/opt
ssh root@$host "cd $WEB_DIR && mkdir monitor-${DATE}-${git_version} -p && \
tar xf /opt/monitor-${DATE}-${git_version}.tar.gz -C $WEB_DIR/monitor-${DATE}-${git_version} && \
rm -f /opt/monitor-${DATE}-${git_version}.tar.gz && \
rm -f $WEB_DIR/monitor && \
ln -s $WEB_DIR/monitor-${DATE}-${git_version} $WEB_DIR/monitor"
done
}
back () {
back_file=$(ssh [email protected] "find ${WEB_DIR} -maxdepth 1 -name "monitor-*-${git_version}"")
for host in $WEB_SERVER
do
ssh root@$host "rm -f $WEB_DIR/monitor && \
ln -s "$back_file" $WEB_DIR/monitor"
done
}
#3.调用
deploy () {
tar_code
scp_push_code
}
if [ $deploy_env == "deploy" ];then
#避免重复发布
if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then
echo "此 $git_version 版本已经部署过,无需重复部署."
exit 1
else
deploy
fi
elif [ $deploy_env == "rollback" ];then
back
fi
4.7.Jenkins解决项目能重复发布问题
利用参数jenkins的参数
$GIT_COMMIT :当前tag对应的commit的哈希值
$GIT_PREVIOUS_SUCCESSFUL_COMMIT:已经发布过的版本的commit哈希值
思路:通过条件$GIT_COMMIT = $GIT_PREVIOUS_SUCCESSFUL_COMMIT是否相等来决定是否执行deploy函数。
it_version 版本已经部署过,无需重复部署."
exit 1
else
deploy
fi
elif [ $deploy_env == “rollback” ];then
back
fi
#### 4.7.Jenkins解决项目能重复发布问题
利用参数jenkins的参数
$GIT_COMMIT :当前tag对应的commit的哈希值
$GIT_PREVIOUS_SUCCESSFUL_COMMIT:已经发布过的版本的commit哈希值
思路:通过条件$GIT_COMMIT = $GIT_PREVIOUS_SUCCESSFUL_COMMIT是否相等来决定是否执行deploy函数。