Jenkins+Gitlab+Nginx发布与回退基于tag的项目(解决重复构建)
lipiwang 2024-10-23 13:57 17 浏览 0 评论
环境拓扑:
?Jenkins -192.168.1.30
?Gitlab -192.168.1.31
?LB -192.168.1.32
?Nginx1 -192.168.1.33
?Nginx2 -192.168.1.34
一、Jenkins集成Gitlab并实现自动发布项目
- Jenkins为什么要集成Gitlab
?因为我们需要依托jenkins将gitlab上的项目获取至本地,为后续网站的的代码发布工作做好准备。
- Jenkins如何集成Gitlab
?由于enkins只是一个调度平台,所有需要安装与gitlab相关的插件即可完成集成。
1.开发提交代码至Gitlab
?-准备好项目代码上传至服务器
--永久关闭防火墙和Selinux
[root@Jenkins/Gitlab/LB/Web1/Web2 ~]# systemctl disable firewalld
[root@Jenkins/Gitlab/LB/Web1/Web2 ~]# systemctl stop firewalld
[root@Jenkins/Gitlab/LB/Web1/Web2 ~]# setenforce 0
[root@Jenkins/Gitlab/LB/Web1/Web2 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@Jenkins/Gitlab/LB/Web1/Web2 ~]# getenforce
[root@Gitlab ~]# ll
-rw-r--r-- 1 root root 1091072 3月 7 03:47 nongye-demo.tar
[root@Gitlab ~]# tar -xf nongye-demo.tar
[root@Gitlab ~]# ls
gitlab-12-0-stable-zh gitlab-ce-12.0.3-ce.0.el7.x86_64.rpm nongye-demo
gitlab-12-0-stable-zh.tar.gz my-web nongye-demo.tar
[root@Gitlab ~]# cd nongye-demo
[root@Gitlab nongye-demo]# ls
css fonts images index.html js
?-创建并配置项目
-按照Gitlab指示关联本地与远程仓库并推送代码到项目
[root@Gitlab nongye-demo]# git init
初始化空的 Git 版本库于 /root/nongye-demo/.git/
[root@Gitlab nongye-demo]# git remote add origin git@gitlab.fzmyw.com:devops/nongye-demo.git
[root@Gitlab nongye-demo]# git remote -v
origin git@gitlab.fzmyw.com:devops/nongye-demo.git (fetch)
origin git@gitlab.fzmyw.com:devops/nongye-demo.git (push)
[root@Gitlab nongye-demo]# git add .
[root@Gitlab nongye-demo]# git commit -m "第一次提交nongye-demo代码"
[master(根提交) c8c49d3] 第一次提交nongye-demo代码
33 files changed, 11782 insertions(+)
create mode 100755 css/bootstrap.css
create mode 100755 css/style.css
create mode 100755 css/swipebox.css
create mode 100755 fonts/glyphicons-halflings-regular.woff
create mode 100755 fonts/glyphicons-halflings-regular.woff2
create mode 100755 images/banner.jpg
create mode 100755 images/g1.jpg
create mode 100755 images/g2.jpg
create mode 100755 images/g3.jpg
create mode 100755 images/g4.jpg
create mode 100755 images/g5.jpg
create mode 100755 images/g6.jpg
create mode 100755 images/g7.jpg
create mode 100755 images/g8.jpg
create mode 100755 images/icons.png
create mode 100755 images/icons.svg
create mode 100755 images/img1.jpg
create mode 100755 images/move-up.png
create mode 100755 images/slid.jpg
create mode 100755 images/social-icons.png
create mode 100755 images/t1.jpg
create mode 100755 images/t2.jpg
create mode 100755 images/t3.jpg
create mode 100755 images/t4.jpg
create mode 100755 index.html
create mode 100755 js/bars.js
create mode 100755 js/bootstrap.js
create mode 100755 js/easing.js
create mode 100755 js/easyResponsiveTabs.js
create mode 100755 js/jquery-1.11.1.min.js
create mode 100755 js/jquery.swipebox.min.js
create mode 100755 js/move-top.js
create mode 100755 js/responsiveslides.min.js
[root@Gitlab nongye-demo]# git push origin -u master
Counting objects: 39, done.
Compressing objects: 100% (39/39), done.
Writing objects: 100% (39/39), 721.53 KiB | 0 bytes/s, done.
Total 39 (delta 1), reused 0 (delta 0)
To git@gitlab.fzmyw.com:devops/nongye-demo.git
* [new branch] master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。
2.Jenkins安装Gitlab所需插件
3.Jenkins创建freestyle项目,然后配置Gitlab仓库项目对应地址。
-配置Jenkins对Gitlab域名解析
[root@Jenkins ~]# echo 192.168.1.31 gitlab.fzmyw.com >> /etc/hosts
-Jenkins主机安装Git命令
[root@Jenkins ~]# yum -y install git
4.Jenkins与Gitlab集成实践
-将Jenkins服务器的公钥放到Gitlab服务器上,实现Linux上免密克隆项目(Jenkins项目要免密拉取Gitlab代码还需要配置Jenkins凭证)
[root@Jenkins ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:IlC1Xs6j1H0dz6o8qREJWvMOrxkzy0W1e4bD6vFkqQI root@Jenkins
The key's randomart image is:
+---[RSA 2048]----+
| ... |
| . . |
| . . = . . |
| . . B = o o + |
| . = S * o . o|
| oEo * + + . |
| ..+ * O.+ |
| ..O Xo= |
| =o=.+. |
+----[SHA256]-----+
[root@Jenkins ~]# ls /root/.ssh/
id_rsa id_rsa.pub known_hosts
[root@Jenkins ~]# cat /root/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRiweSF/50lxX7GKzyqq0FcT3i9GeMt2kaJXYZmKbKVk6qqqkQ7BUo1K65uiAUW2Bt70QBsbrciMzEDTnbspdaeAMd9pRPIeUsFIVG77cchAz2pvrokQolrWYF4cVMdeIyoOxhCHZzxrsPbrDFUWjcQYtl82/+ASbF6+3VFSUmjw68h1hhWAg0S/gJ9jhxC9lEDRs9/g1SB74G65JTf8wLMJgYFvMY1snsAbKgPcSUG20n/ErvPR+u9ZyB39Ri32dhqQcwWneyTxP/LzIRN/v9QPNjwICc9jkfbgFhmQ7SSlLgcyf2OnyjbY4uo38UGE8S0TYAtUrIWzLp/WFKfzXP root@Jenkins
-将Jenkins服务器的私钥配置成一个Jenkins凭据,实现Jenkins项目免密拉取Gitlab代码
?因为上面我们已经将Jenkins的公钥配置到了Gitlab的root用户SSH密钥配置中,现在Jenkins上的项目要去Gitlab拉取代码,需要再将Jenkins本机的私钥内容添加到Jenkins凭据中并在项目Git连接配置栏指定该私钥,即可完成认证(公钥-私钥)并免密连接拉取代码!
[root@Jenkins ~]# cat /root/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA0YsHkhf+dJcV+xis8qqtBXE94vRnjLdpGiV2GZimylZOqqqp
EOwVKNSuubogFFtgbe9EAbG63IjMxA0527KXWngDHfaUTyHlLBSFRu+3HIQM9qb6
6JEKJa1mBeHFTHXiMqDsYQh2c8a7D26wxVFo3EGLZfNv/gEmxevt1RUlJo8OvIdY
YVgINEv4CfY4cQvZRA0bPf4NUge+BuuSU3/MCzCYGBbzGNbJ7AGyoD3ElBttJ/xK
7z0frvWcgd/UYt9nYakHMFp3sk8T/y8yETf7/UDzY8CAnPY5H24BYZkO0kpS4HMn
9jp8o22OLqN/FBhPEtE2ALVKyFsy6f1hSn81zwIDAQABAoIBACB1kO6omNomrVkA
MYpFthepuxR1F7VMlBNgyjKc2vls9TKqzRW5/G0exRIwKtf8b6uX7Mj2ZyPSbSXR
hqzptVhmTtVNZRv8/Csf4qVibNMWAYwTwbpU/WVovu0aVB3MBQYit3swfGji2AdD
9k4alkvIO3fHhgmq0/7E1Uq0w9R8/KaaLNstHi0EYBSqUzFnNPTkw7Jtc+hMaXwh
kiwdIhnwImrCV9M5Gte4lIYIpHmcKJ9o8/ie6f+/amicujQpPiThtm/TwKdXZKtw
U0IN3HaR6RKy1IPOhx9sYltwdWN8YEGkyM//zP7ETVrIuUhJ2iHSoECNivV0I/xK
Ou2YgwECgYEA+vnikyY9ciD215p+vYByFeciAfS+g3BSK3GWHxNF3UipDlyg3/BX
IqhQFknRR/uAIwcc6DfcOhd6KUKKSfXoLbvqhfMHDD4ftTIr8006mvQpn3sG49Vn
EWRaC+sWLBPyOPTpp5fZ76wHyCkjVKlUhQAZxainkxZ70kRGeBz+OZECgYEA1bzS
rbHgDKQc6ovZumRV0fxyPtQ2tE1tTpXcp47rgNalfIvvDMObvj3B2BXwwr4c8rAQ
UlYR8/LU9y41ZOF7GdIhEaRbRnVk7il7guQ9Kg1eWNYRL0XEim4hBtEEyAPl01z8
bXyfKfOIKoIEzcu4Or/iwl6QjdxCZHgq7WslyV8CgYBxwKC5ITPobphy0EtxiK4s
zz3StSNEX7xehHUOUKXxzeUR5VnlJgHYa4EhGQQKJCvHtImdlvPyQIHWAZq8OwCo
+esqGySun9mvPrY86FwPr2rOJezRhv/YGivWCw9ZmxDGT/s3QtQ8lTRRvJOO49Cz
F4CW3gJV4HLuspNeDYYMgQKBgQDAF5fw63BFbClg0pe34P0QYCX9OZSAryWR/zX0
kYounLrWGJ2bhyGt9KsGnZFoNJynsHy6wwgXiyLDlBAAvnV4W1XFGUW/KTqwoS+U
D7S42pL0nE+NgNKG5ztfePMnH/mp4GQtslcJyQmTyo6utmy4wEP4FC0ukcpJqYZL
IoUvWQKBgQCDZUIuwJok/KLrFosAB4CyDA7VtbbRCPmTN7F2tULsZlg3advoTOJ4
5XjTamMUxS9aB5FXM0OfjQYW2uEE+dtFksNyDr0xZdbdnirowdtUsIcvIhD8L14D
lrKuJznwrioaee2Y7gWMGBuvAMMRfPRnflLdu4I7XiLoqorSGMUzPg==
-----END RSA PRIVATE KEY-----
-只测试Jenkins项目拉取Gitlab代码,暂时不做其他配置
[root@Jenkins ~]# ls /var/lib/jenkins/workspace/ #查看Jenkins工作目录
freestyle-nongye freestyle-nongye@tmp
[root@Jenkins ~]# ll #项目代码都在下面
总用量 214052
-rw-r--r-- 1 root root 77080368 3月 8 10:53 jenkins-2.176-1.1.noarch.rpm
-rw-r--r--. 1 root root 71679711 3月 6 02:53 jenkins-2.283-1.1.noarch.rpm
-rw-r--r-- 1 root root 70422599 3月 8 10:53 jenkins-2.60.3-1.1.noarch.rpm
[root@Jenkins ~]# ll /var/lib/jenkins/workspace/freestyle-nongye
总用量 416
drwxr-xr-x 2 jenkins jenkins 64 3月 8 23:03 css
drwxr-xr-x 2 jenkins jenkins 89 3月 8 23:03 fonts
-rw-r--r-- 1 jenkins jenkins 34700 3月 8 23:03 g1.jpg
-rw-r--r-- 1 jenkins jenkins 33354 3月 8 23:03 g2.jpg
-rw-r--r-- 1 jenkins jenkins 28677 3月 8 23:03 g3-1646724756761.jpg
-rw-r--r-- 1 jenkins jenkins 28677 3月 8 23:03 g3.jpg
-rw-r--r-- 1 jenkins jenkins 55980 3月 8 23:03 g4.jpg
-rw-r--r-- 1 jenkins jenkins 30487 3月 8 23:03 g5-1646724774424.jpg
-rw-r--r-- 1 jenkins jenkins 30487 3月 8 23:03 g5-1646724779175.jpg
-rw-r--r-- 1 jenkins jenkins 30487 3月 8 23:03 g5.jpg
drwxr-xr-x 2 jenkins jenkins 301 3月 8 23:03 images
-rwxr-xr-x 1 jenkins jenkins 32046 3月 8 23:03 index.html
drwxr-xr-x 2 jenkins jenkins 195 3月 8 23:03 js
-rw-r--r-- 1 jenkins jenkins 142 3月 8 23:03 README.md
-rw-r--r-- 1 jenkins jenkins 90503 3月 8 23:03 slid.jpg
5.Jenkins实现项目自动化发布
1.手动搭建Nginx集群架构
-后端集群(LB、Web1、Web2)都需安装Nginx
?Nginx的安装与平滑升级(详):https://blog.csdn.net/…
-LB负载均衡主机
[root@LB ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
[root@LB ~]# vim /usr/local/nginx/conf/nginx.conf
...
#gzip on;
upstream html { #负载均衡配置
server 192.168.1.33:80;
server 192.168.1.34:80;
}
server {
listen 80;
server_name html.fzmyw.com; #域名(测试域名,需要配置好域名解析)
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://html; #负载均衡转发配置
proxy_set_header Host $http_host;
}
...
[root@LB ~]# /usr/local/nginx/sbin/nginx -t #验证nginx配置文件有无错误
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@LB ~]# /usr/local/nginx/sbin/nginx -s reload #平滑重启nginx
-Nginx1主机
[root@Web1 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
[root@Web1 ~]# vim /usr/local/nginx/conf/nginx.conf
...
#gzip on;
server {
listen 80;
server_name html.fzmyw.com; #域名(测试域名,需要配置好域名解析)
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html/code/web; #项目网站代码存放路径(除了nginx自带的html目录下,其他路径必须是写绝对路径)
index index.html index.htm;
}
...
[root@Web1 ~]# /usr/local/nginx/sbin/nginx -t
[root@Web1 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@Web1 html]# pwd
/usr/local/nginx/html
[root@Web1 html]# mkdir -p code/web
[root@Web1 html]# ls code/
web
-Nginx2主机
[root@Web2 ~]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.16.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
[root@Web2 ~]# vim /usr/local/nginx/conf/nginx.conf
...
#gzip on;
server {
listen 80;
server_name html.fzmyw.com; #域名(测试域名,需要配置好域名解析)
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html/code/web; #项目网站代码存放路径(除了nginx自带的html目录下,其他路径必须是写绝对路径)
index index.html index.htm;
}
...
[root@Web2 ~]# /usr/local/nginx/sbin/nginx -t
[root@Web2 ~]# /usr/local/nginx/sbin/nginx -s reload
[root@Web2 html]# pwd
/usr/local/nginx/html
[root@Web2 html]# mkdir -p code/web
[root@Web2 html]# ls code/
web
6.手动编写Shell上线脚本,由Jenkins调用,拉取Gitlab代码并推送至Web服务器组实现项目上线
-配置Jenkins主机与后端Web集群组免密钥连接
[root@Jenkins ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.33
[root@Jenkins ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.34
-编写上线脚本
[root@Jenkins ~]# mkdir shell
[root@Jenkins ~]# vim shell/html_depoly.sh
#!/sbin/bin/bash
DATE=$(date +%Y-%m-%d-%H-%M-%S) #定义时间戳变量
WEB="192.168.1.33 192.168.1.34" #定义后端集群组
CODE="/usr/local/nginx/html/code" #定义后端项目代码存放路径
Sdir="/opt" #定义项目tar包中转路径
#思路:
#1.Jenkins将Gitlab代码拉取至工作目录后,需先将项目代码打包
get_code() {
tar -czf $Sdir/web-${DATE}.tar.gz -C $WORKSPACE . #最后的WORKSPACE变量是直接调用的Jenkins的环境变量(即Jenkins中当前项目的工作目录),在添加执行Shell处可查看可调用的环境变量
}
#2.再scp将打好包的项目代码拷贝至Web后端集群项目文件夹中
scp_web_server() {
for i in ${WEB}
do
scp $Sdir/web-${DATE}.tar.gz root@$i:$Sdir #将打包好的项目tar包发送至后端集群组/opt目录
ssh root@$i "mkdir -p $CODE/web-${DATE} && \ #在后端集群项目代码存放路径创建当前项目时间戳目录,方便后期回滚(使用时删掉注释)
tar -xf $Sdir/web-${DATE}.tar.gz -C $CODE/web-${DATE} #将带时间戳的项目包解压至后端集群组代码存放目录下
rm -rf $CODE/web && \ #删除当前的在运行的项目代码文件夹(或者移走备份)
ln -s $CODE/web-${DATE} $CODE/web" #将新的项目代码文件夹设置软链接到后端集群项目代码读取目录
done
}
deploy() {
get_code
scp_web_server #将两个函数定义在一起
}
deploy #执行函数
-修改Jenkins启动用户为root(避免各种权限问题)
[root@Jenkins ~]# vim /etc/sysconfig/jenkins
...
#JENKINS_USER="jenkins"
JENKINS_USER="root" #修改启动Jenkins用户为root
...
[root@Jenkins ~]# systemctl restart jenkins
[root@Jenkins shell]# ps -aux |grep jenkins
root 44189 58.4 12.6 2688564 259068 ? Ssl 01:30 0:38 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
root 44352 0.0 0.0 112720 980 pts/1 R+ 01:31 0:00 grep --color=auto jenkins
-配置Jenkins构建发布脚本
-Jenkins立即构建项目,实现上线
Windows访问时需配置域名解析
查看后端集群服务器上代码目录
?可以看到当前项目运行代码目录web软链接到了下面最新的web-2022-03-09-06-23-19代码目录。
[root@Web1 code]# pwd
/usr/local/nginx/html/code
[root@Web1 code]# ll
总用量 0
lrwxrwxrwx 1 root root 50 3月 9 16:01 web -> /usr/local/nginx/html/code/web-2022-03-09-06-23-19 #可以看到当前项目运行代码目录软链接到了下面最新的一个代码目录
drwxr-xr-x 7 997 995 271 3月 9 04:54 web-2022-03-09-05-58-31
drwxr-xr-x 7 997 995 271 3月 9 04:54 web-2022-03-09-06-23-19
问题:项目需要回退版本怎么办?
二、Jenkins实现项目tag版本方式发布
- 为什么要让项目支持tag版本方式上线?
?由于之前上线方式是直接获取最新代码,那么会造成后期回退变的困难。那如果采用ag方式,比如第一次上线v1.1、第二次上线v1.2、如果上线v1.2出现问题,那么我们可以快速回退至上一个版本v1.1。
- 实现tag版本上线方式思路
- 1.开发如果需要发布新版本,必须将当前的版本打上一个标签。
- 2.Jenkins需要让其脚本支持传参,比如用户传递v1.1则拉取项目的v1.1标签的代码。
1.首先安装Git Parameter插件,然后配置Jenkins参数化构建,让用户在构建时可以选择对应的tag版本。
2.修改代码,开发将提交至Gitlab上的代码打上不同的tag版本标签
[root@Gitlab ~]# cd nongye-demo #进入开发之前克隆下来的项目代码目录
[root@Gitlab nongye-demo]# ls
css g2.jpg g4.jpg g5.jpg js
fonts g3-1646724756761.jpg g5-1646724774424.jpg images README.md
g1.jpg g3.jpg g5-1646724779175.jpg index.html slid.jpg
[root@Gitlab nongye-demo]# git pull origin master #更新一下本地仓库代码(实际环境中可能会有其他人共同开发代码,已经提交过新代码,所以需要将远程仓库最新代码更新到本地仓库)
来自 gitlab.fzmyw.com:devops/nongye-demo
* branch master -> FETCH_HEAD
Already up-to-date.
[root@Gitlab nongye-demo]# git tag -a "v1.0" -m "v1.0版本代码提交为新的tag" #给当前本地仓库最新的完整代码打一个tag标签为v1.0版本
[root@Gitlab nongye-demo]# git tag #查看当前所有的tag标签
v1.0
[root@Gitlab nongye-demo]# git push origin v1.0 #将打好的tag标签版本推送至远程仓库的tag中
Counting objects: 1, done.
Writing objects: 100% (1/1), 158 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@gitlab.fzmyw.com:devops/nongye-demo.git
* [new tag] v1.0 -> v1.0
-再修改代码,将不同的版本代码提交至Gitlab并打上不同的tag版本标签
[root@Gitlab nongye-demo]# vim index.html #修改代码为v2.0
...
<div class="container">
<div class="header-left">
<h1><a href="index.html">v2.0</a></h1>
</div>
<div class="header-right">
...
[root@Gitlab nongye-demo]# git add .
[root@Gitlab nongye-demo]# git commit -m "v2.0"
[master 253e97c] v2.0
1 file changed, 1 insertion(+), 1 deletion(-)
[root@Gitlab nongye-demo]# git push origin master
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 278 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@gitlab.fzmyw.com:devops/nongye-demo.git
c81b043..253e97c master -> master
[root@Gitlab nongye-demo]# git tag -a "v2.0" -m "v2.0版本代码提交为新的tag"
[root@Gitlab nongye-demo]# git tag
v1.0
v2.0
[root@Gitlab nongye-demo]# git push origin v2.0
Counting objects: 1, done.
Writing objects: 100% (1/1), 183 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@gitlab.fzmyw.com:devops/nongye-demo.git
* [new tag] v2.0 -> v2.0
3.修改支持Gitlab项目tag版本传参的上线脚本
?脚本中的传递tag版本参数的变量$git_version是在Jenkins项目配置中Git Parameter那里设置的变量。
[root@Jenkins ~]# cd shell/
[root@Jenkins shell]# cp html_depoly.sh html_depoly_tag.sh
[root@Jenkins shell]# vim html_depoly_tag.sh
#!/sbin/bin/bash
DATE=$(date +%Y-%m-%d-%H-%M-%S)
WEB="192.168.1.33 192.168.1.34"
CODE="/usr/local/nginx/html/code"
Sdir="/opt"
Name=${DATE}-${git_version} #git_version是在Jenkins项目配置中Git Parameter那里设置的变量名字,将时间戳变量跟tag版本变量组合成一个,看着精简一点
#思路:
#1.Jenkins将Gitlab代码拉取至工作目录后,需先进入Jenkins工作目录将项目代码打包
get_code() {
#tar -cf $Sdir/web-${DATE}-${git_version}.tar.gz -C $WORKSPACE . #这里的WORKSPACE变量是直接调用的Jenkins的环境变量(即Jenkins中当前项目的工作目录),在执行Shell处可查看可调用的环境变量
tar -cf $Sdir/web-${Name}.tar.gz -C $WORKSPACE . #这里的$Name变量是将时间戳变量跟tag版本变量组合成一个,可以让打包好的项目名带上时间戳跟tag版本号
}
#2.再scp将打好包的项目代码拷贝至Web后端集群项目文件夹中
scp_web_server() {
for i in ${WEB}
do
scp $Sdir/web-${Name}.tar.gz root@$i:$Sdir
ssh root@$i "mkdir -p $CODE/web-${Name} && \
tar -xf $Sdir/web-${Name}.tar.gz -C $CODE/web-${Name}
rm -rf $CODE/web && \
ln -s $CODE/web-${Name} $CODE/web"
done
}
deploy() {
get_code
scp_web_server
}
deploy
4.实战Jenkins构建不同的tag版本项目发布
Jenkins项目进行参数化构建,在构建时选择新的tag版本部署并查看项目是否更新为修改后的新版本。
[root@Web1 code]# pwd
/usr/local/nginx/html/code
[root@Web1 code]# ll #查看后端服务器web1的项目文件夹,可以看到新部署的v2.0版本
总用量 0
lrwxrwxrwx 1 root root 55 3月 10 00:32 web -> /usr/local/nginx/html/code/web-2022-03-09-15-30-16-v2.0
drwxr-xr-x 7 997 995 271 3月 10 00:03 web-2022-03-09-06-23-19
drwxr-xr-x 7 997 995 271 3月 9 15:28 web-2022-03-09-15-30-16-v2.0
三、Jenkins实现项目tag版本的回退
1.修改支持Gitlab项目tag版本传参的回退脚本
[root@Jenkins shell]# cp html_depoly_tag.sh html_depoly_tag_rollback.sh
[root@Jenkins shell]# vim html_depoly_tag_rollback.sh
#!/sbin/bin/bash
DATE=$(date +%Y-%m-%d-%H-%M-%S)
WEB="192.168.1.33 192.168.1.34"
CODE="/usr/local/nginx/html/code"
Sdir="/opt"
Name=${DATE}-${git_version} #git_version是在Jenkins项目配置中Git Parameter那里设置的变量名字,将时间戳变>量跟tag版本变量组合成一个,看着精简一点
#思路:
#1.Jenkins将Gitlab代码拉取至工作目录后,需先进入Jenkins工作目录将项目代码打包
get_code() {
#tar -cf $Sdir/web-${DATE}-${git_version}.tar.gz -C $WORKSPACE . #这里的WORKSPACE变量是直接调用的Jenkins的环境变量(即Jenkins中当前项目的工作目录),在执行Shell处可查看可调用的环境变量
tar -cf $Sdir/web-${Name}.tar.gz -C $WORKSPACE .
}
#2.再scp将打好包的项目代码拷贝至Web后端集群项目文件夹中
scp_web_server() {
for i in ${WEB}
do
scp $Sdir/web-${Name}.tar.gz root@$i:$Sdir
ssh root@$i "mkdir -p $CODE/web-${Name} && \
tar -xf $Sdir/web-${Name}.tar.gz -C $CODE/web-${Name}
rm -rf $CODE/web && \
ln -s $CODE/web-${Name} $CODE/web"
done
}
deploy() {
get_code
scp_web_server
}
rollback() {
back_file=$(ssh root@192.168.1.33 "find ${CODE} -maxdepth 1 -type d -name "web-*-${git_version}"")
#由于后端集群部署回退时间戳、版本一致,所以这里就只需要到一台上查找我们在Jenkins构建时选择的git_version变量的值,即tag版本相对应的项目版本文件夹,即可回退至该版本
for i in ${WEB}
do
ssh root@$i "rm -rf $CODE/web && \
ln -s ${back_file} $CODE/web" #将上面查找到的回退版本项目文件夹设置为当前运行项目软链接
done
}
#根据Jenkins项目中配置的选项参数变量deploy_env的值来判断执行哪一个脚本函数(部署脚本还是回退脚本)
if [ $deploy_env == "deploy" ]; then
deploy
elif [ $deploy_env == "rollback" ]; then
rollback
fi
2.Jenkins添加参数化构建选项参数变量,支持选择部署或回退
问题:Jenkins中项目存在重复构建的问题?(点击构建项目多少次就会重复拷贝项目多少次,回退就没有意义)
四、Jenkins环境变量解决项目能重复发布问题
GIT_COMMIT:Jenkins本次构建提交的哈希值
GIT_PREVIOUS_SUCCESSFUL_COMMIT:Jenkins上次在这个分支上成功构建的提交的哈希值。
注意:
?GIT_PREVIOUS_SUCCESSFUL_COMMIT环境变量因为是记录的项目在这个分支上,上一次成功构建时提交的哈希值,所以这个哈希值是记录在构建历史里面的,如果将构建立历史删除,那么那一条构建成功记录的哈希值也会被删除!
1.修改支持判断重复构建的脚本(加入Jenkins环境变量判断)
#!/sbin/bin/bash
DATE=$(date +%Y-%m-%d-%H-%M-%S)
WEB="192.168.1.33 192.168.1.34"
CODE="/usr/local/nginx/html/code"
Sdir="/opt"
Name=${DATE}-${git_version} #git_version是在Jenkins项目配置中Git Parameter那里设置的变量名字,将时间戳变>量跟tag版本变量组合成一个,看着精简一点
#思路:
#1.Jenkins将Gitlab代码拉取至工作目录后,需先进入Jenkins工作目录将项目代码打包
get_code() {
#tar -cf $Sdir/web-${DATE}-${git_version}.tar.gz -C $WORKSPACE . #这里的WORKSPACE变量是直接调用的Jenkins的环境变量(即Jenkins中当前项目的工作目录),在执行Shell处可查看可调用的环境变量
tar -cf $Sdir/web-${Name}.tar.gz -C $WORKSPACE .
}
#2.再scp将打好包的项目代码拷贝至Web后端集群项目文件夹中
scp_web_server() {
for i in ${WEB}
do
scp $Sdir/web-${Name}.tar.gz root@$i:$Sdir
ssh root@$i "mkdir -p $CODE/web-${Name} && \
tar -xf $Sdir/web-${Name}.tar.gz -C $CODE/web-${Name}
rm -rf $CODE/web && \
ln -s $CODE/web-${Name} $CODE/web"
done
}
deploy() {
get_code
scp_web_server
}
rollback() {
back_file=$(ssh root@192.168.1.33 "find ${CODE} -maxdepth 1 -type d -name "web-*-${git_version}"")
#由于后端集群部署回退时间一致,所以这里就只需要到一台上查找我们在Jenkins构建时选择的git_version变量的值,即tag版本相对应的项目版本文件夹
for i in ${WEB}
do
ssh root@$i "rm -rf $CODE/web && \
ln -s ${back_file} $CODE/web"
done
}
#根据Jenkins项目中配置的选项参数变量deploy_env的值来判断执行哪一个脚本函数(部署脚本还是回退脚本)
if [ $deploy_env == "deploy" ]; then
#加入Jenkins中两个环境变量GIT_COMMIT、GIT_PREVIOUS_SUCCESSFUL_COMMIT来判断本次构建的项目哈希值是否已有成功构建存在的哈希值,存在及退出并提示,否则就部署!
if [ "$GIT_COMMIT" == "$GIT_PREVIOUS_SUCCESSFUL_COMMIT" ];then
echo "你已经部署过该${git_version}版本"
exit 1
else
deploy
fi
elif [ $deploy_env == "rollback" ]; then
rollback
fi
2.Jenkins构建时选择之前已经部署成功的tag版本项目进行重复构建
?可以看到tag为v2.0版本的项目之前已经成功构建过,所以现在再选择构建tag为v2.0版本的项目时,哈希值会重复,则根据脚本判断后无法继续构建,即可以避免重复构建问题! 3.Jenkins构建选择从未被构建过的tag版本项目进行构建
如果您喜欢本文,就请动动您的发财手为本文点赞评论转发,让我们一起学习更多运维相关知识,最后请记得关注我。
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)