Jenkins构建CI/CD

打印 上一主题 下一主题

主题 1396|帖子 1396|积分 4188

CI/CD

软件开发的连续方法基于自动实行脚本,以最大限度地减少在开发应用步调时引入错误的可能性。从新代码的开发到摆设,它们需要较少的人为干预甚至根本不需要干预。
它涉及在每次小迭代中不断构建,测试和摆设代码更改,从而减少基于有缺陷或失败的先前版本开发新代码的机会。
这种方法有三种主要方法,每种方法都根据最适合的策略进行应用。
持续集成(Continuous Integration, CI):  代码合并,构建,摆设,测试都在一起,不断地实行这个过程,并对结果反馈。
持续摆设(Continuous Deployment, CD): 摆设到测试环境、预生产环境/灰度环境、生产环境。
持续交付(Continuous Delivery, CD):  将最终产品发布到生产环境、给互联网用户利用。
  1. 持续集成/持续发布--项目---开发(git) -->git主库-->jenkins(调用maven打包+测试)-->发布到后端服务器
复制代码
一、jenkins介绍

Jenkins是帮我们将代码进行统一的编译打包、还可以直接放到后端服务器中进行发布。我们通过设置jenkins,将从前:编译、打包、上传、摆设到后端服务器中的过程交由Jenkins,Jenkins通过给定的代码地址URL,将代码拉取到其“宿主服务器”(Jenkins的安装位置),进行编译、打包和发布到web容器中。
1、Jenkins概述

  1. Jenkins是一款开源的、提供友好操作界面的持续集成(CI/CD)工具,主要用于持续、自动的构建的一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的容器中运行,也可独立运行。
复制代码
jenkins通常与版本管理工具(SCM)、构建工具联合利用;常用的版本控制工具有SVN、GIT。jenkins构建工具有Maven、Ant、Gradle。
2、Jenkins目的

  1. 提高开发效率以及过程控制:
  2. jenkins的主要目标是监控软件开发流程,快速显示问题。 所以能保证开发人员以及相关人员省时省力提高开发效率。
  3. CI系统在整个开发过程中的主要作用是控制:当系统在代码库中检测到修改时,它将运行构建的任务委托给构建过程本身。如果构建失败了,那么CI系统将通知相关人员,然后继续监视代码库。
复制代码
3、Jenkins特性

  1. 1.易于安装    #不需要安装、不需要数据库,只需通过java  -jar jenkins.war或部署到一个java容器中
  2. 2.易于配置    #所有的配置都可能通过jenkins提供的web界面完成,当然如果你喜欢,也可以通过手动修改xml文件进行配置
  3. 3.文件识别    #jenkins能跟踪每次构建生成的是war包还是jar包,以及使用哪个版本的包。
  4. 4.分布式构建  #支持Jenkins能够让多台计算机一起构建/测试。
  5. 5.任务(Job)和构建(build) #任务:(Job)是Jenkins的一个执行计划,是一系列操作的集合。构建:是Jenkins的任务的一次运行。
  6. 6.插件支持    #jenkins可以通过第三方插件扩展,也可以根据团队需要开发插件
  7. 6.跨平台      #支持所有的平台
复制代码
工作流程图:

  1. 测试环境中:
  2. 1.开发者会将代码上传到版本库中。
  3. 2.jenkins通过配置版本库的连接地址,获取到源代码。
  4. 3.jenkins获取到源代码之后通过参数化构建(或者触发器)开始编译打包。
  5. 4.jenkins通过调用maven(Ant或者Gradle)命令实现编译打包过程。
  6. 5.生成的war/jar包通过ssh插件上传到远程后端服务器中通过shell脚本自动发布项目。
  7. 生产环境:
  8. 测试环境将项目测试没问题后,将项目推送到线上正式环境。
  9. 1.可以选择手动。
  10. 2.也可以通过调用脚本推送过去。
复制代码
4、Jenkins面试

jenkins如何将代码发布到后端服务器的?利用的ssh的方式
jenkins如何获取到代码的?在jenkins设置git仓库url地址
Jenkins利用什么命令进行的打包?前端利用npm;后端利用maven
jenkins的上线流程(利用什么方式上线?)
二、摆设Jenkins实战

1、准备环境

  1. 三台机器
  2. git-server    ----https://github.com/bingyue/easy-springmvc-maven
  3. jenkins-server    ---192.168.246.212---最好是3个G以上
  4. java-server   -----192.168.246.210
  5. https://github.com/bingyue/easy-springmvc-maven 或者
  6. https://gitee.com/bingyu076/easy-springmvc-maven.git
复制代码
1. 摆设jenkins服务器

  1. 安装git客户端
  2. [root@jenkins-server ~]# yum install -y git   #安装git客户端
  3. [root@jenkins-server ~]# ssh-keygen
  4. [root@jenkins-server ~]# ssh-copy-id -i root@192.168.246.210   #拷贝到后端java服务器
  5. 开始部署jenkins:
  6. 从Jenkins2.164(2019年2月10日发布)和 LTS 2.164.1(ETA:3月14日)开始,在 Jenkins 中全面支持 Java 11。
  7. <strong>1.配置安装jdk11</strong>
  8. [root@jenkins-server ~]# tar xzf jdk-11.0.20_linux-x64_bin.tar.gz -C /usr/local/
  9. [root@jenkins-server ~]# cd /usr/local/
  10. [root@jenkins-server local]# mv jdk-11.0.20/ java
  11. <strong>2.安装tomcat</strong>
  12. [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
  13. [root@jenkins-server ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /usr/local/
  14. [root@jenkins-server ~]# cd /usr/local/
  15. [root@jenkins-server local]# mv apache-tomcat-8.5.42/ tomcat
  16. <strong>3.安装maven</strong>
  17. [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
  18. [root@jenkins-server ~]# tar xzf apache-maven-3.5.4-bin.tar.gz -C /usr/local/java
  19. [root@jenkins-server ~]# cd /usr/local/java
  20. [root@jenkins-server java]# mv apache-maven-3.5.4/ maven
  21. <strong>设置环境变量</strong>
  22. [root@jenkins-server ~]# vim /etc/profile
  23. JAVA_HOME=/usr/local/java
  24. PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
  25. MAVEN_HOME=/usr/local/java/maven
  26. export JAVA_HOME MAVEN_HOME PATH
  27. [root@jenkins-server ~]# source /etc/profile
  28. 验证:
  29. [root@jenkins-server ~]# java -version
  30. java version "1.8.0_191"
  31. Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
  32. Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
  33. [root@jenkins-server ~]# mvn -v
  34. Apache Maven 3.5.4 (1edded0938998edf8bf061f1ceb3cfdeccf443fe; 2018-06-18T02:33:14+08:00)
  35. Maven home: /usr/local/java/maven
  36. Java version: 1.8.0_191, vendor: Oracle Corporation, runtime: /usr/local/java/jre
  37. Default locale: en_US, platform encoding: UTF-8
  38. OS name: "linux", version: "3.10.0-693.el7.x86_64", arch: "amd64", family: "unix"
  39. <strong>下载jenkins的安装包</strong>
  40. 安装jenkins:2.426.1  ----通过官网直接下载war包。
  41. 官网:https://www.jenkins.io/download/
  42. [root@jenkins-server ~]# wget https://get.jenkins.io/war-stable/2.426.1/jenkins.war --no-check-certificat
  43. 最新版本的jenkins需要字体支持,但是目前系统缺少字体--需要安装字体
  44. [root@jenkins-server ~]# yum install fontconfig -y
  45. <strong>部署jenkins</strong>
  46. [root@jenkins-server ~]# cd /usr/local/tomcat/webapps/
  47. [root@jenkins-server webapps]# rm -rf *
  48. [root@jenkins-server webapps]# cp /root/jenkins.war .
  49. [root@jenkins-server webapps]# ../bin/startup.sh
  50. Using CATALINA_BASE:   /usr/local/tomcat
  51. Using CATALINA_HOME:   /usr/local/tomcat
  52. Using CATALINA_TMPDIR: /usr/local/tomcat/temp
  53. Using JRE_HOME:        /usr/local/java
  54. Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
  55. Tomcat started.
复制代码
如果启动了访问提示


办理办法在
  1. [root@jenkins-server ~]# cd /usr/local/tomcat/conf/
  2. [root@jenkins-server conf]# vim context.xml  -----添加如下内容:
  3.    <Resources
  4.        cachingAllowed="true"
  5.        cacheMaxSize="100000"
  6.    />
复制代码

重启tomcat
2.如果还是不行:
  1. [root@jenkins ~]# cd .jenkins/updates/ 到jenkins的工作目录下
  2. [root@jenkins updates]# vim default.json
  3. 把 "connectionCheckUrl":"http://www.google.com/" 改为  "connectionCheckUrl":"http://www.baidu.com/"
复制代码
3.要是还是不行:
  1. 需要你进入jenkins的工作目录,打开-----hudson.model.UpdateCenter.xml
  2. 把http://updates.jenkins-ci.org/update-center.json
  3. 改成
  4. http://mirror.xmission.com/jenkins/updates/update-center.json
  5. 每次改完记得重启!
复制代码
利用运行war的情势安装jenkins,因为伟大的墙出现,“该jenkins实例好像已离线” 问题:
办理办法:
  1. 需要你进入jenkins的工作目录,打开-----hudson.model.UpdateCenter.xml将 url 中的 https://updates.jenkins.io/update-center.json 更改为http://updates.jenkins.io/update-center.json,即去掉 https 中的 s 。
  2. 或者更改为https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
  3. 是国内的清华大学的镜像地址。
  4. 然后重启tomcat
复制代码
========================================================================
访问界面: ---需要多等一会

http://192.168.246.212:8080/jenkins
2、登录jenkins


  1. [root@jenkins-server ~]# cat /opt/jenkins/secrets/initialAdminPassword
  2. b36b8b04c5b84e659701304dfe848999    ---复制这个密码粘贴到上面提示的空格里面。
复制代码
点击:安装推荐的插件 

等待安装 

填写管理员信息 ,这里密码设置的为123456
如果安装失败,打开settings.xml添加阿里源
  1. [root@jenkins-server ~]# vim /usr/local/java/maven/conf/settings.xml +160
  2. # 添加阿里源
  3.     </mirror>
  4.     <mirror>
  5.           <id>aliyunmaven</id>
  6.           <mirrorOf>*</mirrorOf>
  7.           <name>阿里云公共仓库</name>
  8.           <url>https://maven.aliyun.com/repository/public</url>
  9.         </mirror>
  10.   </mirrors>
复制代码


点击生存完成

 开始利用Jenkins



3、安装插件

  1. 安装插件:
  2. 所需的插件:
  3. • Maven插件 Maven Integration plugin
  4. • 发布插件 Deploy to container Plugin
  5. 需要安装插件如下:
  6. =======================================================
  7. 安装插件
  8. <strong>Deploy to container</strong>    ---支持自动化代码部署到tomcat容器
  9. GIT pligin  可能已经安装
  10. <strong>Maven Integration</strong>   :jenkins利用Maven编译,打包所需插件
  11. <strong>Publish Over SSH</strong>  :通过ssh连接将打包的war包拷贝到后端服务器
  12. <strong>ssh  插件</strong>
  13. <strong>Email Extension Plugin</strong>  安装邮件插件
  14. 安装过程:
  15. 系统管理--->插件管理---->可选插件--->过滤Deploy to container---->勾选--->直接安装
复制代码



输入插件名后按回车!





安装gitlab插件


以上全部插件安装完成
4、设置Jenkins

设置ssh



翻到最下面

key:指的是jenkins服务器用哪个用户去远程毗连步调服务器就是谁人用户的私钥。
  1. [root@localhost ~]# cat .ssh/id_rsa
复制代码
添加远程ssh-server


设置邮件

(用于之后项目构建后发送邮件)

设置扩展邮件通知 





  1. 邮件主题:
  2. 构建通知:${BUILD_STATUS} - ${PROJECT_NAME} - Build # ${BUILD_NUMBER} !
复制代码
  1. 邮件内容:
  2. <!DOCTYPE html>    
  3. <html>    
  4. <head>    
  5. <meta charset="UTF-8">    
  6. <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次构建日志</title>    
  7. </head>    
  8.    
  9. <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    
  10.    offset="0">    
  11.    <table width="95%" cellpadding="0" cellspacing="0"  style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">    
  12.        <tr>    
  13.            本邮件由系统自动发出,无需回复!<br/>            
  14.            各位同事,大家好,以下为${PROJECT_NAME }项目构建信息</br>
  15.            <td><font color="#CC0000">构建结果 - ${BUILD_STATUS}</font></td>  
  16.        </tr>    
  17.        <tr>    
  18.            <td><br />    
  19.            <b><font color="#0B610B">构建信息</font></b>    
  20.            <hr size="2" width="100%" align="center" /></td>    
  21.        </tr>    
  22.        <tr>    
  23.            <td>    
  24.                <ul>    
  25.                    <li>项目名称 : ${PROJECT_NAME}</li>    
  26.                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>    
  27.                    <li>触发原因: ${CAUSE}</li>    
  28.                    <li>构建状态: ${BUILD_STATUS}</li>    
  29.                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>    
  30.                    <li>构建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>    
  31.                    <li>工作目录 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>    
  32.                    <li>项目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>    
  33.                </ul>    
  34. <h4><font color="#0B610B">失败用例</font></h4>
  35. <hr size="2" width="100%" />
  36. $FAILED_TESTS<br/>
  37. <h4><font color="#0B610B">最近提交(#$SVN_REVISION)</font></h4>
  38. <hr size="2" width="100%" />
  39. <ul>
  40. ${CHANGES_SINCE_LAST_SUCCESS, reverse=true, format="%c", changesFormat="<li>%d [%a] %m</li>"}
  41. </ul>
  42. 详细提交: <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a><br/>
  43.            </td>    
  44.        </tr>    
  45.    </table>    
  46. </body>    
  47. </html>
复制代码
设置邮箱触发器



可根据实际环境选择触发条件,此处选择 总是

管理监控设置--->体系管理员邮件地址:along@163.com,要和下面的用户名划一;
邮件通知,设置如下:可以点击测试,是否设置成功

然后应用生存
设置jdk,maven命令,git全局设置






构建发布使命








调用maven命令

指定打包文件:pom.xml

设置构建后操纵模块








摆设java服务器,做jenkins打包上线

  1. [root@java-server ~]# mkdir -p /data/application
  2. 上传jdk
  3. [root@java-server ~]# tar xzf jdk-8u191-linux-x64.tar.gz -C /usr/local/
  4. [root@java-server ~]# cd /usr/local/
  5. [root@java-server local]# mv jdk1.8.0_191/ java
  6. 下载tomcat
  7. [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
  8. [root@java-server ~]# tar xzf apache-tomcat-8.5.42.tar.gz -C /data/application/
  9. [root@java-server ~]# cd /data/application/
  10. [root@java-server application]# mv apache-tomcat-8.5.42/ tomcat
  11. 设置环境变量
  12. [root@java-server ~]# vim /etc/profile
  13. export JAVA_HOME=/usr/local/java
  14. export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
  15. export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
  16. export TOMCAT_HOME=/data/application/tomcat
  17. [root@java-server ~]# source /etc/profile
  18. 测试:
  19. [root@java-server ~]# java -version
  20. java version "1.8.0_191"
  21. Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
  22. Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
  23. 删除tomcat默认发布目录下面的内容:
  24. [root@java-server ~]# rm -rf /data/application/tomcat/webapps/*
  25. [root@java-server ~]# cd /data/application/tomcat/webapps/
  26. [root@java-server webapps]# ls
  27. 创建目录和脚本:
  28. [root@java-server ~]# mkdir /opt/script  #创建脚本目录
  29. [root@java-server ~]# vim app-jenkins.sh   #创建脚本
  30. 脚本内容在后面
  31. [root@java-server ~]# chmod +x app-jenkins.sh  #添加执行权限
  32. [root@java-server ~]# mv app-jenkins.sh /opt/script/
复制代码
回到jenkins页面开始构建使命






登陆java-server服务器检察



  1. 脚本内容:
  2. [root@java-server script]# cat app-jenkins.sh
  3. #!/usr/bin/bash
  4. #本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
  5. #================
  6. #Defining variables
  7. export JAVA_HOME=/usr/local/java
  8. webapp_path="/data/application/tomcat/webapps"
  9. tomcat_run="/data/application/tomcat/bin"
  10. updata_path="/data/update/`date +%F-%T`"
  11. backup_path="/data/backup/`date +%F-%T`"
  12. tomcat_pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`
  13. files_dir="easy-springmvc-maven"
  14. files="easy-springmvc-maven.war"
  15. job_path="/root/upload"
  16. #Preparation environment
  17. echo "Creating related directory"
  18. mkdir -p $updata_path
  19. mkdir -p $backup_path
  20. echo "Move the uploaded war package to the update directory"
  21. mv $job_path/$files $updata_path
  22. echo "========================================================="
  23. cd /opt
  24. echo "Backing up java project"
  25. if [ -f $webapp_path/$files ];then
  26.         tar czf $backup_path/`date +%F-%H`.tar.gz $webapp_path
  27.         if [ $? -ne 0 ];then
  28.                 echo "打包失败,自动退出"
  29.                 exit 1
  30.         else
  31.                 echo "Checking if tomcat is started"
  32.                 if [ -n "$tomcat_pid" ];then
  33.                         kill -9 $tomcat_pid
  34.                         if [ $? -ne 0 ];then
  35.                                 echo "tomcat关闭失败,将会自动退出"
  36.                                 exit 2
  37.                         fi
  38.                 fi
  39.                 cd $webapp_path
  40.                 rm -rf $files && rm -rf $files_dir
  41.                 cp $updata_path/$files $webapp_path
  42.                 cd /opt
  43.                 $tomcat_run/startup.sh
  44.                 sleep 5
  45.                 echo "显示tomcat的pid"
  46.                 echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
  47.                 echo "tomcat startup"
  48.                 echo "请手动查看tomcat日志。脚本将会自动退出"
  49.         fi
  50. else
  51.         echo "Checking if tomcat is started"
  52.         if [ -n "$tomcat_pid" ];then
  53.                 kill -9 $tomcat_pid
  54.                 if [ $? -ne 0 ];then
  55.                         echo "tomcat关闭失败,将会自动退出"
  56.                                exit 2
  57.                 fi
  58.         fi
  59.         cp $updata_path/$files $webapp_path
  60.         $tomcat_run/startup.sh
  61.         sleep 5
  62.         echo "显示tomcat的pid"
  63.         echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
  64.         echo "tomcat startup"
  65.         echo "请手动查看tomcat日志。脚本将会自动退出"
  66. fi
  67. 这个脚本的主要功能是:
  68. 定义了一些关键路径和变量,如 Tomcat 的路径、备份目录、更新目录等。
  69. 创建了必要的目录来存储更新文件和备份文件。
  70. 将上传的 war 包移动到更新目录。
  71. 如果 webapps 下存在同名的 war 包,则先进行备份。
  72. 根据是否存在旧的 war 包,决定是否停止 Tomcat 服务,然后更新应用并重新启动 Tomcat。
  73. 输出 Tomcat 的进程 ID,并提示用户检查 Tomcat 日志。
复制代码
三、jenkins参数化构建实现版本回退

通过回滚git仓库的版本号实现
1.git机器安装git

  1. [root@gitlab-server ~]# yum install -y git
  2. 创建裸库
  3. [root@gitlab-server ~]# mkdir /git-test
  4. [root@gitlab-server ~]# useradd git
  5. [root@gitlab-server ~]# passwd git
  6. [root@gitlab-server ~]# cd /git-test/
  7. [root@gitlab-server git-test]# git init --bare pm-test
  8. [root@gitlab-server git-test]# chown git.git /git-test -R
复制代码
利用后端服务器充当git客户端创建密钥

  1. [root@java-server ~]# ssh-keygen
  2. [root@java-server ~]# ssh-copy-id -i git@172.16.229.150  #将秘钥传输到git服务器中的git用户
  3. [root@java-server ~]# git clone git@172.16.229.150:/git-test/pm-test  #克隆仓库
  4. 正克隆到 'pm-test'...
  5. warning: 您似乎克隆了一个空版本库。
  6. [root@java-server ~]# ls
  7. anaconda-ks.cfg  pm-test
复制代码
模仿开发角色在后端服务器充当开发端提交代码

  1. [root@java-server ~]# yum install -y git
  2. [root@java-server ~]# git config --global user.email "liming@163.com"
  3. [root@java-server ~]# git config --global user.name "liming"
复制代码
  1. [root@java-server opt]# git clone https://github.com/bingyue/easy-springmvc-maven --克隆源代码
  2. [root@java-server opt]# cd easy-springmvc-maven/
  3. [root@java-server easy-springmvc-maven]# cp -r * /root/pm-test/  #将代码复制到自己的仓库中
  4. 提交代码到master
  5. [root@java-server opt]# cd /root/pm-test/
  6. [root@java-server pm-test]# git add .
  7. [root@java-server pm-test]# git commit -m 'test 1'
  8. [master 0f556ca] test 1
  9. 9 files changed, 286 insertions(+), 3 deletions(-)
  10. create mode 100644 pom.xml
  11. create mode 100644 src/main/java/spring/demo/control/DemoController.java
  12. create mode 100644 src/main/java/spring/demo/service/DemoService.java
  13. create mode 100644 src/main/webapp/WEB-INF/applicationContext.xml
  14. create mode 100644 src/main/webapp/WEB-INF/dispatcher-servlet.xml
  15. create mode 100644 src/main/webapp/WEB-INF/web.xml
  16. create mode 100644 src/main/webapp/index.jsp
  17. create mode 100644 src/main/webapp/result.jsp
  18. [root@java-server pm-test]# git push origin master
  19. Counting objects: 22, done.
  20. Delta compression using up to 2 threads.
  21. Compressing objects: 100% (15/15), done.
  22. Writing objects: 100% (20/20), 5.16 KiB | 0 bytes/s, done.
  23. Total 20 (delta 1), reused 0 (delta 0)
  24. To git@172.16.229.150:root/pm-test.git
  25.   f341e1d..0f556ca  master -> master
  26. [root@java-server pm-test]#
复制代码
设置jenkins页面




选择参数化构建,选择选项参数 







  1. [root@jenkins-server ~]# cat .ssh/id_rsa
复制代码



将jenkins服务器上面的root用户的公钥添加到git服务的git用户中
  1. [root@jenkins-server ~]# ssh-copy-id -i git@172.16.229.150
复制代码
可以看到jenkins界面已经ok


添加实行shell命令





界说ssh传输内容

第一个不需要写,写下面的就可以了

修改Java后端的app-jenkins.sh 

  1. [root@java-server ~]# cat /opt/script/app-jenkins.sh
  2. #!/usr/bin/bash
  3. #本脚本适用于jenkins持续集成,实现备份war包到代码更新上线!使用时请注意全局变量。
  4. #================
  5. #Defining variables
  6. export JAVA_HOME=/usr/local/java
  7. webapp_path="/data/application/tomcat/webapps"
  8. tomcat_run="/data/application/tomcat/bin"
  9. updata_path="/data/update/`date +%F-%T`"
  10. backup_path="/data/backup/`date +%F-%T`"
  11. tomcat_pid=`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`
  12. #files_dir="easy-springmvc-maven"  <strong>#注释掉</strong>
  13. files="*.war" <strong>#修改为*.war</strong>
  14. job_path="/root/upload"
  15. #Preparation environment
  16. echo "Creating related directory"
  17. mkdir -p $updata_path
  18. mkdir -p $backup_path
  19. echo "Move the uploaded war package to the update directory"
  20. mv $job_path/$files $updata_path
  21. echo "========================================================="
  22. cd /opt
  23. echo "Backing up java project"
  24. if [ -f $webapp_path/$files ];then
  25.        tar czf $backup_path/`date +%F-%H`.tar.gz $webapp_path
  26.        if [ $? -ne 0 ];then
  27.                echo "打包失败,自动退出"
  28.                exit 1
  29.        else
  30.                echo "Checking if tomcat is started"
  31.                if [ -n "$tomcat_pid" ];then
  32.                        kill -9 $tomcat_pid
  33.                        if [ $? -ne 0 ];then
  34.                                echo "tomcat关闭失败,将会自动退出"
  35.                                exit 2
  36.                        fi
  37.                fi
  38.                cd $webapp_path
  39.                rm -rf $files && <strong>rm -rf *  #这里也需要修改</strong>
  40.                cp $updata_path/$files $webapp_path
  41.                cd /opt
  42.                $tomcat_run/startup.sh
  43.                sleep 5
  44.                echo "显示tomcat的pid"
  45.                echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
  46.                echo "tomcat startup"
  47.                echo "请手动查看tomcat日志。脚本将会自动退出"
  48.        fi
  49. else
  50.        echo "Checking if tomcat is started"
  51.        if [ -n "$tomcat_pid" ];then
  52.                kill -9 $tomcat_pid
  53.                if [ $? -ne 0 ];then
  54.                        echo "tomcat关闭失败,将会自动退出"
  55.                        exit 2
  56.                fi
  57.        fi
  58.        cp $updata_path/$files $webapp_path
  59.        $tomcat_run/startup.sh
  60.        sleep 5
  61.        echo "显示tomcat的pid"
  62.        echo "`ps -ef | grep tomcat | grep -v grep | awk '{print $2}'`"
  63.        echo "tomcat startup"
  64.        echo "请手动查看tomcat日志。脚本将会自动退出"
  65. fi
复制代码







登陆jenkins服务器编写脚本

  1. 这里需要理解:
  2. 在 Jenkins 部署脚本当中加入 git rev-parse HEAD 命令记录每次发布的版本的唯一版本号,并将此记录在一个log文件里,如果需要回滚,则由脚本取出上一次发布的版本号(命令为:tail -n $version+1 version.log | head -n 1)进行版本的回退,而后在回退的基础上再发布即可。
  3. ============================================
  4. 我这里的脚本是每构建一次将会的当前版本库的版本号记录下来。当回滚的时候通过看那个version.log文件里面的版本号的顺序,最新构建的版本号在最下面也就是当前版本号,在脚本里面当前版本号定义的是1,如果想回退一版那么这个版本号就在倒数第二行,两版就是倒数第三行,依次类推。那么在参数化构建的时候在version的那一栏里面输入对应数字1,就是回退上一版本,输入数字2回退上上次版本。
  5. 脚本里面定义的是Newversion=`expr $version + 1`
  6. $version默认为0
  7. git rev-parse HEAD >> $WORKSPACE/version.log:将版本号记录在工作目录下面的version.log文件里面,方便版本回退
复制代码
  1. [root@jenkins-server ~]# cd /opt/
  2. [root@jenkins-server opt]# vim version.sh
  3. #!/bin/bash
  4. #本脚本用于参数化构建,项目发布与版本回滚,请慎用!
  5. #============================
  6. deploy(){
  7. echo "deploy: $option"
  8. cd $WORKSPACE
  9. git rev-parse HEAD >> $WORKSPACE/version.log
  10. }
  11. rollback(){
  12. Newversion=`expr $version + 1`
  13. Head=`tail -n $Newversion $WORKSPACE/version.log | head -n 1`
  14. cd $WORKSPACE
  15. #git rev-parse HEAD >> $WORKSPACE/version.log
  16. git reset --hard $Head
  17. }
  18. case $option in
  19. deploy)
  20. deploy
  21. ;;
  22. rollback)
  23. rollback
  24. ;;
  25. *)
  26. echo $"Usage: {deploy|rollback}"
  27. exit 1
  28. ;;
  29. esac
  30. [root@jenkins-server opt]# chmod +x version.sh
复制代码
回到jenkins页面发布




检察版本号jenkins服务器(192.168.157.128)
  1. [root@jenkins-server ~]# cd .jenkins/workspace/pm-test
  2. [root@jenkins-server pm-test]# ls
  3. pom.xml  README.md  src  target  version.log
  4. [root@jenkins-server pm-test]# cat version.log
  5. f1a9440c7095457617c3e714fc3124c90415b962
复制代码
检察后端服务器(192.168.157.131)
  1. [root@java-server ~]# cd /data/application/tomcat/webapps/
  2. [root@java-server webapps]# ls
  3. easy-springmvc-maven  easy-springmvc-maven.war
  4. [root@java-server webapps]# netstat -lntp | grep 8080
  5. tcp6       0      0 :::8080                 :::*                    LISTEN      66398/java
复制代码
修改war包内容模仿代码更新

  1. 注意:为了区分,这里修改一个源代码重新上传到仓库中去。
  2. 克隆自己的仓库
  3. [root@java-server ~]# git clone git@172.16.229.150:root/pm-test.git
  4. 正克隆到 'pm-test'...
  5. remote: Enumerating objects: 23, done.
  6. remote: Counting objects: 100% (23/23), done.
  7. remote: Compressing objects: 100% (16/16), done.
  8. remote: Total 23 (delta 1), reused 0 (delta 0), pack-reused 0
  9. 接收对象中: 100% (23/23), 5.35 KiB | 0 bytes/s, done.
  10. 处理 delta 中: 100% (1/1), done.
  11. [root@java-server ~]# vim /opt/easy-springmvc-maven/src/main/webapp/index.jsp 
  12. #修改源代码内容
  13. [root@java-server ~]# cd pm-test/  
  14. [root@java-server pm-test]# rm -rf *
  15. [root@java-server pm-test]# cp /root/Client
  16. Client/     Client.zip  
  17. [root@java-server pm-test]# cp -r /opt/easy-springmvc-maven/* .
  18. [root@java-server pm-test]# git add -A   #将代码提交到仓库
  19. [root@java-server pm-test]# git commit -m "test 2"
  20. [root@java-server pm-test]# git push origin master
复制代码




登陆后端服务器检察
  1. [root@java-server ~]# netstat -lntp | grep 8080
  2. tcp6       0      0 :::8080                 :::*                    LISTEN      66594/java          
  3. [root@java-server ~]# cd /data/application/tomcat/webapps/
  4. [root@java-server webapps]# ls
  5. Client  Client.war
  6. [root@java-server webapps]# cd /data/backup/  #查看是否备份成功
  7. [root@java-server backup]# ls
  8. 2020-11-22-17:40:59
复制代码
开始回滚

  1. 将现在的client的war包回滚到easy-springmvc-maven.war包
  2. 查看版本号,回滚到上个版本
  3. [root@jenkins-server ~]# cat /root/.jenkins/workspace/测试项目1/version.log
  4. 553e0c651502098cf2cc165bb82a15fc81bbca03
  5. 560794a7ec1fa71cdf67c87069729c3f08d8e1c3
复制代码




验证
  1. [root@java-server ~]# netstat -lntp | grep 8080
  2. tcp6       0      0 :::8080                 :::*                    LISTEN      122877/java        
  3. [root@java-server ~]# cd /data/application/tomcat/webapps/
  4. [root@java-server webapps]# ls
  5. easy-springmvc-maven  easy-springmvc-maven.war
  6. [root@java-server webapps]# cd /data/backup/
  7. [root@java-server backup]# ls
  8. 2024-09-04-19:34:28 2024-09-04-19:44:55
复制代码
到此根据git仓库每次提交的版本号回滚成功!
四、gitlab webhook + jenkins 实当代码自动化发布

  1. Webhook(网络钩子)本质上也是API。一般与jenkins联合使用,gitlab的某个项目的代码更新了后就触发 webhook中配置的 url ,这个url一般是jenkins中某一个job的url。即gitlab代码更新后就会触发 jinkins的任务自动进行构建。
  2. Webhook工作原理
  3. 为了及时通知,此时就产生了Webhook这种概念,其实就是为了更好地去通知调用的结果。在我们发出请求的时候,可以向服务器注册一个vWebhook的地址,告诉服务器说,等调用结果一出来,第一时间通过这个Webhook地址通知我,我好处理接下来的步骤。
复制代码
gitlab创建项目

如上设置gitlab,登录gitlab
密码12345678

创建一个项目


Jenkins构建利用自由风格的软件项目

在Jenkins中创建一个新的使命:在Jenkins的首页,点击“新建使命”创建一个新的使命,选择自由风格的软件项目。





登录gitlab

获取git仓库地址


添加Gitlab认证用户和用户私钥 

添加git认证用户 


选择SSH 用户名私钥 


  1. [root@jenkins-server ~]# useradd jenkins
  2. [root@jenkins-server ~]# su - jenkins
  3. [jenkins@jenkins-server ~]$ ssh-keygen
  4. [jenkins@jenkins-server ~]$ cat .ssh/id_rsa  #查看jenkins用户的私钥
复制代码


gitlab添加jenkins用户公钥



  1. 登录到jenkins服务器中
  2. [jenkins@jenkins-server ~]$ cat .ssh/id_rsa.pub  #查看jenkins用户的公钥
复制代码

  1. 注意: 先添加到验证文件中。
  2. 在jenkins机器上面执行 连接gitlab机器,
  3. [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开启摆设
  1. 我这里在gitlab机器上面测试:
  2. [root@git-server ~]# ssh-keygen #生成秘钥
  3. [root@git-server ~]# cat .ssh/id_rsa.pub  #查看生成的公钥添加到gitlab里面去
复制代码

  1. [root@git-server ~]# git clone git@192.168.153.156:root/test1.git
  2. Cloning into 'test1'...
  3. remote: Enumerating objects: 6, done.
  4. remote: Counting objects: 100% (6/6), done.
  5. remote: Compressing objects: 100% (4/4), done.
  6. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
  7. Receiving objects: 100% (6/6), done.
  8. [root@git-server ~]# ls
  9. anaconda-ks.cfg  test1  upload
  10. [root@git-server ~]# cd test1/
  11. [root@git-server test1]# ls
  12. README.md
  13. [root@git-server test1]# touch a.txt
  14. [root@git-server test1]# git add .
  15. [root@git-server test1]# git commit -m 'test'
  16. [master 2451295] test
  17. 1 file changed, 0 insertions(+), 0 deletions(-)
  18. create mode 100644 a.txt
  19. [root@git-server test1]# git push origin master
  20. Counting objects: 4, done.
  21. Delta compression using up to 2 threads.
  22. Compressing objects: 100% (2/2), done.
  23. Writing objects: 100% (3/3), 296 bytes | 0 bytes/s, done.
  24. Total 3 (delta 0), reused 0 (delta 0)
  25. To git@192.168.153.156:root/test1.git
  26.   f3848d7..2451295  master -> master
复制代码
返回到jenkins页面检察是否自动发布



 1.jenkins怎么备份恢复

  
  1. 导航到Jenkins的根目录,拷贝根目录主home下面的 .jenkins打个包,下次要恢复就用这个覆盖,所有的东西就都一模一样了。其实就是配置的东西都在这里面,plugins目录包含所有已安装的插件
复制代码
​2.Jenkins主要整合了两个组成部分?

  
  1. Jenkins与以下两个组件集成在一起:
  2. <strong>持续集成(Continuous Integration, CI)</strong> 和 <strong>持续交付/部署(Continuous Delivery/Deployment, CD/CD)</strong>。
  3. 1.GIT, SVN等版本控制系统
  4. 2.构建时打包Maven之类的工具。
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

小小小幸运

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表