👔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
为了方便,我们使用的是root身份, 正常情况应该使用普通身份, 但要对项目有权限;
1) 准备一个gitlab仓库web-monitor
登陆gitlab网站创建一个新的项目
2) 通过Windows提交代码
2.1 windows客户端进行本地仓库与gitlab仓库的对接
2.2 将准备好的代码放入到方便实验的路径下
2.3 git-bash操作
1.首先身份验证(根据我们创建项目给予的提示进行操作)
git config --global user.name "Administrator"
git config --global user.email "admin@example.com"
2.当我们进入到monitor目录下发现自动切换到master,说明此时已经有连接到远端的仓库
我们要将旧的远端仓库删除,添加我们新创建的项目的远端仓库
查看远端仓库
git remote -v
移除远端仓库
git remote remove origin
3.通过ssh协议免密的方式添加新项目monitor的远端仓库
3.1 git-bash(windows)生产公钥对
ssh-keygen
3.2 放置在gitlab网站上,从而达到免密效果,系统会自动找到相对应的私钥与公钥进行认证
2.4.添加远程仓库的远程地址
git remote add origin git@gitlab.cry.com:dev/web-monitor.git
2.5 本地Windows通过git-bash软件,上传web_monitor的代码到远端gitlab仓库
git add .
git commit -m "web_monitor"
git push origin master
2.6 查看gitlab网页上传的代码(成功)
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仓库项目对应地址。
3.1 创建freestyle项目
3.2 配置freestyle项目
报错1:jenkins与gitlab秘钥验证失败
1.jenkins生成公钥对
ssh-keygen
2 jenkins将公钥推送到gitlab服务器对应的用户;( 用户必须得对项目有拉取权限;)
[root@jenkins ~]# cat ~/.ssh/id_rsa.pub
3 .告诉jenkins私钥是什么,这样才可以解密; Credentials
cat ~/.ssh/id_rsa
报错2: jenkins无法访问gitlab的域名,所以要配置域名解析;
[root@jenkins ~]# echo "10.0.0.110 gitlab.cry.com" >> /etc/hosts
4.立即构建,测试jenkins抓取gitlab中存储的代码
jenkins默认存放路径/var/lib/jenkins/workspace/
👔2.Jenkins实现手动发布
1.搭建Nginx+web_cluster集群
对外提供html.cry.com站点( 一般公司都Ansible运行好了)
1.配置负载均衡(5)
1.配置
[root@lb01 ~]# cat /etc/nginx/conf.d/proxy_html.cry.com.conf
upstream web {
server 172.16.1.7:80;
server 172.16.1.8:80;
}
server {
listen 80;
server_name html.cry.com;
location / {
proxy_pass http://web;
proxy_set_header Host $http_host;
}
}
2.检测
nginx -t
3.重启
systemctl restart nginx
2.配置web节点(7.8)
1.配置
[root@web01 conf.d]# cat /etc/nginx/conf.d/html.cry.com.conf
server {
listen 80;
server_name html.cry.com;
root /code/web_monitor;
location / {
index index.html;
}
}
2.检测
nginx -t
3.重启
systemctl restart nginx
3.配置本地劫持,进行访问
因为站点目录下还没有部署代码,所以报404错误,但是网站架构搭建好了
2.手动拉取代码
2.1 先克隆项目
[root@jenkins ~]# git clone git@gitlab.cry.com:dev/web-monitor.git
2.2 将代码打包
cd web-monitor
tar czf /opt/web_monitor_$(date +%F_%H).tar.gz ./*
3.手动部署代码
将jenkins打包好的代码部署到两台web节点上,通过scp的方式
3.1 免密操作
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.7
ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.8
3.2 通过scp发送到web集群节点
scp /opt/web_monitor_$(date +%F_%H).tar.gz root@172.16.1.7:/opt
scp /opt/web_monitor_$(date +%F_%H).tar.gz root@172.16.1.8:/opt
3.3 通过ssh登录到目标主机,解压,创建软连接
for i in 7 8
do
ssh root@172.16.1.$i "cd /opt && \
mkdir -p web_monitor_$(date +%F_%H) && \
tar xf web_monitor_$(date +%F_%H).tar.gz -C web_monitor_$(date +%F_%H)
rm -f /opt/web_monitor_$(date +%F_%H).tar.gz && \
rm -f /code/web_monitor && \
ln -s /opt/web_monitor_$(date +%F_%H) /code/web_monitor"
done
3.4 查看结果,成功手动部署了代码
做软连接对应应用的代码,如果有代码更新或者回退只需要重新做软连接指向应用的代码
👔3.Jenkins实现自动发布
3.1 自动发布项目架构图
3.2 自动发布项目实现思路
1.手动搭建nginx集群架构
2.开发提交代码至gitlab、手动拉取代码,并推送至web服务器组
3.将手动操作编写至Shell脚本,由Jenkins调取,并推送至web服务器组
3.3 编写上线脚本,将代码推送至Web服务器组。
1.修改项目配置
2.脚本内容
[root@jenkins ~]# cat /scripts/html_deploy.sh
#!/usr/bin/bash
Date=$(date +%F-%H)
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_monitor"
done
}
deploy (){
tar_code
scp_code
}
deploy
3.修改权限
[root@jenkins ~]# vim /etc/sysconfig/jenkins
JENKINS_USER="root"
[root@jenkins ~]# systemctl restart jenkins
查看jenkins日志
[root@jenkins ~]#tail -f /var/log/jenkins/jenkins.log
4.立即构建,自动发布
3.4 自动更新代码
如何实现全自动,开发人员提交了代码,然后自动的发布
配置Jenkins
引进触发器概念(hook钩子)
1.gitlab如果监控到push的操作通知Jenkins的地址http://jenkins.cry.com:8080/project/freestyle-web-monitor
2.gitlab通过Jenkins设置的令牌进行访问7beb318ad0999129b328f82dfb22f0b3
配置gitlab
在配置gitlab前,我们知道gitlab会通知我们指定的Jenkins路径下,所以要保证路径中的域名能够被访问到,但是我们这里使用的是假域名,所以需要配置本地hosts解析
echo "10.0.0.120 jenkins.cry.com " >> /etc/hosts
接下来先配置网络可以访问本地网络
在配置gitlab与Jenkins的触发器设置
测试
这边Jenkins的历史记录上显示的是gitlab推送过来的。
👔4.Jenkins实现版本发布
1.为什么要让项目支持tag版本方式上线?
由于之前上线方式是直接获取最新代码,那么会造成后期回退变的困难。
那如果采用tag方式,比如第一次上线v1.1、第二次上线v1.2、如果上线v1.2出现问题,那么我们可以快速回退至上一个版本v1.1。
2.实现tag版本上线方式思路
1.开发如果需要发布新版本,必须将当前的版本打上一个标签。
2.jenkins需要让其脚本支持传参,比如用户传递v1.1则拉取项目的v1.1标签
3.jenkins部署tag版本实操
0.安装Git Parameter插件
1.首先我们基于之前monitor项目进行克隆一个新的项目
2.配置项目
3.修改脚本
[root@jenkins scripts]# cat html_deploy_tags.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_monitor"
done
}
deploy (){
tar_code
scp_code
}
deploy
4.模拟开发人员修改代码,提交代码
5.立即构建,查看项目网页
👔5.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
2.发现此前部署的v1.2有很多Bug。现在想回退至v1.1版本,找到回退的job,填写回退的版本号即可。
👔6.Jenkins重复构建项目
前面我们已经实现代码按照版本的方式发布与回退了,但是还有一个问题,如果我此前部署过v1.1,如果我不小心在部署了一次v1.1还是会提示部署成功。那能否实现,部署过的版本不允许再次重复部署。
# 在此前tags部署脚本的开头加上如下判断。
#如果是部署,需要检查是否已经部署过该tag版本,如果部署过则不允许重复构建
if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
echo ""
echo "你已经成功部署过 ${GIT_COMMIT} 他对应的Tags ${git_version}"
echo "请不要尝试无需重复部署." && exit 1
echo ""
fi