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

2022-06-22 16:29:16 浏览数 (1)

环境拓扑:

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

-准备好项目代码上传至服务器

代码语言:javascript复制
--永久关闭防火墙和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指示关联本地与远程仓库并推送代码到项目

代码语言:javascript复制
[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域名解析

代码语言:javascript复制
[root@Jenkins ~]# echo 192.168.1.31 gitlab.fzmyw.com >> /etc/hosts

-Jenkins主机安装Git命令

代码语言:javascript复制
[root@Jenkins ~]# yum -y install git

4.Jenkins与Gitlab集成实践

-将Jenkins服务器的公钥放到Gitlab服务器上,实现Linux上免密克隆项目(Jenkins项目要免密拉取Gitlab代码还需要配置Jenkins凭证)

代码语言:javascript复制
[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连接配置栏指定该私钥,即可完成认证(公钥-私钥)并免密连接拉取代码!

代码语言:javascript复制
[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代码,暂时不做其他配置

代码语言:javascript复制
[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负载均衡主机

代码语言:javascript复制
[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主机

代码语言:javascript复制
[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主机

代码语言:javascript复制
[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集群组免密钥连接

代码语言:javascript复制
[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

-编写上线脚本

代码语言:javascript复制
[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(避免各种权限问题)

代码语言:javascript复制
[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代码目录。

代码语言:javascript复制
[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版本标签

代码语言:javascript复制
[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版本标签

代码语言:javascript复制
[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那里设置的变量。

代码语言:javascript复制
[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版本部署并查看项目是否更新为修改后的新版本。

代码语言:javascript复制
[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版本传参的回退脚本

代码语言:javascript复制
[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环境变量判断)

代码语言:javascript复制
#!/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版本项目进行构建

0 人点赞