CI/CD
软件开发的连续方法基于自动实行脚本,以最大限度地减少在开发应用步调时引入错误的可能性。从新代码的开发到摆设,它们需要较少的人为干预甚至根本不需要干预。
它涉及在每次小迭代中不断构建,测试和摆设代码更改,从而减少基于有缺陷或失败的先前版本开发新代码的机会。
这种方法有三种主要方法,每种方法都根据最适合的策略进行应用。
持续集成(Continuous Integration, CI): 代码合并,构建,摆设,测试都在一起,不断地实行这个过程,并对结果反馈。
持续摆设(Continuous Deployment, CD): 摆设到测试环境、预生产环境/灰度环境、生产环境。
持续交付(Continuous Delivery, CD): 将最终产品发布到生产环境、给互联网用户利用。
- 持续集成/持续发布--项目---开发(git) -->git主库-->jenkins(调用maven打包+测试)-->发布到后端服务器
复制代码 一、jenkins介绍
Jenkins是帮我们将代码进行统一的编译打包、还可以直接放到后端服务器中进行发布。我们通过设置jenkins,将从前:编译、打包、上传、摆设到后端服务器中的过程交由Jenkins,Jenkins通过给定的代码地址URL,将代码拉取到其“宿主服务器”(Jenkins的安装位置),进行编译、打包和发布到web容器中。
1、Jenkins概述
- Jenkins是一款开源的、提供友好操作界面的持续集成(CI/CD)工具,主要用于持续、自动的构建的一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的容器中运行,也可独立运行。
复制代码 jenkins通常与版本管理工具(SCM)、构建工具联合利用;常用的版本控制工具有SVN、GIT。jenkins构建工具有Maven、Ant、Gradle。
2、Jenkins目的
- 提高开发效率以及过程控制:
- jenkins的主要目标是监控软件开发流程,快速显示问题。 所以能保证开发人员以及相关人员省时省力提高开发效率。
- CI系统在整个开发过程中的主要作用是控制:当系统在代码库中检测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么CI系统将通知相关人员,然后继续监视代码库。
复制代码 3、Jenkins特性
- 1.易于安装 #不需要安装、不需要数据库,只需通过java -jar jenkins.war或部署到一个java容器中
- 2.易于配置 #所有的配置都可能通过jenkins提供的web界面完成,当然如果你喜欢,也可以通过手动修改xml文件进行配置
- 3.文件识别 #jenkins能跟踪每次构建生成的是war包还是jar包,以及使用哪个版本的包。
- 4.分布式构建 #支持Jenkins能够让多台计算机一起构建/测试。
- 5.任务(Job)和构建(build) #任务:(Job)是Jenkins的一个执行计划,是一系列操作的集合。构建:是Jenkins的任务的一次运行。
- 6.插件支持 #jenkins可以通过第三方插件扩展,也可以根据团队需要开发插件
- 6.跨平台 #支持所有的平台
复制代码 工作流程图:
- 测试环境中:
- 1.开发者会将代码上传到版本库中。
- 2.jenkins通过配置版本库的连接地址,获取到源代码。
- 3.jenkins获取到源代码之后通过参数化构建(或者触发器)开始编译打包。
- 4.jenkins通过调用maven(Ant或者Gradle)命令实现编译打包过程。
- 5.生成的war/jar包通过ssh插件上传到远程后端服务器中通过shell脚本自动发布项目。
- 生产环境:
- 测试环境将项目测试没问题后,将项目推送到线上正式环境。
- 1.可以选择手动。
- 2.也可以通过调用脚本推送过去。
复制代码 4、Jenkins面试
jenkins如何将代码发布到后端服务器的?利用的ssh的方式
jenkins如何获取到代码的?在jenkins设置git仓库url地址
Jenkins利用什么命令进行的打包?前端利用npm;后端利用maven
jenkins的上线流程(利用什么方式上线?)
二、摆设Jenkins实战
1、准备环境
- 三台机器
-
- git-server ----https://github.com/bingyue/easy-springmvc-maven
-
- jenkins-server ---192.168.246.212---最好是3个G以上
-
- java-server -----192.168.246.210
-
- https://github.com/bingyue/easy-springmvc-maven 或者
- https://gitee.com/bingyu076/easy-springmvc-maven.git
复制代码 1. 摆设jenkins服务器
- 安装git客户端
- [root@jenkins-server ~]# yum install -y git #安装git客户端
- [root@jenkins-server ~]# ssh-keygen
- [root@jenkins-server ~]# ssh-copy-id -i root@192.168.246.210 #拷贝到后端java服务器
- 开始部署jenkins:
- 从Jenkins2.164(2019年2月10日发布)和 LTS 2.164.1(ETA:3月14日)开始,在 Jenkins 中全面支持 Java 11。
- <strong>1.配置安装jdk11</strong>
- [root@jenkins-server ~]# tar xzf jdk-11.0.20_linux-x64_bin.tar.gz -C /usr/local/
- [root@jenkins-server ~]# cd /usr/local/
- [root@jenkins-server local]# mv jdk-11.0.20/ java
- <strong>2.安装tomcat</strong>
- [root@jenkins-server ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.52/bin/apache-tomcat-9.0.52.tar.gz
- [root@jenkins-server ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /usr/local/
- [root@jenkins-server ~]# cd /usr/local/
- [root@jenkins-server local]# mv apache-tomcat-8.5.42/ tomcat
- <strong>3.安装maven</strong>
- [root@jenkins-server ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.5.4/binaries/apache-maven-3.5.4-bin.tar.gz
- [root@jenkins-server ~]# tar xzf apache-maven-3.5.4-bin.tar.gz -C /usr/local/java
- [root@jenkins-server ~]# cd /usr/local/java
- [root@jenkins-server java]# mv apache-maven-3.5.4/ maven
- <strong>设置环境变量</strong>
- [root@jenkins-server ~]# vim /etc/profile
- JAVA_HOME=/usr/local/java
- PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
- MAVEN_HOME=/usr/local/java/maven
- export JAVA_HOME MAVEN_HOME PATH
- [root@jenkins-server ~]# source /etc/profile
- 验证:
- [root@jenkins-server ~]# java -version
- java version "1.8.0_191"
- Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
- Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
- [root@jenkins-server ~]# mvn -v
- Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
- Maven home: /usr/local/java/maven
- Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/local/java/jre
- Default locale: en_US, platform encoding: UTF-8
- OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"
-
- <strong>下载jenkins的安装包</strong>
- 安装jenkins:2.426.1 ----通过官网直接下载war包。
- 官网:https://www.jenkins.io/download/
- [root@jenkins-server ~]# wget https://get.jenkins.io/war-stable/2.426.1/jenkins.war --no-check-certificat
-
- 最新版本的jenkins需要字体支持,但是目前系统缺少字体--需要安装字体
- [root@jenkins-server ~]# yum install fontconfig -y
- <strong>部署jenkins</strong>
- [root@jenkins-server ~]# cd /usr/local/tomcat/webapps/
- [root@jenkins-server webapps]# rm -rf *
- [root@jenkins-server webapps]# cp /root/jenkins.war .
- [root@jenkins-server webapps]# ../bin/startup.sh
- Using CATALINA_BASE: /usr/local/tomcat
- Using CATALINA_HOME: /usr/local/tomcat
- Using CATALINA_TMPDIR: /usr/local/tomcat/temp
- Using JRE_HOME: /usr/local/java
- Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
- Tomcat started.
复制代码 如果启动了访问提示
办理办法在
- [root@jenkins-server ~]# cd /usr/local/tomcat/conf/
- [root@jenkins-server conf]# vim context.xml -----添加如下内容:
- <Resources
- cachingAllowed="true"
- cacheMaxSize="100000"
- />
复制代码
重启tomcat
2.如果还是不行:
- [root@jenkins ~]# cd .jenkins/updates/ 到jenkins的工作目录下
- [root@jenkins updates]# vim default.json
- 把 "connectionCheckUrl":"http://www.google.com/" 改为 "connectionCheckUrl":"http://www.baidu.com/"
复制代码 3.要是还是不行:
- 需要你进入jenkins的工作目录,打开-----hudson.model.UpdateCenter.xml
- 把http://updates.jenkins-ci.org/update-center.json
- 改成
- http://mirror.xmission.com/jenkins/updates/update-center.json
- 每次改完记得重启!
复制代码 利用运行war的情势安装jenkins,因为伟大的墙出现,“该jenkins实例好像已离线” 问题:
办理办法:
-
- 需要你进入jenkins的工作目录,打开-----hudson.model.UpdateCenter.xml将 url 中的 https://updates.jenkins.io/update-center.json 更改为http://updates.jenkins.io/update-center.json,即去掉 https 中的 s 。
- 或者更改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 是国内的清华大学的镜像地址。
- 然后重启tomcat
复制代码 ========================================================================
访问界面: ---需要多等一会
http://192.168.246.212:8080/jenkins
2、登录jenkins
- [root@jenkins-server ~]# cat /opt/jenkins/secrets/initialAdminPassword
- b36b8b04c5b84e659701304dfe848999 ---复制这个密码粘贴到上面提示的空格里面。
复制代码 点击:安装推荐的插件
等待安装
填写管理员信息 ,这里密码设置的为123456
如果安装失败,打开settings.xml添加阿里源
- [root@jenkins-server ~]# vim /usr/local/java/maven/conf/settings.xml +160
- # 添加阿里源
- </mirror>
- <mirror>
- <id>aliyunmaven</id>
- <mirrorOf>*</mirrorOf>
- <name>阿里云公共仓库</name>
- <url>https://maven.aliyun.com/repository/public</url>
- </mirror>
- </mirrors>
复制代码
点击生存完成
开始利用Jenkins
3、安装插件
- 安装插件:
- 所需的插件:
- • Maven插件 Maven Integration plugin
- • 发布插件 Deploy to container Plugin
- 需要安装插件如下:
- =======================================================
- 安装插件
- <strong>Deploy to container</strong> ---支持自动化代码部署到tomcat容器
- GIT pligin 可能已经安装
- <strong>Maven Integration</strong> :jenkins利用Maven编译,打包所需插件
- <strong>Publish Over SSH</strong> :通过ssh连接将打包的war包拷贝到后端服务器
- <strong>ssh 插件</strong>
- <strong>Email Extension Plugin</strong> 安装邮件插件
- 安装过程:
- 系统管理--->插件管理---->可选插件--->过滤Deploy to container---->勾选--->直接安装
复制代码
输入插件名后按回车!
安装gitlab插件
以上全部插件安装完成
4、设置Jenkins
设置ssh
翻到最下面
key:指的是jenkins服务器用哪个用户去远程毗连步调服务器就是谁人用户的私钥。
- [root@localhost ~]# cat .ssh/id_rsa
复制代码 添加远程ssh-server
设置邮件
(用于之后项目构建后发送邮件)
设置扩展邮件通知
- 邮件主题:
- 构建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !
复制代码- 邮件内容:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>
- </head>
-
- <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
- offset="0">
- <table width="95%" cellpadding="0" cellspacing="0" style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
- <tr>
- 本邮件由系统自动发出,无需回复!<br/>
- 各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
- <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>
- </tr>
- <tr>
- <td><br />
- <b><font color="#0B610B">构建信息</font></b>
- <hr size="2" width="100%" align="center" /></td>
- </tr>
- <tr>
- <td>
- <ul>
- <li>项目名称 : ${PROJECT_NAME}</li>
- <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
- <li>触发原因: ${CAUSE}</li>
- <li>构建状态: ${BUILD_STATUS}</li>
- <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
- <li>构建 Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>
- <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>
- <li>项目 Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>
- </ul>
-
- <h4><font color="#0B610B">失败用例</font></h4>
- <hr size="2" width="100%" />
- $FAILED_TESTS<br/>
-
- <h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
- <hr size="2" width="100%" />
- <ul>
- ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
- </ul>
- 详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
-
- </td>
- </tr>
- </table>
- </body>
- </html>
复制代码 设置邮箱触发器
可根据实际环境选择触发条件,此处选择 总是
管理监控设置--->体系管理员邮件地址:along@163.com,要和下面的用户名划一;
邮件通知,设置如下:可以点击测试,是否设置成功
然后应用生存
设置jdk,maven命令,git全局设置
构建发布使命
调用maven命令
指定打包文件:pom.xml
设置构建后操纵模块
摆设java服务器,做jenkins打包上线
- [root@java-server ~]# mkdir -p /data/application
- 上传jdk
- [root@java-server ~]# tar xzf jdk-8u191-linux-x64.tar.gz -C /usr/local/
- [root@java-server ~]# cd /usr/local/
- [root@java-server local]# mv jdk1.8.0_191/ java
- 下载tomcat
- [root@java-server ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.42/bin/apache-tomcat-8.5.42.tar.gz
- [root@java-server ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /data/application/
- [root@java-server ~]# cd /data/application/
- [root@java-server application]# mv apache-tomcat-8.5.42/ tomcat
- 设置环境变量
- [root@java-server ~]# vim /etc/profile
- export JAVA_HOME=/usr/local/java
- export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
- export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
- export TOMCAT_HOME=/data/application/tomcat
- [root@java-server ~]# source /etc/profile
- 测试:
- [root@java-server ~]# java -version
- java version "1.8.0_191"
- Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
- Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
- 删除tomcat默认发布目录下面的内容:
- [root@java-server ~]# rm -rf /data/application/tomcat/webapps/*
- [root@java-server ~]# cd /data/application/tomcat/webapps/
- [root@java-server webapps]# ls
- 创建目录和脚本:
- [root@java-server ~]# mkdir /opt/script #创建脚本目录
- [root@java-server ~]# vim app-jenkins.sh #创建脚本
- 脚本内容在后面
- [root@java-server ~]# chmod +x app-jenkins.sh #添加执行权限
- [root@java-server ~]# mv app-jenkins.sh /opt/script/
复制代码 回到jenkins页面开始构建使命
登陆java-server服务器检察
- 脚本内容:
- [root@java-server script]# cat app-jenkins.sh
- #!/usr/bin/bash
- #本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
- #================
- #Defining variables
- export JAVA_HOME=/usr/local/java
- webapp_path="/data/application/tomcat/webapps"
- tomcat_run="/data/application/tomcat/bin"
- updata_path="/data/update/`date +%F-%T`"
- backup_path="/data/backup/`date +%F-%T`"
- tomcat_pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`
- files_dir="easy-springmvc-maven"
- files="easy-springmvc-maven.war"
- job_path="/root/upload"
- #Preparation environment
- echo "Creating related directory"
- mkdir -p $updata_path
- mkdir -p $backup_path
- echo "Move the uploaded war package to the update directory"
- mv $job_path/$files $updata_path
- echo "========================================================="
- cd /opt
- echo "Backing up java project"
- if [ -f $webapp_path/$files ];then
- tar czf $backup_path/`date +%F-%H`.tar.gz $webapp_path
- if [ $? -ne 0 ];then
- echo "打包失败,自动退出"
- exit 1
- else
- echo "Checking if tomcat is started"
- if [ -n "$tomcat_pid" ];then
- kill -9 $tomcat_pid
- if [ $? -ne 0 ];then
- echo "tomcat关闭失败,将会自动退出"
- exit 2
- fi
- fi
- cd $webapp_path
- rm -rf $files && rm -rf $files_dir
- cp $updata_path/$files $webapp_path
- cd /opt
- $tomcat_run/startup.sh
- sleep 5
- echo "显示tomcat的pid"
- echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
- echo "tomcat startup"
- echo "请手动查看tomcat日志。脚本将会自动退出"
- fi
- else
- echo "Checking if tomcat is started"
- if [ -n "$tomcat_pid" ];then
- kill -9 $tomcat_pid
- if [ $? -ne 0 ];then
- echo "tomcat关闭失败,将会自动退出"
- exit 2
- fi
- fi
- cp $updata_path/$files $webapp_path
- $tomcat_run/startup.sh
- sleep 5
- echo "显示tomcat的pid"
- echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
- echo "tomcat startup"
- echo "请手动查看tomcat日志。脚本将会自动退出"
- fi
- 这个脚本的主要功能是:
- 定义了一些关键路径和变量,如 Tomcat 的路径、备份目录、更新目录等。
- 创建了必要的目录来存储更新文件和备份文件。
- 将上传的 war 包移动到更新目录。
- 如果 webapps 下存在同名的 war 包,则先进行备份。
- 根据是否存在旧的 war 包,决定是否停止 Tomcat 服务,然后更新应用并重新启动 Tomcat。
- 输出 Tomcat 的进程 ID,并提示用户检查 Tomcat 日志。
复制代码 三、jenkins参数化构建实现版本回退
通过回滚git仓库的版本号实现
1.git机器安装git
- [root@gitlab-server ~]# yum install -y git
- 创建裸库
- [root@gitlab-server ~]# mkdir /git-test
- [root@gitlab-server ~]# useradd git
- [root@gitlab-server ~]# passwd git
- [root@gitlab-server ~]# cd /git-test/
- [root@gitlab-server git-test]# git init --bare pm-test
- [root@gitlab-server git-test]# chown git.git /git-test -R
复制代码 利用后端服务器充当git客户端创建密钥
- [root@java-server ~]# ssh-keygen
- [root@java-server ~]# ssh-copy-id -i git@172.16.229.150 #将秘钥传输到git服务器中的git用户
- [root@java-server ~]# git clone git@172.16.229.150:/git-test/pm-test #克隆仓库
- 正克隆到 'pm-test'...
- warning: 您似乎克隆了一个空版本库。
- [root@java-server ~]# ls
- anaconda-ks.cfg pm-test
复制代码 模仿开发角色在后端服务器充当开发端提交代码
- [root@java-server ~]# yum install -y git
- [root@java-server ~]# git config --global user.email "liming@163.com"
- [root@java-server ~]# git config --global user.name "liming"
复制代码- [root@java-server opt]# git clone https://github.com/bingyue/easy-springmvc-maven --克隆源代码
- [root@java-server opt]# cd easy-springmvc-maven/
- [root@java-server easy-springmvc-maven]# cp -r * /root/pm-test/ #将代码复制到自己的仓库中
-
- 提交代码到master
- [root@java-server opt]# cd /root/pm-test/
- [root@java-server pm-test]# git add .
- [root@java-server pm-test]# git commit -m 'test 1'
- [master 0f556ca] test 1
- 9 files changed, 286 insertions(+), 3 deletions(-)
- create mode 100644 pom.xml
- create mode 100644 src/main/java/spring/demo/control/DemoController.java
- create mode 100644 src/main/java/spring/demo/service/DemoService.java
- create mode 100644 src/main/webapp/WEB-INF/applicationContext.xml
- create mode 100644 src/main/webapp/WEB-INF/dispatcher-servlet.xml
- create mode 100644 src/main/webapp/WEB-INF/web.xml
- create mode 100644 src/main/webapp/index.jsp
- create mode 100644 src/main/webapp/result.jsp
- [root@java-server pm-test]# git push origin master
- Counting objects: 22, done.
- Delta compression using up to 2 threads.
- Compressing objects: 100% (15/15), done.
- Writing objects: 100% (20/20), 5.16 KiB | 0 bytes/s, done.
- Total 20 (delta 1), reused 0 (delta 0)
- To git@172.16.229.150:root/pm-test.git
- f341e1d..0f556ca master -> master
- [root@java-server pm-test]#
复制代码 设置jenkins页面
选择参数化构建,选择选项参数
- [root@jenkins-server ~]# cat .ssh/id_rsa
复制代码
将jenkins服务器上面的root用户的公钥添加到git服务的git用户中
- [root@jenkins-server ~]# ssh-copy-id -i git@172.16.229.150
复制代码 可以看到jenkins界面已经ok
添加实行shell命令
界说ssh传输内容
第一个不需要写,写下面的就可以了
修改Java后端的app-jenkins.sh
- [root@java-server ~]# cat /opt/script/app-jenkins.sh
- #!/usr/bin/bash
- #本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
- #================
- #Defining variables
- export JAVA_HOME=/usr/local/java
- webapp_path="/data/application/tomcat/webapps"
- tomcat_run="/data/application/tomcat/bin"
- updata_path="/data/update/`date +%F-%T`"
- backup_path="/data/backup/`date +%F-%T`"
- tomcat_pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`
- #files_dir="easy-springmvc-maven" <strong>#注释掉</strong>
- files="*.war" <strong>#修改为*.war</strong>
- job_path="/root/upload"
-
- #Preparation environment
- echo "Creating related directory"
- mkdir -p $updata_path
- mkdir -p $backup_path
-
- echo "Move the uploaded war package to the update directory"
- mv $job_path/$files $updata_path
-
- echo "========================================================="
- cd /opt
- echo "Backing up java project"
- if [ -f $webapp_path/$files ];then
- tar czf $backup_path/`date +%F-%H`.tar.gz $webapp_path
- if [ $? -ne 0 ];then
- echo "打包失败,自动退出"
- exit 1
- else
- echo "Checking if tomcat is started"
- if [ -n "$tomcat_pid" ];then
- kill -9 $tomcat_pid
- if [ $? -ne 0 ];then
- echo "tomcat关闭失败,将会自动退出"
- exit 2
- fi
- fi
- cd $webapp_path
- rm -rf $files && <strong>rm -rf * #这里也需要修改</strong>
- cp $updata_path/$files $webapp_path
- cd /opt
- $tomcat_run/startup.sh
- sleep 5
- echo "显示tomcat的pid"
- echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
- echo "tomcat startup"
- echo "请手动查看tomcat日志。脚本将会自动退出"
- fi
- else
- echo "Checking if tomcat is started"
- if [ -n "$tomcat_pid" ];then
- kill -9 $tomcat_pid
- if [ $? -ne 0 ];then
- echo "tomcat关闭失败,将会自动退出"
- exit 2
- fi
- fi
- cp $updata_path/$files $webapp_path
- $tomcat_run/startup.sh
- sleep 5
- echo "显示tomcat的pid"
- echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
- echo "tomcat startup"
- echo "请手动查看tomcat日志。脚本将会自动退出"
- fi
复制代码






登陆jenkins服务器编写脚本
- 这里需要理解:
- 在 Jenkins 部署脚本当中加入 git rev-parse HEAD 命令记录每次发布的版本的唯一版本号,并将此记录在一个log文件里,如果需要回滚,则由脚本取出上一次发布的版本号(命令为:tail -n $version+1 version.log | head -n 1)进行版本的回退,而后在回退的基础上再发布即可。
- ============================================
- 我这里的脚本是每构建一次将会的当前版本库的版本号记录下来。当回滚的时候通过看那个version.log文件里面的版本号的顺序,最新构建的版本号在最下面也就是当前版本号,在脚本里面当前版本号定义的是1,如果想回退一版那么这个版本号就在倒数第二行,两版就是倒数第三行,依次类推。那么在参数化构建的时候在version的那一栏里面输入对应数字1,就是回退上一版本,输入数字2回退上上次版本。
- 脚本里面定义的是Newversion=`expr $version + 1`
- $version默认为0
- git rev-parse HEAD >> $WORKSPACE/version.log:将版本号记录在工作目录下面的version.log文件里面,方便版本回退
复制代码- [root@jenkins-server ~]# cd /opt/
- [root@jenkins-server opt]# vim version.sh
- #!/bin/bash
- #本脚本用于参数化构建,项目发布与版本回滚,请慎用!
- #============================
- deploy(){
- echo "deploy: $option"
- cd $WORKSPACE
- git rev-parse HEAD >> $WORKSPACE/version.log
- }
- rollback(){
- Newversion=`expr $version + 1`
- Head=`tail -n $Newversion $WORKSPACE/version.log | head -n 1`
- cd $WORKSPACE
- #git rev-parse HEAD >> $WORKSPACE/version.log
- git reset --hard $Head
- }
-
- case $option in
- deploy)
- deploy
- ;;
- rollback)
- rollback
- ;;
- *)
- echo $"Usage: {deploy|rollback}"
- exit 1
- ;;
- esac
- [root@jenkins-server opt]# chmod +x version.sh
复制代码 回到jenkins页面发布
检察版本号jenkins服务器(192.168.157.128)
- [root@jenkins-server ~]# cd .jenkins/workspace/pm-test
- [root@jenkins-server pm-test]# ls
- pom.xml README.md src target version.log
- [root@jenkins-server pm-test]# cat version.log
- f1a9440c7095457617c3e714fc3124c90415b962
复制代码 检察后端服务器(192.168.157.131)
- [root@java-server ~]# cd /data/application/tomcat/webapps/
- [root@java-server webapps]# ls
- easy-springmvc-maven easy-springmvc-maven.war
- [root@java-server webapps]# netstat -lntp | grep 8080
- tcp6 0 0 :::8080 :::* LISTEN 66398/java
复制代码 修改war包内容模仿代码更新
- 注意:为了区分,这里修改一个源代码重新上传到仓库中去。
- 克隆自己的仓库
- [root@java-server ~]# git clone git@172.16.229.150:root/pm-test.git
- 正克隆到 'pm-test'...
- remote: Enumerating objects: 23, done.
- remote: Counting objects: 100% (23/23), done.
- remote: Compressing objects: 100% (16/16), done.
- remote: Total 23 (delta 1), reused 0 (delta 0), pack-reused 0
- 接收对象中: 100% (23/23), 5.35 KiB | 0 bytes/s, done.
- 处理 delta 中: 100% (1/1), done.
- [root@java-server ~]# vim /opt/easy-springmvc-maven/src/main/webapp/index.jsp
- #修改源代码内容
- [root@java-server ~]# cd pm-test/
- [root@java-server pm-test]# rm -rf *
- [root@java-server pm-test]# cp /root/Client
- Client/ Client.zip
- [root@java-server pm-test]# cp -r /opt/easy-springmvc-maven/* .
- [root@java-server pm-test]# git add -A #将代码提交到仓库
- [root@java-server pm-test]# git commit -m "test 2"
- [root@java-server pm-test]# git push origin master
复制代码



登陆后端服务器检察
- [root@java-server ~]# netstat -lntp | grep 8080
- tcp6 0 0 :::8080 :::* LISTEN 66594/java
- [root@java-server ~]# cd /data/application/tomcat/webapps/
- [root@java-server webapps]# ls
- Client Client.war
- [root@java-server webapps]# cd /data/backup/ #查看是否备份成功
- [root@java-server backup]# ls
- 2020-11-22-17:40:59
复制代码 开始回滚
- 将现在的client的war包回滚到easy-springmvc-maven.war包
- 查看版本号,回滚到上个版本
- [root@jenkins-server ~]# cat /root/.jenkins/workspace/测试项目1/version.log
- 553e0c651502098cf2cc165bb82a15fc81bbca03
- 560794a7ec1fa71cdf67c87069729c3f08d8e1c3
复制代码
验证
- [root@java-server ~]# netstat -lntp | grep 8080
- tcp6 0 0 :::8080 :::* LISTEN 122877/java
- [root@java-server ~]# cd /data/application/tomcat/webapps/
- [root@java-server webapps]# ls
- easy-springmvc-maven easy-springmvc-maven.war
- [root@java-server webapps]# cd /data/backup/
- [root@java-server backup]# ls
- 2024-09-04-19:34:28 2024-09-04-19:44:55
复制代码 到此根据git仓库每次提交的版本号回滚成功!
四、gitlab webhook + jenkins 实当代码自动化发布
- Webhook(网络钩子)本质上也是API。一般与jenkins联合使用,gitlab的某个项目的代码更新了后就触发 webhook中配置的 url ,这个url一般是jenkins中某一个job的url。即gitlab代码更新后就会触发 jinkins的任务自动进行构建。
-
- Webhook工作原理
- 为了及时通知,此时就产生了Webhook这种概念,其实就是为了更好地去通知调用的结果。在我们发出请求的时候,可以向服务器注册一个vWebhook的地址,告诉服务器说,等调用结果一出来,第一时间通过这个Webhook地址通知我,我好处理接下来的步骤。
复制代码 gitlab创建项目
如上设置gitlab,登录gitlab
密码12345678
创建一个项目
Jenkins构建利用自由风格的软件项目
在Jenkins中创建一个新的使命:在Jenkins的首页,点击“新建使命”创建一个新的使命,选择自由风格的软件项目。
登录gitlab
获取git仓库地址
添加Gitlab认证用户和用户私钥
添加git认证用户
选择SSH 用户名私钥
- [root@jenkins-server ~]# useradd jenkins
- [root@jenkins-server ~]# su - jenkins
- [jenkins@jenkins-server ~]$ ssh-keygen
- [jenkins@jenkins-server ~]$ cat .ssh/id_rsa #查看jenkins用户的私钥
复制代码
gitlab添加jenkins用户公钥
- 登录到jenkins服务器中
- [jenkins@jenkins-server ~]$ cat .ssh/id_rsa.pub #查看jenkins用户的公钥
-
复制代码
- 注意: 先添加到验证文件中。
- 在jenkins机器上面执行 连接gitlab机器,
- [root@jenkins-server ~]# ssh 192.168.157.129 -o StrictHostKeyChecking=no
复制代码 jenkins界面已经ok
构建触发器
选择项目后设置构建触发器,勾选Build when......,已勾选的不需取消,默认即可,下拉点击高级选项。再点击Generate,天生Secret token(后续Gitlab的WebHooks会用)。
复制URL
复制私钥
gitlab设置Webhooks
复制Jenkins的URL和认证密钥,切换到gitlab,点击进入对应的git库项目,
点击setting --> Webhooks,粘贴URL和秘钥
粘贴URL和秘钥
测试是否设置成功
出现Hook executed successfully: HTTP 200即为成功。
如果添加完成之后报错
这是因为gitlab 10.6 版本以后为了安全,不允许向当地网络发送webhook哀求,设置如下:
登录管理员账号
然后再次添加webhook
回到jenkins页面
测试
代码推送至master时,WebHooks会告知Jenkins开启摆设
- 我这里在gitlab机器上面测试:
- [root@git-server ~]# ssh-keygen #生成秘钥
- [root@git-server ~]# cat .ssh/id_rsa.pub #查看生成的公钥添加到gitlab里面去
复制代码
- [root@git-server ~]# git clone git@192.168.153.156:root/test1.git
- Cloning into 'test1'...
- remote: Enumerating objects: 6, done.
- remote: Counting objects: 100% (6/6), done.
- remote: Compressing objects: 100% (4/4), done.
- remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
- Receiving objects: 100% (6/6), done.
-
- [root@git-server ~]# ls
- anaconda-ks.cfg test1 upload
- [root@git-server ~]# cd test1/
- [root@git-server test1]# ls
- README.md
- [root@git-server test1]# touch a.txt
- [root@git-server test1]# git add .
- [root@git-server test1]# git commit -m 'test'
- [master 2451295] test
- 1 file changed, 0 insertions(+), 0 deletions(-)
- create mode 100644 a.txt
- [root@git-server test1]# git push origin master
- Counting objects: 4, done.
- Delta compression using up to 2 threads.
- Compressing objects: 100% (2/2), done.
- Writing objects: 100% (3/3), 296 bytes | 0 bytes/s, done.
- Total 3 (delta 0), reused 0 (delta 0)
- To git@192.168.153.156:root/test1.git
- f3848d7..2451295 master -> master
复制代码 返回到jenkins页面检察是否自动发布
1.jenkins怎么备份恢复
- 导航到Jenkins的根目录,拷贝根目录主home下面的 .jenkins打个包,下次要恢复就用这个覆盖,所有的东西就都一模一样了。其实就是配置的东西都在这里面,plugins目录包含所有已安装的插件
复制代码 2.Jenkins主要整合了两个组成部分?
- Jenkins与以下两个组件集成在一起:
- <strong>持续集成(Continuous Integration, CI)</strong> 和 <strong>持续交付/部署(Continuous Delivery/Deployment, CD/CD)</strong>。
- 1.GIT, SVN等版本控制系统
- 2.构建时打包Maven之类的工具。
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |