环境拓扑:

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.csscreate mode 100755 css/style.csscreate mode 100755 css/swipebox.csscreate mode 100755 fonts/glyphicons-halflings-regular.woffcreate mode 100755 fonts/glyphicons-halflings-regular.woff2create mode 100755 images/banner.jpgcreate mode 100755 images/g1.jpgcreate mode 100755 images/g2.jpgcreate mode 100755 images/g3.jpgcreate mode 100755 images/g4.jpgcreate mode 100755 images/g5.jpgcreate mode 100755 images/g6.jpgcreate mode 100755 images/g7.jpgcreate mode 100755 images/g8.jpgcreate mode 100755 images/icons.pngcreate mode 100755 images/icons.svgcreate mode 100755 images/img1.jpgcreate mode 100755 images/move-up.pngcreate mode 100755 images/slid.jpgcreate mode 100755 images/social-icons.pngcreate mode 100755 images/t1.jpgcreate mode 100755 images/t2.jpgcreate mode 100755 images/t3.jpgcreate mode 100755 images/t4.jpgcreate mode 100755 index.htmlcreate mode 100755 js/bars.jscreate mode 100755 js/bootstrap.jscreate mode 100755 js/easing.jscreate mode 100755 js/easyResponsiveTabs.jscreate mode 100755 js/jquery-1.11.1.min.jscreate mode 100755 js/jquery.swipebox.min.jscreate mode 100755 js/move-top.jscreate 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}
doscp $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_codescp_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.01 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.gitc81b043..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}
doscp $Sdir/web-${Name}.tar.gz root@$i:$Sdirssh 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_codescp_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}
doscp $Sdir/web-${Name}.tar.gz root@$i:$Sdirssh 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_codescp_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}
dossh root@$i "rm -rf $CODE/web && \ln -s ${back_file} $CODE/web"  #将上面查找到的回退版本项目文件夹设置为当前运行项目软链接
done
}#根据Jenkins项目中配置的选项参数变量deploy_env的值来判断执行哪一个脚本函数(部署脚本还是回退脚本)
if [ $deploy_env == "deploy"  ]; thendeploy
elif [ $deploy_env == "rollback" ]; thenrollback
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}
doscp $Sdir/web-${Name}.tar.gz root@$i:$Sdirssh 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_codescp_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}
dossh 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" ];thenecho "你已经部署过该${git_version}版本"exit 1elsedeployfielif [ $deploy_env == "rollback" ]; thenrollback
fi

2.Jenkins构建时选择之前已经部署成功的tag版本项目进行重复构建




 可以看到tag为v2.0版本的项目之前已经成功构建过,所以现在再选择构建tag为v2.0版本的项目时,哈希值会重复,则根据脚本判断后无法继续构建,即可以避免重复构建问题!

3.Jenkins构建选择从未被构建过的tag版本项目进行构建



↓↓↓↓↓↓

最近刚申请了个微信公众号,上面也会分享一些运维知识,大家点点发财手关注一波,感谢大家。 【原创公众号】:非著名运维 【福利】:公众号回复 “资料” 送运维自学资料大礼包哦!

Jenkins+Gitlab+Nginx实现自动发布与回退基于tag版本的静态项目(解决重复构建问题)相关推荐

  1. Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构. 2.开发提交Java源代码至Gitlab仓库. 3.手动获取Java源代码,然后使用Maven进行编译. ...

  2. 专题篇四:Linux企业级CICD持续集成交付发布(终极实战部署:gitlab++jenkins+web(tomcat)+webbook自动发布)

    4,企业级CI/CD 持续集成/交付/发布 实验一:github+jenkins+web(tomcat) 构建的时候 网络连接超时(正常现象) githud仓库地址1.安装对应的插件(jenkins) ...

  3. Jenkins+Gitlab+Nginx+SonarQube+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    环境拓扑:  Jenkins -192.168.1.30  Gitlab -192.168.1.31  LB -192.168.1.32  Web1 -192.168.1.33  Web2 -192. ...

  4. Jenkins + GitLab + CocoaPod 的自动打包平台配置(从build到export success)

    目录 1. 安装JAVA环境 2. 安装Jenkins 3. 管理插件 4. 项目新建和设置 5. Keychains and Provisioning Profiles Management配置(重 ...

  5. 【无标题】jenkins实现vue代码自动发布,纯linux脚本实现。

    公司自己搭建的gitlab平台管理代码,https安全证书过期了,自己又无权限更改.导致jenkins配置gitlab域名的时候,报如下错误:Client error: PKIX path build ...

  6. docker jenkins 公钥_代码自动发布docker(20.10.1)+k8s(1.20.1)

    PaaS平台 Docker版本(20.10.1)  2020-12-15 k8s版本(1.20.1)  2020-12-19 代码托管:https://github.com/kubernetes/ 官 ...

  7. Jenkins+git 实现代码自动发布

    创建一个项目名称 写上描述 拉取这个分支的代码 只有dev147 分支push才发布,触发条件 然后点构建就可以啦~~ 转载于:https://blog.51cto.com/9393764/19177 ...

  8. Jenkins + Gradle + pgyer + Android自动发布

    Jenkins配置与必要的环境配置 一:Jenkins服务端(Linux系统为例说明): 1.jdk安装与配置 2.SDK安装与配置 3.安装配置对应的gradle版本(建议gradle版本在4.1版 ...

  9. dedecms内链 arc.archives.class.php,dedecms文章关键字(自动内链)php5.5以上版本urf-8失效的解决方法...

    找到include/arc.archives.class.php在里面需要修改两次地方 在1230行 // 这里可能会有错误 if (version_compare(PHP_VERSION, '5.5 ...

最新文章

  1. 主从复制跳过错误(未采用GTID)
  2. 【数据结构-图】2.多图详解最小生成树(多图详解+实现代码)
  3. Log4j的快速入门
  4. php发送数据到视图格式_PHP-FPM的相关知识的深度解释
  5. 启动azkaban报错_解决启动Azkaban报错问题:java.lang.NoSuchMethodError: com.google.comm
  6. 有没有查计算机组成的答案得,计算机组成答案.doc
  7. BulkInsert导入CSV文件
  8. Windows重新生成UEFI引导,解决Windows蓝屏\BCD 0xc0000098
  9. 51单片机 1-LED灯流水灯 练习3-流水灯(_crol_位移)
  10. 网页设计-颜色代码对照表
  11. 云服务器Docker安装ElasticSearch却启动不了怎么办?
  12. 青云QingCloud推出CDN加速服务 动态选择最优节点
  13. 读博期间应该明确的50件事!
  14. 在ubuntu下安装炉石传说
  15. 手机产业未来的发展方向
  16. Android Studio仿QQ界面实现简单的功能
  17. C++一本通题库1024
  18. PS 图片编辑软件软件安装包下载地址及安装教程
  19. 远程桌面工具 mRemote
  20. Mac预览工具如何使用?

热门文章

  1. 及其他公共信息网络的计算机上存储,不得在未采取防护措施的情况下将互联网及其他公共信息网络上的数据复制到涉密计算机及网络,确...
  2. java ews appointment_ews-java-api学习:新建Recurring Appointment
  3. Docker,compose,kitematic Overview and build Php WordExpress
  4. Biaofun分享给你什么是文案?
  5. 关于Angular,开发人员经常忽视的9个想法
  6. 秦安三中2021高考一成绩查询,喜报!天水一中、三中、五中2019年高考成绩来了!...
  7. 车载网络基础——预备篇
  8. post /login.php http/1.1,路由器登录入口:http://192.168.10.1
  9. 如何提升客户的信任,实现与客户的连接,带动业绩的转变
  10. 如何用python画一个美队盾牌