Jenkins实现html代码上线与回滚
一、案例环境
二、部署Gitlab
1)部署Gitlab
2) 配置免密登录
3)测试免密登录
三、部署Jenkins
四、Jenkins集成Gitlab
五、部署Nginx
六、Jenkins实现代码自动上线
七、Jenkins实现代码自动部署与回退及重复构建
一、案例环境
系统 | IP地址 | 主机名 | 所运行的服务 |
---|---|---|---|
Centos 7 | 192.168.1.6 | gitlab | gitlab |
Centos 7 | 192.168.1.7 | jenkins | jenkins |
Centos 7 | 192.168.1.8 | nginx | nginx |
二、部署Gitlab
1)部署Gitlab
[root@gitlab ~]# yum -y install epel-release curl openssh-server openssh-clients postfix cronie policycoreutils-python patch#安装所需依赖[root@gitlab ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm#对gitlab的版本并没有什么特殊的限制[root@gitlab ~]# yum -y localinstall gitlab-ce-12.3.5-ce.0.el7.x86_64.rpm[root@gitlab ~]# vim /etc/gitlab/gitlab.rb #便于使用URL路径访问external_url 'http://192.168.1.6'#下载 中文补丁包[root@gitlab ~]# head -1 /opt/gitlab/version-manifest.txt #查看gitlab的版本gitlab-ce 12.3.5[root@gitlab ~]# git clone https://gitlab.com/xhang/gitlab.git -b v12.3.5-zh[root@gitlab ~]# cd gitlab/[root@gitlab gitlab]# git diff v12.3.5 v12.3.5-zh > /root/v12.3.5-zh.dif[root@gitlab gitlab]# patch -d /opt/gitlab/embedded/service/gitlab-rails -p1 < ../v12.3.5-zh.diff #将刚才的diff文件做为补丁导入到gitlab中#该命令执行过程中,一路回车跳过即可[root@gitlab ~]# gitlab-ctl start # 启动gitlab[root@gitlab ~]# gitlab-ctl reconfigure #重新配置gitlab
web页面访问测试
可以看出gitlab的网站页面已经汉化!
2) 配置免密登录
[root@gitlab ~]# ssh-keygen [root@gitlab ~]# cat ~/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCuWnEReFVhIiODuTO/NzdjuvPMY0tQ89NuYGtMxDJJAXnbChK8dbe0Iu4GNHY9zeSP0OaYJvVV9Nu/qtcZqgg+zKgLohdoI5QKXWcZ1JT/kNpIbnVnUYE0/AYZ8nMbjNiUsSD5BaDy+t9uuRxh+QCOrZDkYZw1EZioDpDoSR1XzrOac69QIag2XUU04rmWkR9/fbfwGzusTzfO2thk3vcZn+DzLqJqYy9ufkZeTGlqJnVC6//caakMtY475NSUKnGT+YoRsStXXI/9CVrpY8cPZ5eiFs34xGZWU1uhsx9UQ50pNeA7iqM6CIKpb4MPtqKDLIb83Bztz1VsfBJRMxer root@gitlab#本地生成密钥对,便于ssh登录
3)测试免密登录
[root@gitlab ~]# git clone git@192.168.1.6:root/web-demo.git#确认无需输入密码
三、部署Jenkins
[root@jenkins ~]# wget https://mirrors-i.tuna.tsinghua.edu.cn/jenkins/redhat/jenkins-2.172-1.1.noarch.rpm[root@jenkins ~]# yum -y localinstall jenkins-2.172-1.1.noarch.rpm#获取Jenkins软件包,并安装[root@jenkins ~]# systemctl start jenkins #启动Jenkins
web页面访问
由于刚才跳过了插件安装,,所以需要自己手动安装,下载本人提供的插件软件包,下载链接:https://pan.baidu.com/s/16fxH1J0WO6tW1bhPwmd60w
提取码:432n
[root@jenkins ~]# rm -rf /var/lib/jenkins/plugins/ #将安装产生的插件目录进行删除[root@jenkins ~]# tar zxf jenkins-plugins.tar.gz -C /var/lib/jenkins/#将插件软件包解压到指定的位置[root@jenkins ~]# sed -i 's/http:\/\/updates.jenkinsci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' /var/lib/jenkins/updates/default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' /var/lib/jenkins/updates/default.json#将jenkins下载插件的路径,更改为国内源[root@jenkins ~]# systemctl restart jenkins #重新启动Jenkins
再次访问web页面:
再次访问Jenkins,可以发现已经变成中文了,因为插件中包含了中文插件!
四、Jenkins集成Gitlab
[root@jenkins ~]# ssh-keygen #Jenkins服务生成密钥对[root@jenkins ~]# cat ~/.ssh/id_rsa.pub #查看公钥信息ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDbcFk7tkBes+S6BIVLxzLVj8X7bThDYscpY6uBeauHp+tPTL6CRVQDOlUcMRsyaX7o+a26iPd+yhJUaB+qT4iW1cVjhEiuKiR2NJSJdnEqccgcXWPJzIe+Owj76ofBtIhKqLGzwnYj6Lj0KmjUhn7tASu1bZ8hWubJ2ZQUottOW8KqjvHIb7q8OsGty9tsLVV3gD1XF1cE1s9rXY7XUFxDwtu1kfiA2XhSyJ3EmTWFlFlvaqzhQDBELWSVBz/4CihAfIp2eW7nx8TPXG0d0j+OwQYcccsarwkjHuc2IYRv4gVAhtRyXj8VQ7+LBsjYjfIMBTw4CFwQSTfZnWaa6Fcf root@jenkins
将公钥信息存放在gitlab上:
[root@jenkins ~]# cat ~/.ssh/id_rsa#查看Jenkins服务器的私钥信息,需要将私钥信息存放在Jenkins的web页面上-----BEGIN RSA PRIVATE KEY-----MIIEpAIBAAKCAQEA23BZO7ZAXrPkugSFS8cy1Y/F+204Q2LHKWOrgXmrh7frT0y+gkVUAzpVHDEbMml+6Pmtuoj3fsoSVGgfqk+IltXFY4RIriokdjSUiXZxKnHIHF1jycyHvjsI++qHwbSISqixs8J2I+i49Cpo1IZ+7QErtW2fIVrmydmUFKLbTlvCqo7xyG+6vDrBrcvbbC1Vd4A9VxdXBNbPa12O11BcQ8LbtZH4gNl4UsidxJk1hZRZb2qs4UAwRC1klQc/+AooQHyKdnlu58fEz1xtHdI/jsEGHHHLGq8JIx7nNiGEb+IFQIbUcl4/FUO/iwbI2I3yDAU8OAhcEEk32Z1mmuhXHwIDAQABAoIBAQDXcb6qeY1JbaWrXLTiaXjnZHklGV6cCmcvo8PHIwXd8md9PAPvMtIBOUxGmY/yNtF7O2fuNHuJ6CuG45PzSpL4RHm/8yjIlmemBomvTLJe0cd+0dIfVsgPZTa03tbav7zwUB/oNYx4RQ0R7HFv93y2hOe9ARuzS+Q7WXuhpyNaEbvsqQGaeyw0xnBZyopv12CJRtT5PoITeEgv0meaDiXttkUZd1r3MLutAHsBpvuAUypoOppsUvbJ6Gsv3j4pd6aOHVEomEMaTZf7hRLNihnTfbj0t3yz/wKZ1FfamHbjRNnML1R+vnv4zEdPFmCJG3mAABQOgja2vwvkRxq3/L5BAoGBAO3/ar7ClBgFc09cqz8+jbIOI9pXdP5SoZh9S8B61qi6Nxie192CnHLc7qjFNCudOBV25+l98ZLCElWjiMcpAD/AH125dE15K+U0qBn0fJvegMWAiTHV9Av9m39oSnnuu8tVW/AbWjV86EzCRLcpQ+Q5i45HK+d/UIUv8BHGxqG9AoGBAOwJjuWRuh/+KSw6jJa52sZjkg6m0VAQB7dsQssIhQhQbZvgaLur2bQlf6iJPOHGLnPsZVe/LP3VwVgd6+hWo3uPVwjgHyblfLQva7rRXyilv84UMDVHrP1dsg9bEEuckit21A9ZMzqdUlAkFZ8aSDq4DRAjggIzf7SnoMt1aTQLAoGAFi116f7BxBdF7oBJKOSQWaY9qwv5R/W1Pzt1wqLvu9tWZQHwRaD1KTLzPmDaArJs1ns1Eyn8R9uzz60kgsKMVmR1x8sPTmTbNUmZ3IlOz0uFnmHi5vTz/+YLBm1We1RGxaTXo2E5H8Da+MQlmRfMTskZ+xEgwzq26yJTcaSfP9UCgYBwbzUkYcBZUQZnzRP/EFUIP5HpbMkz7A7g7q76a/qCtV0g7Uq2auvvBhXDQGxB19d03NyBac2StGm/AbHIIM0LJIJ+9dOhAZvfcN9OREGh7SJuletI1fWvUxxoeCZQ/ioajiYBkan3d80n46hw+2IApn+CeoeJaOKiOV88y5brdQKBgQCZ3pDpf4wKfR2IYDRLHXsxG4s8Td25HNtIt/ejmnGPWYQgDHl2dLpURzTTI6lIFaLTEPAVc4VhlfoltFvLSbm8fUoQfHhPEaGJeDzKSLq52oOQtYMZ/iIRP6KH210ZgZjuJHQOUqeA954epRnbIosgrWz0G7qNjrpoHZkPcWXxmQ==-----END RSA PRIVATE KEY-----
安装jenkins集成gitlab所需的插件,下载链接:https://pan.baidu.com/s/1p_jh8X3ma46SEV_tKLKYbw
提取码:zoej
安装插件,如图:
依次上传我提供的包,顺序如下:gitlab-oauth-->gitlab-plugin --> windows-slaves -->ruby-runtime -->gitlab-hook即可!
清华大学Jenkins源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
gitlab服务器提交代码到gitlab,测试拉取代码:
[root@gitlab ~]# cd web-demo/[root@gitlab web-demo]# git config --global user.email "you@example.com"[root@gitlab web-demo]# git config --global user.name "Your Name"[root@gitlab web-demo]# echo "123" >> 123.txt[root@gitlab web-demo]# git add .[root@gitlab web-demo]# git commit -m '123'[root@gitlab web-demo]# git push origin master
Jenkins服务器进行构建:
构建成功!
五、部署Nginx
使用Nginx来模拟上线环境!
[root@nginx ~]# yum install -y gcc gcc- c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree#由于是最小化安装的系统,所以安装一些必要的软件[root@nginx ~]# vim /etc/yum.repos.d/nginx.repo#配置nginx的yum源,Nginx官方也有相应的配置信息[nginx]name=nginx_repo baseurl=http://nginx.org/packages/centos/7/$basearch/gpgcheck=0enabled=1#该yum源默认情况下安装的是nginx最新的、稳定版[root@nginx ~]# yum -y install nginx #安装nginx#对nginx的版本没有要求,只是为了使用访问效果而已[root@nginx ~]# rm -rf /etc/nginx/conf.d/default.conf #删除默认的配置文件[root@nginx ~]# vim /etc/nginx/conf.d/server.conf#新建配置文件server { listen 80; location / { root /code/web; index index.html index.htm; }}[root@nginx ~]# mkdir -p /code/web[root@nginx ~]# nginx -t[root@nginx ~]# systemctl start nginx
六、Jenkins实现代码自动上线
1)Jenkins服务编写上线脚本
[root@jenkins ~]#mkdir /scripts && cd /scripts/[root@jenkins scripts]# vim html_deploy.sh #!/bin/bashDATE=$(date +%Y-%m-%d-%H-%M-%S)web_server="192.168.1.8"Sdir=/optDdir=/code#1)进入项目目录,将内容进行打包,${WORKSPACE}是Jenkins的内置变量,表示构建目录的绝对路径get_code(){ cd ${WORKSPACE} && \ tar zcf ${Sdir}/web-${DATE}.tar.gz ./*}#2)将内容通过scp复制到web网页目录scp_web_server(){for hosts in ${web_server}do scp ${Sdir}/web-${DATE}.tar.gz root@${hosts}:/opt ssh root@${hosts} "mkdir -p ${Ddir}/web-${DATE} && \ tar zxf ${Sdir}/web-${DATE}.tar.gz -C ${Ddir}/web-${DATE} rm -rf ${Ddir}/web && \ ln -s ${Ddir}/web-${DATE} ${Ddir}/web"done}deploy(){ get_code scp_web_server} deploy[root@jenkins scripts]# chmod +x html_deploy.sh [root@jenkins scripts]# ps -ef | grep jenkins#可以看出jenkins的运行用户是jenkinsjenkins 58626 1 1 11:23 ? 00:00:39 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkinsjenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20root 61336 2046 0 12:06 pts/0 00:00:00 grep --color=auto jenkins[root@jenkins scripts]# vim /etc/sysconfig/jenkins JENKINS_USER="root"#为了防止权限问题,直接将jenkins的运行用户改为root[root@jenkins scripts]# systemctl restart jenkins#重启jenkins服务[root@jenkins scripts]# ssh-copy-id root@192.168.1.8#配置Jenkins可以免密登录到nginx服务器
2)git服务器编辑网页代码并上传:
[root@gitlab web-demo]# echo "lvzhenjiang" >> index.html[root@gitlab web-demo]# git add .[root@gitlab web-demo]# git commit -m "first"[root@gitlab web-demo]# git push origin master
有兴趣可以构建时的控制台输出!
访问nginx进行测试!
确认是刚才gitlab服务器提交的代码信息!
[root@nginx ~]# ll /code #查看网页目录实现的具体过程#可以查看到真正的网页目录是别的目录链接过去的总用量 0lrwxrwxrwx 1 root root 29 2月 25 19:37 web -> /code/web-2020-02-25-19-37-13drwxr-xr-x 2 root root 39 2月 25 19:37 web-2020-02-25-19-37-13
这种方式发布还有很多地方需要完善,比如回退,接下来使用tag的方式发布!
七、Jenkins实现代码自动部署与回退及重复构建
让项目支持tag的方式上线,便于我们进行区分!
1)git服务器创建几个tag标签并上传至gitlab:
[root@gitlab ~]# cd web-demo/[root@gitlab web-demo]# echo "lvzhenjiang-version-v1.1
" > index.html[root@gitlab web-demo]# git add .[root@gitlab web-demo]# git commit -m "v1.1"[root@gitlab web-demo]# git push origin master[root@gitlab web-demo]# git tag -a "v1.1" -m "v1.1"[root@gitlab web-demo]# git push origin v1.1[root@gitlab web-demo]# echo "lvzhenjiang-version-v1.2
" > index.html[root@gitlab web-demo]# git add .[root@gitlab web-demo]# git commit -m "v1.2"[root@gitlab web-demo]# git push origin master[root@gitlab web-demo]# git tag -a "v1.2" -m "v1.2"[root@gitlab web-demo]# git push origin v1.2[root@gitlab web-demo]# echo "lvzhenjiang-version-v1.3
" > index.html[root@gitlab web-demo]# git add .[root@gitlab web-demo]# git commit -m "v1.3"[root@gitlab web-demo]# git push origin master[root@gitlab web-demo]# git tag -a "v1.3" -m "v1.3"[root@gitlab web-demo]# git push origin v1.3
2)Jenkins服务器安装插件并配置:
使用该方式就需安装插件:Git Parameter。
安装方式:系统管理-->插件管理-->可选插件--搜索Git Parameter-->直接安装!
[root@jenkins ~]# systemctl restart jenkins#安装完成后,需重启Jenkins![root@jenkins ~]# cd /scripts/[root@jenkins scripts]# vim html_deploy_tag.sh #优化脚本#!/bin/bashDATE=$(date +%Y-%m-%d-%H-%M-%S)web_server="192.168.1.8"Sdir=/optDdir=/codeName=${DATE}-${git_version} #${git_version}是在jenkins界面定义的变量#1)进入项目目录,将内容进行打包#${WORKSPACE}是Jenkins的内置变量,表示构建目录的绝对路径get_code(){ cd ${WORKSPACE} && \ tar zcf ${Sdir}/web-${Name}.tar.gz ./*}#2)将内容通过scp复制到web网页目录scp_web_server(){for hosts in ${web_server}do scp ${Sdir}/web-${Name}.tar.gz root@${hosts}:/opt ssh root@${hosts} "mkdir -p ${Ddir}/web-${Name} && \ tar zxf ${Sdir}/web-${Name}.tar.gz -C ${Ddir}/web-${Name} rm -rf ${Ddir}/web && \ ln -s ${Ddir}/web-${Name} ${Ddir}/web"done}deploy(){ get_code scp_web_server} deploy[root@jenkins scripts]# chmod +x html_deploy_tag.sh
接下来:
访问nginx:
[root@nginx ~]# ll /code #这样就可以很清楚的查看构建的是哪个版本总用量 0lrwxrwxrwx 1 root root 34 2月 25 20:21 web -> /code/web-2020-02-25-20-21-18-v1.3drwxr-xr-x 2 root root 39 2月 25 19:37 web-2020-02-25-19-37-13drwxr-xr-x 2 root root 39 2月 25 20:21 web-2020-02-25-20-21-18-v1.3
部署到此。回退的问题仍没有解决!比如:部署两次v1.3版本就会产生两个v1.3的目录!
3)解决版本回退、重复构建的问题
[root@jenkins scripts]# vim html_deploy_tag_rollback.sh #优化脚本,支持回退#!/bin/bashDATE=$(date +%Y-%m-%d-%H-%M-%S)web_server="192.168.1.8"Sdir=/optDdir=/codeName=${DATE}-${git_version} #${git_version}是在jenkins界面定义的变量#1)进入项目目录,将内容进行打包#${WORKSPACE}是Jenkins的内置变量,表示构建目录的绝对路径get_code(){ cd ${WORKSPACE} && \ tar zcf ${Sdir}/web-${Name}.tar.gz ./*}#2)将内容通过scp复制到web网页目录scp_web_server(){for hosts in ${web_server}do scp ${Sdir}/web-${Name}.tar.gz root@${hosts}:/opt ssh root@${hosts} "mkdir -p ${Ddir}/web-${Name} && \ tar zxf ${Sdir}/web-${Name}.tar.gz -C ${Ddir}/web-${Name} rm -rf ${Ddir}/web && \ ln -s ${Ddir}/web-${Name} ${Ddir}/web"done}rollback(){back_file=$(ssh root@${web_server} "find /code/ -maxdepth 1 -type d -name "web-*-${git_version}"")for hosts in ${web_server}do ssh root@${hosts} "rm -rf ${Ddir}/web && \ ln -s ${back_file} ${Ddir}/web"done}deploy(){ get_code scp_web_server}#判断之前是否部署过该版本的commit,如果没有部署则部署,如果有则提示已经部署过然后退出#如果是回退,则不受限制if [ ${deploy_env} == "deploy" ];then if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then echo "你已经部署过该${git_version}版本" exit 1 else deploy fielif [ ${deploy_env} == "rollback" ];then rollbackfi[root@jenkins scripts]# chmod +x html_deploy_tag_rollback.sh
接下来配置:
测试:
web页面:
执行回退操作:
有兴趣可以构建时的控制台输出!
web页面:
[root@nginx ~]# ll /code #可以看出只创建了一次v1.3的目录总用量 0lrwxrwxrwx 1 root root 34 2月 25 20:46 web -> /code/web-2020-02-25-20-21-18-v1.3drwxr-xr-x 2 root root 39 2月 25 19:37 web-2020-02-25-19-37-13drwxr-xr-x 2 root root 39 2月 25 20:21 web-2020-02-25-20-21-18-v1.3drwxr-xr-x 2 root root 39 2月 25 20:46 web-2020-02-25-20-46-15-v1.1
重复构建、回退问题解决!
--------本文到此结束,感谢阅读--------