jenkins pipeline 复杂的发布流程
1.参数化构建界面
2.交付流水线界面
3.脚本详解
- #!groovy
- pipeline {
- //在任何可用的代理上执行Pipeline
- agent any
- //参数化变量,目前只支持[booleanParam, choice, credentials, file, text, password, run, string]这几种参数类型,其他高级参数化类型还需等待社区支持。
- parameters {
- //git代码路径【参数值对外隐藏】
- string(name:'repoUrl', defaultValue: 'git@git.*****.com:*****/*****.git', description: 'git代码路径')
- //repoBranch参数后续替换成git parameter不再依赖手工输入,JENKINS-46451【git parameters目前还不支持pipeline】
- string(name:'repoBranch', defaultValue: 'master', description: 'git分支名称')
- //pom.xml的相对路径
- string(name:'pomPath', defaultValue: 'pom.xml', description: 'pom.xml的相对路径')
- //war包的相对路径
- string(name:'warLocation', defaultValue: 'rpc/war/target/*.war', description: 'war包的相对路径 ')
- //服务器参数采用了组合方式,避免多次选择,使用docker为更佳实践【参数值对外隐藏】
- choice(name: 'server',choices:'192.168.1.107,9090,*****,*****\n192.168.1.60,9090,*****,*****', description: '测试服务器列表选择(IP,JettyPort,Name,Passwd)')
- //测试服务器的dubbo服务端口
- string(name:'dubboPort', defaultValue: '', description: '测试服务器的dubbo服务端口')
- //单元测试代码覆盖率要求,各项目视要求调整参数
- string(name:'lineCoverage', defaultValue: '', description: '单元测试代码覆盖率要求(%),小于此值pipeline将会失败!')
- //若勾选在pipelie完成后会邮件通知测试人员进行验收
- booleanParam(name: 'isCommitQA',description: '是否邮件通知测试人员进行人工验收',defaultValue: false )
- }
- //环境变量,初始确定后一般不需更改
- tools {
- maven 'maven3'
- jdk 'jdk8'
- }
- //常量参数,初始确定后一般不需更改
- environment{
- //git服务全系统只读账号cred_id【参数值对外隐藏】
- CRED_ID='*****-****-****-****-*********'
- //测试人员邮箱地址【参数值对外隐藏】
- QA_EMAIL='*****@*****.com'
- //接口测试(网络层)的job名,一般由测试人员编写
- ITEST_JOBNAME='Guahao_InterfaceTest_ExpertPatient'
- }
- options {
- //保持构建的最大个数
- buildDiscarder(logRotator(numToKeepStr: ''))
- }
- //定期检查开发代码更新,工作日每晚4点做daily build
- triggers {
- pollSCM('H 4 * * 1-5')
- }
- //pipeline运行结果通知给触发者
- post{
- success{
- script {
- wrap([$class: 'BuildUser']) {
- mail to: "${BUILD_USER_EMAIL }",
- subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER}) result",
- body: "${BUILD_USER}'s pineline '${JOB_NAME}' (${BUILD_NUMBER}) run success\n请及时前往${env.BUILD_URL}进行查看"
- }
- }
- }
- failure{
- script {
- wrap([$class: 'BuildUser']) {
- mail to: "${BUILD_USER_EMAIL }",
- subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER}) result",
- body: "${BUILD_USER}'s pineline '${JOB_NAME}' (${BUILD_NUMBER}) run failure\n请及时前往${env.BUILD_URL}进行查看"
- }
- }
- }
- unstable{
- script {
- wrap([$class: 'BuildUser']) {
- mail to: "${BUILD_USER_EMAIL }",
- subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER})结果",
- body: "${BUILD_USER}'s pineline '${JOB_NAME}' (${BUILD_NUMBER}) run unstable\n请及时前往${env.BUILD_URL}进行查看"
- }
- }
- }
- }
- //pipeline的各个阶段场景
- stages {
- stage('代码获取') {
- steps {
- //根据param.server分割获取参数,包括IP,jettyPort,username,password
- script {
- def split=params.server.split(",")
- serverIP=split[]
- jettyPort=split[]
- serverName=split[]
- serverPasswd=split[]
- }
- echo "starting fetchCode from ${params.repoUrl}......"
- // Get some code from a GitHub repository
- git credentialsId:CRED_ID, url:params.repoUrl, branch:params.repoBranch
- }
- }
- stage('单元测试') {
- steps {
- echo "starting unitTest......"
- //注入jacoco插件配置,clean test执行单元测试代码. All tests should pass.
- 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"
- junit '**/target/surefire-reports/*.xml'
- //配置单元测试覆盖率要求,未达到要求pipeline将会fail,code coverage.LineCoverage>20%.
- jacoco changeBuildStatus: true, maximumLineCoverage:"${params.lineCoverage}"
- }
- }
- stage('静态检查') {
- steps {
- echo "starting codeAnalyze with SonarQube......"
- //sonar:sonar.QualityGate should pass
- withSonarQubeEnv('SonarQube') {
- //固定使用项目根目录${basedir}下的pom.xml进行代码检查
- sh "mvn -f pom.xml clean compile sonar:sonar"
- }
- script {
- timeout() {
- //利用sonar webhook功能通知pipeline代码检测结果,未通过质量阈,pipeline将会fail
- def qg = waitForQualityGate()
- if (qg.status != 'OK') {
- error "未通过Sonarqube的代码质量阈检查,请及时修改!failure: ${qg.status}"
- }
- }
- }
- }
- }
- stage('部署测试环境') {
- steps {
- echo "starting deploy to ${serverIP}......"
- //编译和打包
- sh "mvn -f ${params.pomPath} clean package -Dautoconfig.skip=true -Dmaven.test.skip=true"
- archiveArtifacts warLocation
- script {
- wrap([$class: 'BuildUser']) {
- //发布war包到指定服务器,虚拟机文件目录通过shell脚本初始化建立,所以目录是固定的
- sh "sshpass -p ${serverPasswd} scp ${params.warLocation} ${serverName}@${serverIP}:htdocs/war"
- //这里增加了一个小功能,在服务器上记录了基本部署信息,方便多人使用一套环境时问题排查,storge in {WORKSPACE}/deploy.log & remoteServer:htdocs/war
- Date date = new Date()
- def deploylog="${date.toString()},${BUILD_USER} use pipeline '${JOB_NAME}(${BUILD_NUMBER})' deploy branch ${params.repoBranch} to server ${serverIP}"
- println deploylog
- sh "echo ${deploylog} >>${WORKSPACE}/deploy.log"
- sh "sshpass -p ${serverPasswd} scp ${WORKSPACE}/deploy.log ${serverName}@${serverIP}:htdocs/war"
- //jetty restart,重启jetty
- sh "sshpass -p ${serverPasswd} ssh ${serverName}@${serverIP} 'bin/jettyrestart.sh' "
- }
- }
- }
- }
- stage('接口自动化测试') {
- steps{
- echo "starting interfaceTest......"
- script {
- //为确保jetty启动完成,加了一个判断,确保jetty服务器启动可以访问后再执行接口层测试。
- timeout() {
- waitUntil {
- try {
- //确保jetty服务的端口启动成功
- sh "nc -z ${serverIP} ${jettyPort}"
- //sh "wget -q http://${serverIP}:${jettyPort} -O /dev/null"
- return true
- } catch (exception) {
- return false
- }
- }
- }
- //将参数IP和Port传入到接口测试的job,需要确保接口测试的job参数可注入
- build job: ITEST_JOBNAME, parameters: [string(name: "dubbourl", value: "${serverIP}:${params.dubboPort}")]
- }
- }
- }
- stage('UI自动化测试') {
- steps{
- echo "starting UITest......"
- //这个项目不需要UI层测试,UI自动化与接口测试的pipeline脚本类似
- }
- }
- stage('性能自动化测试 ') {
- steps{
- echo "starting performanceTest......"
- //视项目需要增加性能的冒烟测试,具体实现后续专文阐述
- }
- }
- stage('通知人工验收'){
- steps{
- script{
- wrap([$class: 'BuildUser']) {
- if(params.isCommitQA==false){
- echo "不需要通知测试人员人工验收"
- }else{
- //邮件通知测试人员人工验收
- mail to: "${QA_EMAIL}",
- subject: "PineLine '${JOB_NAME}' (${BUILD_NUMBER})人工验收通知",
- body: "${BUILD_USER}提交的PineLine '${JOB_NAME}' (${BUILD_NUMBER})进入人工验收环节\n请及时前往${env.BUILD_URL}进行测试验收"
- }
- }
- }
- }
- }
- // stage('发布系统') {
- // steps{
- // echo "starting deploy......"
- // // TODO发布环节后续专题阐述
- // }
- // }
- }
- }
jenkins pipeline 复杂的发布流程的更多相关文章
- Jenkins + Pipeline 构建流水线发布
Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...
- (转)Jenkins2.0 Pipeline 插件执行持续集成发布流程 - git -资料 - 不错的文档
1.Jenkins 2.0 的精髓是 Pipeline as Code Jenkins 2.0 的精髓是 Pipeline as Code,是帮助 Jenkins 实现 CI 到 CD 转变的重要角色 ...
- jenkins配置记录(2)--代码发布流程
在我们的日常运维工作中,使用jenkins来完成业务代码发版上线是至关重要的一环.前面已经提到在jenkins上添加用户权限的操作,今天重点说下如何在jenkins下构建项目工程进行代码发布? 在此简 ...
- jenkins + pipeline构建自动化部署
一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...
- 基于Jenkins Pipeline的ASP.NET Core持续集成实践
最近在公司实践持续集成,使用到了Jenkins的Pipeline来提高团队基于ASP.NET Core API服务的集成与部署效率,因此这里总结一下. 一.关于持续集成与Jenkins Pipelin ...
- [持续交付实践] Jenkins Pipeline 高可用设计方法
前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...
- 基于 Jenkins+Docker+Git 的CI流程初探
在如今的互联网时代,随着软件开发复杂度的不断提高,软件开发和发布管理也越来越重要.目前已经形成一套标准的流程,最重要的组成部分就是持续集成(Continuous Integration,CI)及持续部 ...
- Docker的Jenkins Pipeline工作流
原文地址:http://www.youruncloud.com/blog/127.html 分享主题 一个软件产品的开发周期中,尤其是敏捷开发,持续集成和持续部署是必不可少的环节,而随着产品的丰富,模 ...
- 基于Jenkins的开发测试全流程持续集成实践
今年一直在公司实践CI,本文将近半年来的一些实践总结一下,可能不太完善或优美,但的确初步解决了我目前所在项目组的一些痛点.当然这仅是一家之言也不够完整,后续还会深入实践和引入Kubernetes进行容 ...
随机推荐
- 【深度学习】计算机视觉中的 Single-Scale 和 Multi-Scale
Single-Scale:是指把一张图片送到 CNN : Multi-Scale:一般会送到 CNN 十张图片:比如高宽是 256 Χ 256 的图片,Multi-Scale会在它的四个角以及中心裁剪 ...
- 大文件SQl脚本怎么还原以及SQlsqlserver怎么全自动备份数据库
1:导出的SQl脚本文件通常大于100M左右就会还原不了,不是报错就是说系统文件找不到(sql脚本是直接拖进来的,不存在路径的问题). 2:CMD 使用 OSQL命令或者Sqlcmd命令都是可以解决的 ...
- C# - VS2019WinFrm程序通过SMTP方式实现邮件发送
前言 本篇主要记录:VS2019 WinFrm桌面应用程序通过SMTP方式实现邮件发送.作为Delphi转C#的关键一步,接下来将逐步实现Delphi中常用到的功能. 准备工作 搭建WinFrm前台界 ...
- laravel Method Illuminate\Validation\Validator::validateReuqired does not exist.
Method Illuminate\Validation\Validator::validateReuqired does not exist. 此错误是由于我们在配置验证时,写错了关键字, publ ...
- Jenkins持续集成的应用--基础
1.测试工程师为什么要掌握持续集成 一个程序员如果想发布一个产品,他需要编码.编译.测试,发布的过程.对于一个企业来说,如果也想发布一个产品的话,同样的也是需要上述的过程,区别在于企业要发布的产品的需 ...
- Vue计算属性computed的全面解析
前言 一直以来对computed这个计算属性都只停在一个大概的认知中,最近特意仔细研读相关资料,亲测后逐渐了解了其特性. 正文 computed 特点: 1.初始化/依赖属性(即data属性)改变时执 ...
- 不了解MES系统中的看板管理?看完本文就懂了
如果想要在生产车间中,让生产过程管理都处在“看得见”的状态,那么看板可视化管理的导入是你的不二选择. MES看板包括四个部分:生产任务看板.各生产单位生产情况看板.质量看板和物料看板,其中生产任务看板 ...
- 8、RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较 RabbitMQ中,除了Simple Queue和Work Queue之外的所有生产者提交的消息都由Exc ...
- JS高阶---作用域与执行上下文
一句话介绍 .
- 防止ARP欺骗
前言: 曾经因为宿舍里面的同学经常熬夜打游戏,好言相劝不管用,无奈之下使用arp欺骗他们的主机,使之晚上11点之后游戏延迟,掉线,最后,一到11点同学们就都上床睡觉了. 防止arp欺骗的三种思路: 在 ...