一文学会jenkins pipline自动化构建

本文章出自【码同学软件测试】


中文在线文档:https://www.jenkins.io/zh/doc/book/pipeline/

还有一个:https://www.w3cschool.cn/jenkins/jenkins-qc8a28op.html

码同学公众号:自动化软件测试

码同学抖音号:小码哥聊软件测试

01     Pipeline流水线基本语法

首先创建 在jenkins上创建一个pipeline的流水线任务新建ITEM-->选择流水线

基本pipeline脚本结构

pipeline {    //agent 表示要执行的节点,any表示任意节点 

  agent any 

  //stages表示任务执行时的所有步骤集合 

  stages {     

        //stage就表示一个步骤,括号里是步骤名称     

        stage('拉取项目源码'){         

              //每一个stage都可以定义自己执行的节点,如果没定义,则用最上方的         

    agent {                // label 后跟的是节点的标签名称                label 'mall-server'      }            steps {                echo '这是拉取代码这一步'                echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL} ${env.JOB_NAME}"                echo "${currentBuild.result} sdsdd"                sh 'pwd'                //如果当前节点是windows,我想执行windows下的命令                //bat 'dir'            }                    }                stage('静态代码扫描'){            steps {                echo '这是静态代码扫描'            }                            }                stage('单元测试'){            steps {                echo '执行jacoco单元测试'            }                  }                stage('打包依赖服务'){            steps {                echo '打包依赖服务'            }                  }                stage('打包当前服务'){            steps {                echo '打包当前服务'            }                  }                stage('部署环境'){            steps {                echo '部署环境'            }                  }                stage('接口自动化测试'){            agent {                label 'auto_test'                        }            steps {                echo '接口自动化测试'            }     

        }        stage('ui自动化'){            steps {                echo 'ui自动化'            }                          }    }}


02    针对mall微服务项目编写pipeline脚本

对于pipeline脚本来说我们不用去记那么多的东西,可以打开自己的pipeline任务,点击流水线语法后,使用下面两个菜单帮我们生成部分脚本

对于一个项目来说可能具备多服务多环境的现象所以我们要创建环境节点参数、服务名称参数

在pipeline脚本的最上方增加如下://定义了两组选项参数parameters {

choice choices: ['mall-admin', 'mall-demo', 'mall-auth', 'mall-serach'], name:'servername' choice choices: ['mall-server', 'mall-dev', 'mall-prod'], name: 'node_env'

}

配好后先执行一次任务

选择项目部署的节点因为部署的节点环境根据上一步的参数来的,用户选什么我们就执行什么,所以label的值是一个变量agent {

label "${node_env}"}

拉取项目代码

拷贝生成的脚本,放在拉代码的阶段的steps下stage('拉取项目源码'){

steps {

echo '这是拉取代码这一步'

git credentialsId: '4c1003ef-ac70-4271-8649-1759e79d430a', url: 'http://192.168.0.109/shamo/mall-swarm-master.git'

}

}

单元测试覆盖率由于mall这个项目原本没有集成jacoco相关的覆盖率统计,因此我们先对项目做些修改

① 修改整个项目最根的pom.xml文件

<skipTests>false</skipTests>

② 修改各个子模块服务的pom.xml

<dependency>

      <groupId>org.jacoco</groupId>

      <artifactId>jacoco-maven-plugin</artifactId>   

      <version>0.8.6</version>

</dependency>

<plugin>


    <groupId>org.jacoco</groupId> 

    <artifactId>jacoco-maven-plugin</artifactId> 

    <version>0.8.6</version> 

    <configuration>     

          <destFile>target/coverage-reports/jacoco-unit.exec</destFile>

          <dataFile>target/coverage-reports/jacoco-unit.exec</dataFile>

      </configuration> 

      <executions>     

          <execution>         

              <id>jacoco-initialize</id>   

              <goals>             

                  <goal>prepare-agent</goal>                     

              </goals>     

          </e

xe

cution>


          <execution>         

            <id>jacoco-site</id>       




            <phase>test</phase>         

            <goals>             

                <goal>report</goal>         

            </goals>     

          </execution> 

      </executions>

</plugin>

③ 编写pipeline

复制生成的jacoco指令,填入相应的steps里

免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以转发文章 + 私信「码同学666」获取资料哦

stage('单元测试'){      steps {         

            echo '执行jacoco单元测试'         

            sh '''         

            cd "${servername}"         

            mvn test           

            '''         

            jacoco changeBuildStatus: true,

            maximumBranchCoverage: '100',

            maximumClassCoverage: '100',

            maximumComplexityCoverage: '100',

            maximumInstructionCoverage: '100',

            maximumLineCoverage: '100',

            maximumMethodCoverage: '100',

            minimumBranchCoverage: '90',

            minimumClassCoverage: '90',

            minimumComplexityCoverage: '90',

            minimumInstructionCoverage: '90',

            minimumLineCoverage: '90',

            minimumMethodCoverage: '90'     

        }             

}

静态代码扫描

拷贝生成的到静态扫描的stage的steps里,再补充sonar扫描的指令

stage('静态代码扫描'){    steps {

        echo '这是静态代码扫描' 

        withSonarQubeEnv(credentialsId: '1d74c7e8-5b27-4772-9a21-41e17eb87b7d', installationName: 'sonar') {

              // 执行sonar扫描的指令 

              sh ''' 

              cd "${servername}" 

              mvn sonar:sonar \ 

              -Dsonar.projectKey=${JOB_NAME}-${servername}$BUILD_NUMBER \ 

              -Dsonar.projectName=mall \ 

              -Dsonar.language=java \ 

              -Dsonar.sourceEncoding=UTF-8 \ 

              ''' 

          }

    }

}

打包并部署

stage('服务打包并部署'){

      steps { 

          echo '打包依赖服务' 

          //打包每个服务都依赖的模块 

          sh 'mvn clean install -pl mall-common,mall-mbg -am' 

          //打包我要部署的这个服务模块 

          sh ''' 

          cd "${servername}" 

          mvn clean package 

          '''   

          //执行部署脚本文件 

          sh '/mydata/sh/${servername}.sh' 

      }   

}

钉钉通知钉钉通知在每个阶段其实都可以加的,我们把他加载部署里

stage('服务打包并部署'){

    steps { 

        echo '打包依赖服务' 

        //打包每个服务都依赖的模块 

        sh 'mvn clean install -pl mall-common,mall-mbg -am' 

        //打包我要部署的这个服务模块 

        sh ''' 

        cd "${servername}" 

        mvn clean package 

        ''' 

        //执行部署脚本文件 

        sh '/mydata/sh/${servername}.sh' 

        //部署完成后钉钉通知项目组 

      dingtalk( 

          robot:'dd001',//robot指的是你在系统配置中配的钉钉机器人的id 

          type:'MARKDOWN', 

          atAll: false, 

          title: "${servername} 部署成功", 

          text: ["#### '${JOB_NAME}'项目扫描部署  \n - 任务:第'${BUILD_NUMBER}'次\n - 状态:'${currentBuild.result}' \n - 执行人: '${user}' \n \n[查看控制台]('${BUILD_URL}')"] 

        )

  } 

}

配置自动化任务allure插件的脚本生成如下:

邮件的脚本生成如下:

stage('接口自动化测试'){

        //如果之前的步骤执行时失败了改动了当前任务的结果,那么自动化测试没有必要执行 

        //下面的判断指的是没结果时或者结果是成功时

        when {     

            expression {     

              currentBuild.result==null||currentBuild.result == 'SUCCESS'       

            }   

          } 

          //使用自动化执行的节点 

          agent { 

              label 'auto_test'   

          } 

          steps { 

            echo '接口自动化测试' 

            //拉取自动化脚本 

            git credentialsId:'4c1003efac70-4271-8649-1759e79d430a', url: 'http://192.168.0.109/shamo/mallapitest1.git' 

            //执行自动化测试,由于这个节点是windows的,所以采用bat xxx来执行命令操作 

            bat 'python run.py' 

            //生成测试报告 

            allure includeProperties: false, jdk: '', results: [[path: 'report/shop']] 

            //发送结果邮件 

          emailext body: '''<!DOCTYPE html> 


          <html>     

          <head>     

          <meta charset="UTF-8">

          <title>$PROJECT_NAME-第$BUILD_NUMBER次构建日志</title>     

          </head>     


          <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"    offset="0">

          <div>

          <table width="95%" cellpadding="0" cellspacing="0"    style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">     

          <tr>     

              <th colspan="2"><br />       

                  <h2>构建信息</h2>       

              </th>     

            </tr>     

            <tr>       

                <td>         

                    <ul> 

                      <li>项目名称 :$PROJECT_NAME</li><br />         

                      <li>详细测试日志 :<a href=${BUILD_URL}console

target=\'_blank\'>${BUILD_URL}console</a></li><br

/>       

                      <li>详细测试报告 :<a

href=${JOB_URL}${$BUILD_NUMBER}/allure

target=\'_blank\'>${JOB_URL}${$BUILD_NUMBER}/allure</a></li><br />       

                        <li>触发原因:${CAUSE}</li><br />         

                  <li>项目  Url :<a href=‘$BUILD_URL’

target=\'_blank\'>$BUILD_URL</a></li><br />       

                          </ul>       

                      </td>     

                    </tr>     

              </table>     

            </div>     

      </body>     

    </html>''',   

    subject: '$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!',        to: '2879897713@qq.com'     

  }     

}

最后执行

END

免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可以关注我们公众号哦:自动化软件测试

本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,667评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,361评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,700评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,027评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,988评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,230评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,705评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,366评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,496评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,405评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,453评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,126评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,725评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,803评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,015评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,514评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,111评论 2 341

推荐阅读更多精彩内容