1.参数化构建界面

2.交付流水线界面

3.脚本详解

  1. #!groovy
  2. pipeline {
  3. //在任何可用的代理上执行Pipeline
  4. agent any
  5. //参数化变量,目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。
  6. parameters {
  7. //git代码路径【参数值对外隐藏】
  8. string(name:'repoUrl', defaultValue: 'git@git.*****.com:*****/*****.git', description: 'git代码路径')
  9. //repoBranch参数后续替换成git parameter不再依赖手工输入,JENKINS-46451【git parameters目前还不支持pipeline】
  10. string(name:'repoBranch', defaultValue: 'master', description: 'git分支名称')
  11. //pom.xml的相对路径
  12. string(name:'pomPath', defaultValue: 'pom.xml', description: 'pom.xml的相对路径')
  13. //war包的相对路径
  14. string(name:'warLocation', defaultValue: 'rpc/war/target/*.war', description: 'war包的相对路径 ')
  15. //服务器参数采用了组合方式,避免多次选择,使用docker为更佳实践【参数值对外隐藏】
  16. choice(name: 'server',choices:'192.168.1.107,9090,*****,*****\n192.168.1.60,9090,*****,*****', description: '测试服务器列表选择(IP,JettyPort,Name,Passwd)')
  17. //测试服务器的dubbo服务端口
  18. string(name:'dubboPort', defaultValue: '', description: '测试服务器的dubbo服务端口')
  19. //单元测试代码覆盖率要求,各项目视要求调整参数
  20. string(name:'lineCoverage', defaultValue: '', description: '单元测试代码覆盖率要求(%),小于此值pipeline将会失败!')
  21. //若勾选在pipelie完成后会邮件通知测试人员进行验收
  22. booleanParam(name: 'isCommitQA',description: '是否邮件通知测试人员进行人工验收',defaultValue: false )
  23. }
  24. //环境变量,初始确定后一般不需更改
  25. tools {
  26. maven 'maven3'
  27. jdk 'jdk8'
  28. }
  29. //常量参数,初始确定后一般不需更改
  30. environment{
  31. //git服务全系统只读账号cred_id【参数值对外隐藏】
  32. CRED_ID='*****-****-****-****-*********'
  33. //测试人员邮箱地址【参数值对外隐藏】
  34. QA_EMAIL='*****@*****.com'
  35. //接口测试(网络层)的job名,一般由测试人员编写
  36. ITEST_JOBNAME='Guahao_InterfaceTest_ExpertPatient'
  37. }
  38. options {
  39. //保持构建的最大个数
  40. buildDiscarder(logRotator(numToKeepStr: ''))
  41. }
  42. //定期检查开发代码更新,工作日每晚4点做daily build
  43. triggers {
  44. pollSCM('H 4 * * 1-5')
  45. }
  46. //pipeline运行结果通知给触发者
  47. post{
  48. success{
  49. script {
  50. wrap([$class: 'BuildUser']) {
  51. mail to: "${BUILD_USER_EMAIL }",
  52. subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER}) result",
  53. body: "${BUILD_USER}'s pineline '${JOB_NAME}' (${BUILD_NUMBER}) run success\n请及时前往${env.BUILD_URL}进行查看"
  54. }
  55. }
  56. }
  57. failure{
  58. script {
  59. wrap([$class: 'BuildUser']) {
  60. mail to: "${BUILD_USER_EMAIL }",
  61. subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER}) result",
  62. body: "${BUILD_USER}'s pineline '${JOB_NAME}' (${BUILD_NUMBER}) run failure\n请及时前往${env.BUILD_URL}进行查看"
  63. }
  64. }
  65.  
  66. }
  67. unstable{
  68. script {
  69. wrap([$class: 'BuildUser']) {
  70. mail to: "${BUILD_USER_EMAIL }",
  71. subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER})结果",
  72. body: "${BUILD_USER}'s pineline '${JOB_NAME}' (${BUILD_NUMBER}) run unstable\n请及时前往${env.BUILD_URL}进行查看"
  73. }
  74. }
  75. }
  76. }
  77.  
  78. //pipeline的各个阶段场景
  79. stages {
  80. stage('代码获取') {
  81. steps {
  82. //根据param.server分割获取参数,包括IP,jettyPort,username,password
  83. script {
  84. def split=params.server.split(",")
  85. serverIP=split[]
  86. jettyPort=split[]
  87. serverName=split[]
  88. serverPasswd=split[]
  89. }
  90. echo "starting fetchCode from ${params.repoUrl}......"
  91. // Get some code from a GitHub repository
  92. git credentialsId:CRED_ID, url:params.repoUrl, branch:params.repoBranch
  93. }
  94. }
  95. stage('单元测试') {
  96. steps {
  97. echo "starting unitTest......"
  98. //注入jacoco插件配置,clean test执行单元测试代码. All tests should pass.
  99. sh "mvn org.jacoco:jacoco-maven-plugin:prepare-agent -f ${params.pomPath} clean test -Dautoconfig.skip=true -Dmaven.test.skip=false -Dmaven.test.failure.ignore=true"
  100. junit '**/target/surefire-reports/*.xml'
  101. //配置单元测试覆盖率要求,未达到要求pipeline将会fail,code coverage.LineCoverage>20%.
  102. jacoco changeBuildStatus: true, maximumLineCoverage:"${params.lineCoverage}"
  103. }
  104. }
  105. stage('静态检查') {
  106. steps {
  107. echo "starting codeAnalyze with SonarQube......"
  108. //sonar:sonar.QualityGate should pass
  109. withSonarQubeEnv('SonarQube') {
  110. //固定使用项目根目录${basedir}下的pom.xml进行代码检查
  111. sh "mvn -f pom.xml clean compile sonar:sonar"
  112. }
  113. script {
  114. timeout() {
  115. //利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
  116. def qg = waitForQualityGate()
  117. if (qg.status != 'OK') {
  118. error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
  119. }
  120. }
  121. }
  122. }
  123. }
  124.  
  125. stage('部署测试环境') {
  126. steps {
  127. echo "starting deploy to ${serverIP}......"
  128. //编译和打包
  129. sh "mvn -f ${params.pomPath} clean package -Dautoconfig.skip=true -Dmaven.test.skip=true"
  130. archiveArtifacts warLocation
  131. script {
  132. wrap([$class: 'BuildUser']) {
  133. //发布war包到指定服务器,虚拟机文件目录通过shell脚本初始化建立,所以目录是固定的
  134. sh "sshpass -p ${serverPasswd} scp ${params.warLocation} ${serverName}@${serverIP}:htdocs/war"
  135. //这里增加了一个小功能,在服务器上记录了基本部署信息,方便多人使用一套环境时问题排查,storge in {WORKSPACE}/deploy.log & remoteServer:htdocs/war
  136. Date date = new Date()
  137. def deploylog="${date.toString()},${BUILD_USER} use pipeline '${JOB_NAME}(${BUILD_NUMBER})' deploy branch ${params.repoBranch} to server ${serverIP}"
  138. println deploylog
  139. sh "echo ${deploylog} >>${WORKSPACE}/deploy.log"
  140. sh "sshpass -p ${serverPasswd} scp ${WORKSPACE}/deploy.log ${serverName}@${serverIP}:htdocs/war"
  141. //jetty restart,重启jetty
  142. sh "sshpass -p ${serverPasswd} ssh ${serverName}@${serverIP} 'bin/jettyrestart.sh' "
  143. }
  144. }
  145. }
  146. }
  147.  
  148. stage('接口自动化测试') {
  149. steps{
  150. echo "starting interfaceTest......"
  151. script {
  152. //为确保jetty启动完成,加了一个判断,确保jetty服务器启动可以访问后再执行接口层测试。
  153. timeout() {
  154. waitUntil {
  155. try {
  156. //确保jetty服务的端口启动成功
  157. sh "nc -z ${serverIP} ${jettyPort}"
  158. //sh "wget -q http://${serverIP}:${jettyPort} -O /dev/null"
  159. return true
  160. } catch (exception) {
  161. return false
  162. }
  163. }
  164. }
  165. //将参数IP和Port传入到接口测试的job,需要确保接口测试的job参数可注入
  166. build job: ITEST_JOBNAME, parameters: [string(name: "dubbourl", value: "${serverIP}:${params.dubboPort}")]
  167. }
  168. }
  169. }
  170.  
  171. stage('UI自动化测试') {
  172. steps{
  173. echo "starting UITest......"
  174. //这个项目不需要UI层测试,UI自动化与接口测试的pipeline脚本类似
  175. }
  176. }
  177.  
  178. stage('性能自动化测试 ') {
  179. steps{
  180. echo "starting performanceTest......"
  181. //视项目需要增加性能的冒烟测试,具体实现后续专文阐述
  182. }
  183. }
  184.  
  185. stage('通知人工验收'){
  186. steps{
  187. script{
  188. wrap([$class: 'BuildUser']) {
  189. if(params.isCommitQA==false){
  190. echo "不需要通知测试人员人工验收"
  191. }else{
  192. //邮件通知测试人员人工验收
  193. mail to: "${QA_EMAIL}",
  194. subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER})人工验收通知",
  195. body: "${BUILD_USER}提交的PineLine '${JOB_NAME}' (${BUILD_NUMBER})进入人工验收环节\n请及时前往${env.BUILD_URL}进行测试验收"
  196. }
  197.  
  198. }
  199. }
  200. }
  201. }
  202.  
  203. // stage('发布系统') {
  204. // steps{
  205. // echo "starting deploy......"
  206. // // TODO发布环节后续专题阐述
  207. // }
  208. // }
  209. }
  210. }

jenkins pipeline 复杂的发布流程的更多相关文章

  1. Jenkins + Pipeline 构建流水线发布

      Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...

  2. (转)Jenkins2.0 Pipeline 插件执行持续集成发布流程 - git -资料 - 不错的文档

    1.Jenkins 2.0 的精髓是 Pipeline as Code Jenkins 2.0 的精髓是 Pipeline as Code,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色 ...

  3. jenkins配置记录(2)--代码发布流程

    在我们的日常运维工作中,使用jenkins来完成业务代码发版上线是至关重要的一环.前面已经提到在jenkins上添加用户权限的操作,今天重点说下如何在jenkins下构建项目工程进行代码发布? 在此简 ...

  4. jenkins + pipeline构建自动化部署

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

  5. 基于Jenkins Pipeline的ASP.NET Core持续集成实践

    最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...

  6. [持续交付实践] Jenkins Pipeline 高可用设计方法

    前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...

  7. 基于 Jenkins+Docker+Git 的CI流程初探

    在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...

  8. Docker的Jenkins Pipeline工作流

    原文地址:http://www.youruncloud.com/blog/127.html 分享主题 一个软件产品的开发周期中,尤其是敏捷开发,持续集成和持续部署是必不可少的环节,而随着产品的丰富,模 ...

  9. 基于Jenkins的开发测试全流程持续集成实践

    今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...

随机推荐

  1. 【深度学习】计算机视觉中的 Single-Scale 和 Multi-Scale

    Single-Scale:是指把一张图片送到 CNN : Multi-Scale:一般会送到 CNN 十张图片:比如高宽是 256 Χ 256 的图片,Multi-Scale会在它的四个角以及中心裁剪 ...

  2. 大文件SQl脚本怎么还原以及SQlsqlserver怎么全自动备份数据库

    1:导出的SQl脚本文件通常大于100M左右就会还原不了,不是报错就是说系统文件找不到(sql脚本是直接拖进来的,不存在路径的问题). 2:CMD 使用 OSQL命令或者Sqlcmd命令都是可以解决的 ...

  3. C# - VS2019WinFrm程序通过SMTP方式实现邮件发送

    前言 本篇主要记录:VS2019 WinFrm桌面应用程序通过SMTP方式实现邮件发送.作为Delphi转C#的关键一步,接下来将逐步实现Delphi中常用到的功能. 准备工作 搭建WinFrm前台界 ...

  4. laravel Method Illuminate\Validation\Validator::validateReuqired does not exist.

    Method Illuminate\Validation\Validator::validateReuqired does not exist. 此错误是由于我们在配置验证时,写错了关键字, publ ...

  5. Jenkins持续集成的应用--基础

    1.测试工程师为什么要掌握持续集成 一个程序员如果想发布一个产品,他需要编码.编译.测试,发布的过程.对于一个企业来说,如果也想发布一个产品的话,同样的也是需要上述的过程,区别在于企业要发布的产品的需 ...

  6. Vue计算属性computed的全面解析

    前言 一直以来对computed这个计算属性都只停在一个大概的认知中,最近特意仔细研读相关资料,亲测后逐渐了解了其特性. 正文 computed 特点: 1.初始化/依赖属性(即data属性)改变时执 ...

  7. 不了解MES系统中的看板管理?看完本文就懂了

    如果想要在生产车间中,让生产过程管理都处在“看得见”的状态,那么看板可视化管理的导入是你的不二选择. MES看板包括四个部分:生产任务看板.各生产单位生产情况看板.质量看板和物料看板,其中生产任务看板 ...

  8. 8、RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较

    RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较 RabbitMQ中,除了Simple Queue和Work Queue之外的所有生产者提交的消息都由Exc ...

  9. JS高阶---作用域与执行上下文

    一句话介绍 .

  10. 防止ARP欺骗

    前言: 曾经因为宿舍里面的同学经常熬夜打游戏,好言相劝不管用,无奈之下使用arp欺骗他们的主机,使之晚上11点之后游戏延迟,掉线,最后,一到11点同学们就都上床睡觉了. 防止arp欺骗的三种思路: 在 ...