1.能不能全自动,开发提交了代码, 然后自动的发布; [测试环境] --> 没有问题 --> tag标记
1.jenkins的通知地址:
http://jenkins.oldxu.com:8080/project/freestyle-web-monitor-deploy
2.jenkins生成token令牌
0438799ca21015045d3a769bc4d19f9b
3.登录gitlab
1.管理中心-->设置-->网络设置-->外发请求-->允许钩子和服务访问本地网络 ( 勾选上 )
2.在gitlab节点服务器上配置Jenkins的DNS解析
4.找到对应的项目
设置-->集成-->
链接--> ( jenkins的通知地址 )
令牌--> ( jenkins针对项目生成的toiken令牌 )
2.能不能基于某个指定tag进行发布; 每次都是发布, 基于tag方式发布 [ 生产环境 ]
3.出现故障, 如何回滚; 代码:
1.登录目标集群
2.摘掉节点; ---> nginx不支持; haproxy;
2.删除软链接;
3.重建软链接;
4.重启,php;
5.加入节点; ---> nginx不支持; haproxy
本章课程内容大纲
1.Jenkins如何集成gitlab
1.Jenkins为什么要集成Gitlab
2.Jenkins如何集成Gitlab
3.Jenkins与Gitlab集成思路
4.Jenkins与Gitlab集成实践
2.Jenkins实现项目自动化发布
3.Jenkins实现项目tag方式发布
4.Jenkins实现项目tag发布与回退
5.Jenkins解决项目能重复发布问题
1.Jenkins实现Gitlab集成
1.Jenkins为什么要集成Gitlab
因为我们需要依托jenkins将gitlab上的项目获取至本地,为后续网站的的代码发布工作做好准备。
2.Jenkins如何集成Gitlab
由于jenkins只是一个调度平台,所有需要安装与gitlab相关的插件即可完成集成。
3.Jenkins与Gitlab集成思路
1.开发提交代码至Gitlab
2.jenkins安装gitlab所需插件
3.jenkins创建freestyle项目,然后配置gitlab仓库项目对应地址。
4.Jenkins与Gitlab集成实践
1.切换至gitlab服务,然后导入项目代码。( PS: 当然也可以自己创建项目。)监控平台代码url
2.Jenkins安装与gitlab关联的插件
插件名称 | 插件作用 |
---|---|
Credentials Plugin | 允许在Jenkins中存储认证的凭据 |
Git Client Plugin | 允许Jenkins使用Git |
Git Plugin | 允许Jenkins集成Git |
Gitlab Plugin | 允许Gitlab触发Jenkins构建并在Gitlab中显示 |
GitLab Hook | 允许 gitlab 自动触发 jenkins 构建项目 |
Gitlab Authentication plugin | gitlab 身份验证插件 |
3.jenkins配置freestyle,配置gitlab仓库代码地址
1)创建freestyle项目
2)在jenkins中填写gitlab项目地址。
PS: Jenkins服务器如果无法下载gitlab项目,需要点击添加–>新增凭据。
3)jenkins需要访问gitlab项目,则需要与gitlab建立信任。首先登陆Jenkins服务器,然后通过ssh-keygen生成一对秘钥。
4)然后将Jenkins服务器生成的公钥添加上gitlab服务器。
5)然后回到jenkins添加秘钥处,将root用户生成的私钥添加至Jenkins服务器上。至此就完成了公钥加密,私钥解密。此时jenkins就能正常访问gitlab项目。
6)选择对应的凭据,再次检查是否存在报错提示。如果没有点击保存即可。
7)最后点击构建,然后查看构建的输出信息是否有错误提示。
8)构建成功后,代码会被下载至Jenkins本地/var/log/jenkins/workspace目录下。
2.Jenkins实现自动发布
1.自动发布项目架构图
![](/qrcode.jpg)
2.自动发布项目实现思路
1.手动搭建nginx集群架构
2.开发提交代码至gitlab、手动拉取代码,并推送至web服务器组
3.将手动操作编写至Shell脚本,由Jenkins调取,并推送至web服务器组
3.编写上线脚本,将代码推送至Web服务器组。
1.配置jenkins构建发布脚本
2.发布脚本如下
[root@jenkins ~]# cat /scripts/html_deploy.sh
#!/usr/bin/bash
Date=$(date +%F-%H-%M)
Pkg_Name=web_monitor_${Date}
Web_Dir=/opt
Web_Server="172.16.1.7 172.16.1.8"
tar_code () {
#1.进入到代码的目录下($WORKSPACE)
#2.打包存放至本地jenkins服务器的/opt
cd $WORKSPACE && \
tar czf ${Web_Dir}/${Pkg_Name}.tar.gz ./*
}
scp_code() {
#3.使用scp将代码包分发至web集群
#4.通过ssh命令登录web集群主机,执行目录创建,解压,软件连接等操作
for i in ${Web_Server}
do
scp -rp ${Web_Dir}/${Pkg_Name}.tar.gz root@${i}:${Web_Dir}
ssh root@${i} "cd ${Web_Dir} && \
mkdir ${Pkg_Name} -p && \
tar xf ${Pkg_Name}.tar.gz -C ${Pkg_Name} && \
rm -f ${Web_Dir}/${Pkg_Name}.tar.gz && \
rm -f /code/web && \
ln -s ${Web_Dir}/${Pkg_Name} /code/web"
done
}
deploy (){
tar_code
scp_code
}
deploy
3.尝试修改一下代码的内容,然后提交至gitlab服务器。最后点击Jenkins构建操作,检查网站是否会更新成功。
3.Jenkins实现版本发布
1.为什么要让项目支持tag版本方式上线?
由于之前上线方式是直接获取最新代码,那么会造成后期回退变的困难。
那如果采用tag方式,比如第一次上线v1.1、第二次上线v1.2、如果上线v1.2出现问题,那么我们可以快速回退至上一个版本v1.1。
2.实现tag版本上线方式思路
1.开发如果需要发布新版本,必须将当前的版本打上一个标签。
2.jenkins需要让其脚本支持传参,比如用户传递v1.1则拉取项目的v1.1标签
3.实战Jenkins部署tag版本
1.首先安装Git Parameter插件,然后配置Jenkins参数化构建,让用户在构建时选择对应的tag版本。
2.配置Jenkins源码管理
3.修改Jenkins发布脚本,让其脚本支持用户传入的参数。
4.jenkins发布脚本,整体文件如下。
[root@jenkins ~]# cat /scripts/html_deploy_tag.sh
#!/usr/bin/bash
Date=$(date +%F-%H-%M)
Pkg_Name=web_monitor_${Date}_${git_version}
Web_Dir=/opt
Web_Server="172.16.1.7 172.16.1.8"
tar_code () {
#1.进入到代码的目录下($WORKSPACE)
#2.打包存放至本地jenkins服务器的/opt
cd $WORKSPACE && \
tar czf ${Web_Dir}/${Pkg_Name}.tar.gz ./*
}
scp_code() {
#3.使用scp将代码包分发至web集群
#4.通过ssh命令登录web集群主机,执行目录创建,解压,软件连接等操作
for i in ${Web_Server}
do
scp -rp ${Web_Dir}/${Pkg_Name}.tar.gz root@${i}:${Web_Dir}
ssh root@${i} "cd ${Web_Dir} && \
mkdir ${Pkg_Name} -p && \
tar xf ${Pkg_Name}.tar.gz -C ${Pkg_Name} && \
rm -f /code/web && \
ln -s ${Web_Dir}/${Pkg_Name} /code/web"
done
}
deploy (){
tar_code
scp_code
}
deploy
3.发现此前部署的v1.2有很多Bug。现在想回退至v1.1版本,找到回退的job,填写回退的版本号即可。
4.登陆web服务器,查看代码是否更新成功。
5.通过浏览器访问项目网站,检查是否更新为修改后的版本
4.Jenkins实现版本回滚
1.在Jenkins添加一个freestyle的job,配置配置文本的参数化构建,最后编写脚本实现回滚功能。
[root@jenkins scripts]# cat html_rollback_tag.sh
[root@jenkins scripts]# cat /scripts/html_rollback.sh
#!/usr/bin/bash
# 回退脚本
# 1.登陆目标集群服务
# 2.删除软连接、重建软连接
Date=$(date +%F-%H-%M)
Web_Name=web-monitor-${Date}
Web_Dir=/opt
Web_Server="172.16.1.7 172.16.1.8"
for host in ${Web_Server}
do
ssh root@${host} "if [ -d ${Web_Dir}/web-monitor-*_${git_version} ];then
rm -f /web
ln -s ${Web_Dir}/web-monitor-*_${git_version} /web
echo "web-monitor 项目回退至 ${git_version} 版本成功"
else
echo "版本填写错误,退出"
exit 1
fi"
done
前面我们已经实现代码按照版本的方式发布与回退了,但是还有一个问题,如果我此前部署过v1.1,如果我不小心在部署了一次v1.1还是会提示部署成功。那能否实现,部署过的版本不允许再次重复部署
测试重复构建同一个版本会出现什么情况呢?