6. Gitlab集成Jenkins-静态页面发布

2021-05-31  本文已影响0人  随便写写咯

4 Jenkins

4.1 Jenkins介绍

4.2 Jenkins部署

4.2.1 环境

CentOS-7
10.0.0.237 - Gitlab - gitlab-ce-12.0.3
10.0.0.227 - Jenkins - Jenkins-2.176.1
CentOS-8
10.0.0.82 - 开发机-developer-2 / websrv-2
10.0.0.81 - 开发机-developer-1 / websrv-1

4.2.2 安装Jenkins

[18:52:58 root@jenkins ~]#yum localinstall jenkins-2.176.1-1.1.noarch.rpm -y
[19:03:12 root@jenkins ~]#yum -y install java-1.8.0-openjdk.x86_64 # Jenkins需要Java环境
yum -y install git
[19:03:30 root@jenkins ~]#systemctl start jenkins
[19:03:37 root@jenkins ~]#systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Wed 2020-12-30 19:03:37 CST; 6s ago

4.2.2.1 Jenkins监听8080端口

LISTEN     0      50                                                          [::]:8080                                                                    [::]:* 

4.2.3 配置Windows客户端和jenkins服务器本地域名解析

10.0.0.237 gitlab.abc.com
10.0.0.227 jenkins.abc.com
10.0.0.237 gitlab.abc.com
10.0.0.227 jenkins.abc.com

4.2.4 访问jenkins

  1. http://jenkins.abc.com:8080
图片.png
  1. 从文件中获得jenkins密码
[19:09:04 root@jenkins ~]#cat /var/lib/jenkins/secrets/initialAdminPassword
f19096b3376b48b8a8bb2f45183fc963
  1. 跳过插件安装, 稍后手动安装
图片.png 图片.png
  1. 修改admin密码
图片.png 图片.png

4.2.5 插件安装

图片.png 图片.png 图片.png

4.2.5.1 调整jenkins插件源, 使用清华源

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

图片.png

4.2.5.2 在线安装插件

如需在线安装, 只要进到Available然后再搜索栏搜索即可

图片.png

4.2.5.3 从清华源下载.hpi文件后安装插件

实例: 安装jenjins的git插件

  1. 下载插件

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/

  1. 上传插件
图片.png 图片.png
  1. 安装插件

上传后, 点Upload即可, 之后会在线安装

4.2.5.4 离线安装插件

  1. 停止jenkins服务
[19:17:30 root@jenkins ~]#systemctl stop jenkins
  1. jenkins插件目录
[19:44:59 root@jenkins ~]#ll /var/lib/jenkins/plugins/
total 0
  1. 移走现有的plugins目录, 如果里面有内容, 然后把本地的插件包解压, 移动到/var/lib/jenkins/目录下
[19:45:27 root@jenkins ~]#rm -rf /var/lib/jenkins/plugins
[19:47:30 root@jenkins ~]#tar xf jenkins_2.176_plugins.tar.gz
[19:47:52 root@jenkins ~]#mv plugins/ /var/lib/jenkins/
[19:48:49 root@jenkins ~]#chown -R jenkins.jenkins /var/lib/jenkins
  1. 启动jenkins
[19:50:50 root@jenkins ~]#systemctl start jenkins
  1. 查看日志
[19:53:02 root@jenkins ~]#tail -f /var/log/jenkins/jenkins.log
INFO: Completed initialization
Dec 30, 2020 7:53:34 PM hudson.WebAppMain$3 run
INFO: Jenkins is fully up and running  # 看到这句话就说明启动成功
  1. 登录jenkins

  2. 配置警告信息

图片.png 图片.png
  1. 把所有警告信息取消, 保存即可

4.2.6 Jenkins自由风格软件项目简单测试

  1. 创建项目


    图片.png
  2. 设置保留最近10个构建项目


    图片.png
  3. 构建操作, 执行Shell, 这里的Shell命令会在Jenkins拉取Gitlab代码后, 在Jenkins服务器上执行

图片.png 图片.png
  1. 立即构建
图片.png
  1. 查看控制台输出
图片.png
图片.png 图片.png
  1. 构建后的文件

构建后的内容都会存在jenkins服务器上的, /var/lib/jenkins/workspace目录, 以项目名为目录做区分

[19:54:39 root@jenkins ~]#ll /var/lib/jenkins/workspace/
total 0
drwxr-xr-x 2 jenkins jenkins 31 Dec 30 20:24 test-project
[20:30:11 root@jenkins ~]#ll /var/lib/jenkins/workspace/test-project/
total 0
-rw-r--r-- 1 jenkins jenkins 0 Dec 30 20:24 file_from_jenkins

4.3 Jenkins集成Gitlab

4.3.1 Gitlab创建项目

用developer-2管理员用户

图片.png

4.3.2 将项目包拷贝到developer-2用户的git客户端, 并解压

[13:51:18 root@developer-2 ~]#ls
monitor_html.tar.gz
[13:51:56 root@developer-2 ~]#tar xf monitor_html.tar.gz 
[13:52:16 root@developer-2 ~]#ls
monitor  monitor_html.tar.gz
[13:52:17 root@developer-2 ~]#ls monitor
404.html       charts.html           dianfei.html             form-components.html  img           LICENSE         messages.html            QHME.iml        typography.html
alerts.html    components.html       efficiencyAnalysis.html  form-elements.html    index.html    list-view.html  mstp_105_SuperAdmin.iml  readme.md       userMng.html
assets         content-widgets.html  energy_consumption.html  form-examples.html    js            login.html      mstp_map.html            real-time.html
buttons.html   css                   file-manager.html        form-validation.html  keyInfo.html  media           other-components.html    sa.html
calendar.html  deviceManager.html    fonts                    images-icons.html     labels.html   media.html      profile-page.html        tables.html

buttons.html   css                   file-manager.html        form-validation.html  keyInfo.html  media           other-components.html    sa.html
calendar.html  deviceManager.html    fonts                    images-icons.html     labels.html   media.html      profile-page.html        tables.html

4.3.3 关联远程仓库, 推送本地现有文件夹

# 先将原有的仓库信息删除, 如果已有
[13:52:33 root@developer-2 ~]#cd monitor/
[13:53:17 root@developer-2 ~/monitor]#git remote -v
origin  https://gitee.com/kangjie1209/monitor.git (fetch)
origin  https://gitee.com/kangjie1209/monitor.git (push)
[13:53:21 root@developer-2 ~/monitor]#git remote remove origin
[13:53:28 root@developer-2 ~/monitor]#git init
Reinitialized existing Git repository in /root/monitor/.git/
[13:53:45 root@developer-2 ~/monitor]#git remote add origin git@gitlab.abc.com:devops/monitor.git
[13:54:00 root@developer-2 ~/monitor]#git add .
[13:54:03 root@developer-2 ~/monitor]#git commit -m "第一次提交代码"
On branch master
nothing to commit, working tree clean
[13:54:15 root@developer-2 ~/monitor]#git push origin master
Enumerating objects: 435, done.
Counting objects: 100% (435/435), done.
Compressing objects: 100% (372/372), done.
Writing objects: 100% (435/435), 8.78 MiB | 6.19 MiB/s, done.
Total 435 (delta 53), reused 435 (delta 53), pack-reused 0
remote: Resolving deltas: 100% (53/53), done.
To gitlab.abc.com:devops/monitor.git
 * [new branch]      master -> master

4.3.4 Gitlab验证

图片.png

4.3.5 jenkins安装gitlab插件

这里前期已经统一离线导入了插件, 所以无需再安装

image.png

4.3.6 Jenkins创建freestyle项目, 然后配置gitlab仓库项目对应地址

image.png image.png

添加git仓库地址后, 如果出现以下报错, 可能是jenkins服务器没有装git, 需要安装

图片.png

安装git后, 如果出现如下报错, 是因为没有配置验证

  1. 在jenkins服务器生成root账号的ssh秘钥
[21:31:57 root@jenkins ~]#ssh-keygen
  1. 把公钥放到gitlab上, 公钥放到任何一个对项目有权限的用户的账户里即可

  2. 添加jenkins凭据

图片.png

这里要把jenkins上用root用户创建的私钥添加进去, 因为我们把root的公钥放到了gitlab上, jenkins连接gitlab时, gitlab会用拿到的公钥做认证

图片.png 图片.png
  1. 保存后点击构建
图片.png
  1. 构建成功后, 返回工程, 进入工作区
image.png image.png image.png
[21:44:23 root@jenkins ~]#ll /var/lib/jenkins/workspace/
total 4
drwxr-xr-x 9 jenkins jenkins 4096 Dec 30 21:40 freestyle-monitor
drwxr-xr-x 2 jenkins jenkins    6 Dec 30 21:40 freestyle-monitor@tmp
drwxr-xr-x 2 jenkins jenkins   31 Dec 30 20:24 test-project
[21:44:24 root@jenkins ~]#ll /var/lib/jenkins/workspace/freestyle-monitor
total 1364
-rw-r--r--  1 jenkins jenkins  1208 Dec 30 21:40 404.html
-rw-r--r--  1 jenkins jenkins 27249 Dec 30 21:40 alerts.html
drwxr-xr-x  5 jenkins jenkins    64 Dec 30 21:40 assets
-rw-r--r--  1 jenkins jenkins 34972 Dec 30 21:40 buttons.html
...

到此, 完成了jenkins从gitlab拉取代码, 下面实现项目发布

4.4 手动实现集群架构代码上线

环境:

CentOS 7
----------------------------------
Gitlab - 10.0.0.237 - gitlab.abc.com
Jenkins - 10.0.0.227 - jenkins.abc.com
SonarQube - 10.0.0.207 - sonarqube.abc.com
Nginx-LB - 10.0.0.217 nginx负载均衡服务器后端代理 web服务器 - html.abc.com, 和tomcat服务器, java.abc.com, 需要在windows做域名解析 512MB

CentOS-8
10.0.0.82 - 开发机-developer-2 / websrv-2
10.0.0.81 - 开发机-developer-1 / websrv-1

----------------------------------

4.4.1 配置负载均衡服务器 10.0.0.217

[21:57:44 root@lb ~]#yum -y install nginx
[21:58:02 root@lb ~]#cd /etc/nginx/conf.d
[21:59:45 root@lb /etc/nginx/conf.d]#vim proxy_html.abc.com.conf

upstream html {
    server 10.0.0.81;
    server 10.0.0.82;


}

server {
    listen 80;
    server_name html.abc.com;
    location / {
            proxy_pass http://html;
            proxy_set_header Host $http_Host;       # 如果后端nginx配置了单独的虚拟主机, 并且指定了主机头为访问的域名html.abc.com, 那么就需要再反向代理加上proxy_set_header, 把用户请求报文的Host字段传给后端服务器, 否则因为upstream定义的是ip地址,  那么转给后端服务器后, 就是转给了默认的虚拟主机, 这样就访问不到子配置文件中的虚拟主机                                                                                      
    } 
[22:07:27 root@lb /etc/nginx/conf.d]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[22:07:33 root@lb /etc/nginx/conf.d]#systemctl restart nginx

4.4.2 配置web1

[22:09:39 root@web1 ~]#yum -y install nginx
[22:11:55 root@web1 ~]#vim /etc/nginx/conf.d/html.abc.com.conf
server {

    listen 80;
    server_name html.abc.com;
    root /code/web;

    location / {                                                                                                                                    
        index index.html;

    }

}
~  
[22:17:31 root@web1 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[22:17:36 root@web1 ~]#systemctl restart nginx
[22:18:14 root@web1 ~]#mkdir /code/web -pv
mkdir: created directory ‘/code’
mkdir: created directory ‘/code/web’

4.4.2 配置web2

[22:09:52 root@web2 ~]#yum -y install nginx
[22:11:56 root@web2 ~]#vim /etc/nginx/conf.d/html.abc.com.conf
server {
                                                                                                                                                    
    listen 80;
    server_name html.abc.com;
    root /code/web;

    location / {
        index index.html;

    }

}
[22:19:26 root@web2 ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[22:19:28 root@web2 ~]#systemctl restart nginx
[22:19:33 root@web2 ~]#mkdir -pv /code/web
mkdir: created directory ‘/code’
mkdir: created directory ‘/code/web’

这时访问html.abc.com会有403报错, 因为后端web服务器还没有代码上线

image.png

4.4.3 将jenkins服务器上workspace里的代码手动拷贝到两台web服务器上

[22:29:52 root@jenkins ~]#cd /var/lib/jenkins/workspace/freestyle-monitor
[22:29:52 root@jenkins /var/lib/jenkins/workspace/freestyle-monitor]#scp -r * 10.0.0.81:/code/web
[22:31:27 root@jenkins /var/lib/jenkins/workspace/freestyle-monitor]#scp -r * 10.0.0.82:/code/web

再次访问html.abc.com验证负载均衡成功

image.png

这样就实现了Jenkins集成Gitlab, 通过构建一个freestyle静态项目, 从Gitlab拉取代码到Jenkins, 再手动把代码从Jenkins复制到后端服务器, 实现代码部署

4.5 实现自动集群架构代码上线

思路:

  1. 手动搭建nginx集群架构
  2. 开发提交代码至gitlab, Jenkins手动构建拉取代码
  3. 在jenkins上编写shell构建脚本, 由jenkins调用, 并推送代码至web服务器组

4.5.1 编写jenkins推送代码脚本

[22:59:49 root@jenkins /data/scripts]#cat html_deploy.sh 
#!/bin/bash
DATE=`date +%Y-%m-%d-%H-%M-%S`
web_server="10.0.0.81 10.0.0.82"
#代码打包路径
sdir="/opt" # 把workspace目录下的代码打包到jenkins的/opt目录
#代码部署路径
ddir="/code"
#1. 进入到项目目录, 将内容进行打包
get_code(){
        cd ${WORKSPACE} && \  # WORKSPACE变量会返回当前Jenkins项目的目录, 也就是/var/lib/jenkins/workspace/freestyle-monitor
        tar czf ${sdir}/web-${DATE}.tar.gz ./*
}
#2. 将内容通过scp拷贝至web集群组
scp_web_server(){
for host in $web_server; do
    scp ${sdir}/web-${DATE}.tar.gz root@$host:${sdir}
    ssh root@$host "mkdir -p ${ddir}/web-${DATE} && \
                    tar xf ${sdir}/web-${DATE}.tar.gz -C ${ddir}/web-${DATE} && \
                    rm -rf ${ddir}/web && \  
#/code/web指向真正的代码目录, 因此. 每次构建都要把软连接删除, 重新添加软连接到新的代码目录, 这样静态页面的代码上线就是自动变成新的版本了
                    ln -s ${ddir}/web-${DATE} ${ddir}/web"
done
}
deploy(){
        get_code
        scp_web_server

}

deploy

4.5.2 将脚本添加到jenkins

image.png image.png image.png

将jenkins设置成以root用户运行, 避免脚本执行过程中由于默认的jenkins用户没有权限导致脚本执行失败, 把jenkins设置为sudo也行

vim  /etc/sysconfig/jenkins
JENKINS_USER="root" 
systemctl restart jenkins

将jenkins的公钥推送到后端web服务器, 实现ssh免秘钥认证

ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.81
ssh-copy-id -i ~/.ssh/id_rsa.pub root@10.0.0.82

4.5.3 构建工程, 查看控制台输出

image.png

构建如果出现报错, 要配合控制台输出进行排错后再次构建, 构建成功后要去web服务器目录下把错误的输出文件都删除

图片.png 图片.png

静态页面自动上线思路:

  1. 开发将代码推送到gitlab
  2. jenkins需要事先配置好集成gitlab, 通过构建项目, 添加gitlab项目的目录, Jenkins私钥认证, 以及jenkins公钥添加到Gitlab, 以及构建脚本
  3. 进到项目工作区, 通过手动点击构建. jenkins会到gitlab上把代码拉取到jenkins本地/var/lib/jenkins/workspace/项目目录, 然后执行sh脚本, 把代码在部署到后端服务器
  4. 这种方式适用于静态页面上线, 因为不需要编译, 直接把代码部署到后端服务器即可
  5. 对于php也适用, 不过部署完代码后需要重启php-fpm, 并且删除之前的缓存

4.5.4 实现项目代码升级的发布

测试小案例

  1. 直接修改gitlab上的index.html页面, 省去开发将项目拉取到本地修改, 在推送到gitlab的过程
  1. 构建, 验证修改
image.png

4.6 Jenkins实现基于版本tag发布

4.6.1 为什么要让项目支持tag版本方式上线?

由于之前上线方式是直接获取最新代码, 那么会造成后期回退变困难. 如果采用tag的方式, 比如第一次上线 tag v1.1, 第二次上线 tag v1.2. 如果上线v1.2出现问题, 那么我们可以快速回退至上一个版本v1.1

4.6.2 实现tag版本上线方式思路

  1. 开发如果需要发布新版本, 必须将当前的版本打上一个标签
  2. Jenkins需要让其脚本支持传参, 比如用户传递v1.1则拉取项目v1.1的标签

4.6.3 Jenkins参数化构建介绍

  1. 定义文本参数


    image.png
  2. 定义选项参数


    image.png
  3. 修改构建Shell命令, 测试文本参数和选项参数功能

image.png
  1. 这时工作区不会显示立即构建, 而是Build with Parameter
image.png
  1. 手动指定git_version变量值, 选择部署还是发布, 点击开始构建
image.png image.png
  1. 测试结果

从构建结果可以看出, git_version 和 deploy_env可以作为变量, 在构建Shell命令的脚本里调用, 实现从Jenkins界面在构建时指定参数, 传给脚本, 这样Jenkins在拉取代码时可以基于tag版本拉取, 同时, 也可以指定, 本次构建是拉取还是回退操作.

4.7 实战Jenkins部署tag版本

  1. 首先安装Git Parameter插件, 然后配置Jenkins参数化构建, 让用户在构建时选择对应的tag版本
image.png
[01:08:33 root@jenkins ~]#tail -f /var/log/jenkins/jenkins.log 
Dec 31, 2020 1:15:45 AM jenkins.InitReactorRunner$1 onAttained
INFO: Augmented all extensions
Dec 31, 2020 1:15:45 AM jenkins.InitReactorRunner$1 onAttained
INFO: Loaded all jobs
Dec 31, 2020 1:15:45 AM jenkins.InitReactorRunner$1 onAttained
INFO: Completed initialization
Dec 31, 2020 1:15:46 AM hudson.PluginManager dynamicLoad
INFO: Plugin git-parameter:0.9.13 dynamically installed
Dec 31, 2020 1:15:46 AM hudson.model.UpdateCenter$DownloadJob run
INFO: Installation successful: Git Parameter
image.png
  1. 配置参数化构建, 选择Git Parameter
图片.png
  1. 修改构建脚本, 把参数加进去
[12:32:33 root@jenkins /data/scripts]#vim html_deploy_tag.sh
DATE=`date +%Y-%m-%d-%H-%M-%S`
web_server="10.0.0.81 10.0.0.82"
#代码打包路径
sdir="/opt"
#代码部署路径
ddir="/code"
#1. 进入到项目目录, 将内容进行打包
get_code(){
        cd ${WORKSPACE} && \
        tar czf ${sdir}/web-${DATE}-${git_version}.tar.gz ./*
}
#2. 将内容通过scp拷贝至web集群组
scp_web_server(){
for host in $web_server; do
    scp ${sdir}/web-${DATE}-${git_version}.tar.gz root@$host:${sdir}
    ssh root@$host "mkdir -p ${ddir}/web-${DATE}-${git_version} && \
                    tar xf ${sdir}/web-${DATE}-${git_version}.tar.gz -C ${ddir}/web-${DATE}-${git_version} && \
                    rm -rf ${ddir}/web && \
                    ln -s ${ddir}/web-${DATE}-${git_version} ${ddir}/web"                                                                                                           
done
}
deploy(){
        get_code
        scp_web_server

}

deploy
图片.png
  1. 执行构建
  1. Gitlab上给代码加tag
[19:51:29 root@developer-2 ~]#ls
monitor  monitor_html.tar.gz
[19:51:31 root@developer-2 ~]#cd monitor/
[19:51:45 root@developer-2 ~/monitor]#git pull origin master 
[19:51:51 root@developer-2 ~/monitor]#git tag -a "v1.1" -m "测试tag-v1.1"
[19:52:39 root@developer-2 ~/monitor]#git tag
v1.1
[19:52:41 root@developer-2 ~/monitor]#git push origin v1.1
  1. 修改index.html文件, 推送v1.2版本
图片.png
[19:52:50 root@developer-2 ~/monitor]#vim index.html 
[19:53:49 root@developer-2 ~/monitor]#git add .
[19:53:52 root@developer-2 ~/monitor]#git commit -m "v1.2"
[master dbebf09] v1.2
 1 file changed, 1 insertion(+), 1 deletion(-)
[19:53:58 root@developer-2 ~/monitor]#git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 307 bytes | 307.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
To gitlab.abc.com:devops/monitor.git
   26cd3d5..dbebf09  master -> master
[19:54:08 root@developer-2 ~/monitor]#git tag -a "v1.2" -m "提交v1.2版本"
[19:54:20 root@developer-2 ~/monitor]#git push origin v1.2
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 182 bytes | 182.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To gitlab.abc.com:devops/monitor.git
 * [new tag]         v1.2 -> v1.2
  1. 再修改index.html, 推送v1.3版本
图片.png
[19:54:39 root@developer-2 ~/monitor]#vim index.html 
[19:55:37 root@developer-2 ~/monitor]#git add .
[19:55:43 root@developer-2 ~/monitor]#git commit -m "提交v1.3版本"
[master 747844f] 提交v1.3版本
 1 file changed, 1 insertion(+), 1 deletion(-)
[19:55:55 root@developer-2 ~/monitor]#git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 328 bytes | 328.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
To gitlab.abc.com:devops/monitor.git
   dbebf09..747844f  master -> master
[19:56:06 root@developer-2 ~/monitor]#git tag -a "v1.3" -m "提交v1.3版本"
[19:56:21 root@developer-2 ~/monitor]#git push origin v1.3
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 181 bytes | 181.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To gitlab.abc.com:devops/monitor.git
 * [new tag]         v1.3 -> v1.3

现在有三个版本,v1.1,v1.2,v1.3, 可以基于tag部署

  1. 回到jenkins, 验证tag可用, 构建v1.3版本
图片.png 图片.png
[10:56:13 root@web1 ~]#ll /code
total 16
lrwxrwxrwx 1 root root   34 Dec 31 12:59 web -> /code/web-2020-12-31-12-59-05-v1.3
  1. 测试回退到v1.2
图片.png 图片.png

但是, 此时, 每次构建, 项目代码都会拷贝到web服务器的项目目录下, 之后要解决这个问题

[13:00:51 root@web1 ~]#ll /code
total 20
lrwxrwxrwx 1 root root   34 Dec 31 13:04 web -> /code/web-2020-12-31-13-04-52-v1.2
drwxr-xr-x 8 root root 4096 Dec 30 23:28 web-2020-12-30-23-28-26
drwxr-xr-x 8 root root 4096 Dec 30 23:59 web-2020-12-30-23-59-56
drwxr-xr-x 2 root root    6 Dec 31 00:21 web-2020-12-31-00-21-46
drwxr-xr-x 5 root root   80 Dec 31 00:23 web-2020-12-31-00-23-42
drwxr-xr-x 2 root root    6 Dec 31 00:24 web-2020-12-31-00-24-20
drwxr-xr-x 8 root root 4096 Dec 31 00:25 web-2020-12-31-00-25-47
drwxr-xr-x 8 root root 4096 Dec 31 12:59 web-2020-12-31-12-59-05-v1.3
drwxr-xr-x 8 root root 4096 Dec 31 13:04 web-2020-12-31-13-04-52-v1.2

到此为止, 只是实现了利用tag, 部署不同的版本, 但是每次都会再web目录下,生成新的项目代码, 下面实现回退功能

  1. 添加选项参数
图片.png 图片.png
  1. 修改构建脚本, 这里先把deploy_env传进去, 实现deploy功能, rollback稍后实现
[13:12:42 root@jenkins /data/scripts]#cp html_deploy_tag.sh html_deploy_tag_deploy.sh 
[13:12:55 root@jenkins /data/scripts]#vim html_deploy_tag_deploy.sh 

DATE=`date +%Y-%m-%d-%H-%M-%S`
web_server="10.0.0.81 10.0.0.82"
#代码打包路径
sdir="/opt"
#代码部署路径
ddir="/code"
#1. 进入到项目目录, 将内容进行打包
get_code(){
        cd ${WORKSPACE} && \
        tar czf ${sdir}/web-${DATE}-${git_version}.tar.gz ./*
}
#2. 将内容通过scp拷贝至web集群组
scp_web_server(){
for host in $web_server; do
    scp ${sdir}/web-${DATE}-${git_version}.tar.gz root@$host:${sdir}
    ssh root@$host "mkdir -p ${ddir}/web-${DATE}-${git_version} && \
                    tar xf ${sdir}/web-${DATE}-${git_version}.tar.gz -C ${ddir}/web-${DATE}-${git_version} && \
                    rm -rf ${ddir}/web && \
                    ln -s ${ddir}/web-${DATE}-${git_version} ${ddir}/web"
done
}
deploy(){
        get_code
        scp_web_server

}
rollback(){

        echo "rollback"

}

if [ ${deploy_env} == "deploy" ]; then
    deploy
elif [ ${deploy_env} == "rollback" ]; then 
    rollback 
fi
  1. 修改构建
图片.png
  1. 重新构建, 测试部署v1.3
图片.png

当前版本:


图片.png

构建v1.3后:

图片.png 图片.png
  1. 增加回退功能, 编写回退脚本
[13:07:28 root@web1 ~]#ll /code
total 24
lrwxrwxrwx 1 root root   34 Dec 31 13:31 web -> /code/web-2020-12-31-13-31-36-v1.3
drwxr-xr-x 8 root root 4096 Dec 30 23:28 web-2020-12-30-23-28-26
drwxr-xr-x 8 root root 4096 Dec 30 23:59 web-2020-12-30-23-59-56
drwxr-xr-x 2 root root    6 Dec 31 00:21 web-2020-12-31-00-21-46
drwxr-xr-x 5 root root   80 Dec 31 00:23 web-2020-12-31-00-23-42
drwxr-xr-x 2 root root    6 Dec 31 00:24 web-2020-12-31-00-24-20
drwxr-xr-x 8 root root 4096 Dec 31 00:25 web-2020-12-31-00-25-47
drwxr-xr-x 8 root root 4096 Dec 31 12:59 web-2020-12-31-12-59-05-v1.3
drwxr-xr-x 8 root root 4096 Dec 31 13:04 web-2020-12-31-13-04-52-v1.2
drwxr-xr-x 8 root root 4096 Dec 31 13:31 web-2020-12-31-13-31-36-v1.3
[13:42:12 root@web1 ~]#rm -rf /code/web-2020-12-31-12-59-05-v1.3
[10:56:09 root@web2 ~]#ll /code
total 24
lrwxrwxrwx 1 root root   34 Dec 31 13:31 web -> /code/web-2020-12-31-13-31-36-v1.3
drwxr-xr-x 8 root root 4096 Dec 30 23:28 web-2020-12-30-23-28-26
drwxr-xr-x 8 root root 4096 Dec 30 23:59 web-2020-12-30-23-59-56
drwxr-xr-x 2 root root    6 Dec 31 00:21 web-2020-12-31-00-21-46
drwxr-xr-x 5 root root   80 Dec 31 00:23 web-2020-12-31-00-23-42
drwxr-xr-x 2 root root    6 Dec 31 00:24 web-2020-12-31-00-24-20
drwxr-xr-x 8 root root 4096 Dec 31 00:25 web-2020-12-31-00-25-47
drwxr-xr-x 8 root root 4096 Dec 31 12:59 web-2020-12-31-12-59-05-v1.3
drwxr-xr-x 8 root root 4096 Dec 31 13:04 web-2020-12-31-13-04-52-v1.2
drwxr-xr-x 8 root root 4096 Dec 31 13:31 web-2020-12-31-13-31-36-v1.3
[13:46:58 root@web2 ~]#rm -rf /code/web-2020-12-31-12-59-05-v1.3
DATE=`date +%Y-%m-%d-%H-%M-%S`
web_server="10.0.0.8110.0.0.82"
#代码打包路径
sdir="/opt"
#代码部署路径
ddir="/code"
#1. 进入到项目目录, 将内容进行打包
get_code(){
        cd ${WORKSPACE} && \
        tar czf ${sdir}/web-${DATE}-${git_version}.tar.gz ./*
}
#2. 将内容通过scp拷贝至web集群组
scp_web_server(){
for host in $web_server; do
    scp ${sdir}/web-${DATE}-${git_version}.tar.gz root@$host:${sdir}
    ssh root@$host "mkdir -p ${ddir}/web-${DATE}-${git_version} && \
                    tar xf ${sdir}/web-${DATE}-${git_version}.tar.gz -C ${ddir}/web-${DATE}-${git_version} && \
                    rm -rf ${ddir}/web && \
                    ln -s ${ddir}/web-${DATE}-${git_version} ${ddir}/web"
done
}
deploy(){
        get_code
        scp_web_server

}
rollback(){

rollback_file=`ssh root@10.0.0.81 "find /code/ -maxdepth 1 -type d -name "web-*-${git_version}""`   # 找到需要回退到的那个目录的目录名, 这样回退时就可以把当前的软连接删除, 重新连接到这个版本上, 这样就不会再重新生成一个目录了

for host in $web_server; do
    ssh root@$host "rm -rf ${ddir}/web && \
                    ln -s ${rollback_file} ${ddir}/web"  # 删除当前的软连接后, 重新创建软连接, 指向上面找到的要回退的那个版本, 这样回退就不用jenkins去拉代码, 然后重复部署到web服务器了.
done                                                                                                                                                                                


}

if [ ${deploy_env} == "deploy" ]; then
    deploy
elif [ ${deploy_env} == "rollback" ]; then 
    rollback 
fi
  1. 配置构建
图片.png
  1. 构建, 回退到1.2版本
图片.png
[13:50:28 root@web1 ~]#ll /code
total 20
lrwxrwxrwx 1 root root   34 Dec 31 14:01 web -> /code/web-2020-12-31-13-04-52-v1.2  # 重新把软连接指向v1.2版本, 而且并没有重新部署一次代码.
drwxr-xr-x 8 root root 4096 Dec 30 23:28 web-2020-12-30-23-28-26
drwxr-xr-x 8 root root 4096 Dec 30 23:59 web-2020-12-30-23-59-56
drwxr-xr-x 2 root root    6 Dec 31 00:21 web-2020-12-31-00-21-46
drwxr-xr-x 5 root root   80 Dec 31 00:23 web-2020-12-31-00-23-42
drwxr-xr-x 2 root root    6 Dec 31 00:24 web-2020-12-31-00-24-20
drwxr-xr-x 8 root root 4096 Dec 31 00:25 web-2020-12-31-00-25-47
drwxr-xr-x 8 root root 4096 Dec 31 13:04 web-2020-12-31-13-04-52-v1.2
drwxr-xr-x 8 root root 4096 Dec 31 13:31 web-2020-12-31-13-31-36-v1.3

注意:回退一定要是之前部署过的版本才能回退

  1. 重复构建
  1. Jenkins的环境变量
GIT_COMMIT
    The commit hash being checked out.

GIT_PREVIOUS_SUCCESSFUL_COMMIT  # 该变量会记录上一次成功提交的信息(commit ID). 如果是第一次提交, 这个变量的值就是个空值. 如果上一次提交成功, 那么这个previous变量就会记录上一次提交的信息(commit ID). 我们可以实现, 如果重复提交就会报错. 可以通过变量判断实现
    The hash of the commit last successfully built on this branch, if any.

if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];
        说明项目已经部署过

举例:

假设第一次提交, commit id是123456, 这时两个变量值是不相等的, 如果不相等, 我们就执行部署. 如果成功, 那么123456就会存到previous变量

如果第二次又提交123456这个ID号, 那么这时两个变量的值就是相当的, 我们就认为这个commit已经部署过了, 就不在部署了

  1. 修改构建脚本, 静态页面最终版
vim html_deploy_tag_rollback.sh
DATE=`date +%Y-%m-%d-%H-%M-%S`
web_server="10.0.0.81 10.0.0.82"
#代码打包路径
sdir="/opt"
#代码部署路径
ddir="/code"
#1. 进入到项目目录, 将内容进行打包
get_code(){
        cd ${WORKSPACE} && \
        tar czf ${sdir}/web-${DATE}-${git_version}.tar.gz ./*
}
#2. 将内容通过scp拷贝至web集群组
scp_web_server(){
for host in $web_server; do
    scp ${sdir}/web-${DATE}-${git_version}.tar.gz root@$host:${sdir}
    ssh root@$host "mkdir -p ${ddir}/web-${DATE}-${git_version} && \
                    tar xf ${sdir}/web-${DATE}-${git_version}.tar.gz -C ${ddir}/web-${DATE}-${git_version} && \
                    rm -rf ${ddir}/web && \
                    ln -s ${ddir}/web-${DATE}-${git_version} ${ddir}/web"
done
}
deploy(){
        get_code
        scp_web_server

}


rollback(){

rollback_file=`ssh root@10.0.0.81 "find /code/ -maxdepth 1 -type d -name "web-*-${git_version}""`

for host in $web_server; do
    ssh root@$host "rm -rf ${ddir}/web && \
                    ln -s ${rollback_file} ${ddir}/web"
done


}

if [ ${deploy_env} == "deploy" ]; then
# 如果选择了deploy部署, 就要判断这次部署的commit id, 是否在历史成功记录中有记录, 如果有就提示已经部署过了. GIT_COMMIT是jenkins拉取某个版本的代码后, 返回其commit id, 而GIT_PREVIOUS_SUCCESSFUL_COMMIT返回的是, 当前要部署的这个代码的COMMIT ID在整个jenkins部署成功历史中有没有记录, 如果没有记录就会返回空, 那么说明这个版本没有部署过, 如果有记录, 就会返回这个commit id, 通过条件判断, 因为这时这个commit id和当前要部署的id是相等的, 就会提示已经部署过
    if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ]; then
        echo "已经部署过该版本, ${git_version}"
        exit 1
    else
        deploy
    fi
    
    
elif [ ${deploy_env} == "rollback" ]; then 
    rollback 
fi 
  1. 测试脚本, 部署此前部署过的版本
图片.png 图片.png
  1. 测试部署新的版本
[20:49:18 root@developer-2 ~/monitor]#vim index.html
 <a class="logo pull-left" href="index.html" style="width: 233px">哈哈哈-v.1.4/a> 
[20:49:37 root@developer-2 ~/monitor]#git add .
[20:49:40 root@developer-2 ~/monitor]#git commit -m "v1.4"
[master a6f547f] v1.4
 1 file changed, 1 insertion(+), 1 deletion(-)
[20:49:45 root@developer-2 ~/monitor]#git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 304 bytes | 304.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
To gitlab.abc.com:devops/monitor.git
   747844f..a6f547f  master -> master
[20:49:54 root@developer-2 ~/monitor]#git tag -a "v1.4" -m "v1.4"
[20:50:04 root@developer-2 ~/monitor]#git push origin v1.4
Enumerating objects: 1, done.
Counting objects: 100% (1/1), done.
Writing objects: 100% (1/1), 159 bytes | 159.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0), pack-reused 0
To gitlab.abc.com:devops/monitor.git
 * [new tag]         v1.4 -> v1.4
图片.png 图片.png
上一篇下一篇

猜你喜欢

热点阅读