[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

其他两篇相关文章为

持续交付流水线中的消息传递与协作实现

GitLab 自动触发 Jenkins 构建

配置Jenkins Job(初级)

初级通过可视化界面配置Job,已经可以满足大部分需求,但在之后我需要自定义Mattermost订阅消息内容时,我发现我必须使用Jenkins流水线脚本发送自定义消息,因此我实际中使用了高级的配置过程,初级的可以供初学者快速上手。

构建触发器——触发远程构建

Remote Access API

  • 在Job的配置中添加构建触发器

[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

  • 这样只要在流水线的测试阶段中访问远程触发器即可。 注意: 访问Jenkins Remote API是需要权限的,这里填上登录的用户即可。

    test: # 使用jenkins远程构建
      stage: test
      script:
        - curl -u $JENKINS_USER:$JENKINS_PWD $JENKINS_TRIGGER_URL
    
构建——执行Shell

使用echo $? 查看命令是否执行成功

How to get the numeric exit status of an exited docker container?

  • 构建将使用执行Shell的方式进行。

    echo "---开始构建---"
    docker pull your_registry.com/gauge-taiko-icy:master
    docker run --privileged --name gauge-taiko your_registry.com/gauge-taiko-icy:master || true
    docker inspect gauge-taiko --format='{{.State.ExitCode}}'
    docker cp gauge-taiko:/gauge/reports/html-report/. ./reports
    docker rm gauge-taiko
    echo "---结束构建---"
    
    • 思路是容器会根据测试成功或失败而执行exit 0exit 1,然后docker再根据容器的退出状态得知测试情况。
构建后操作——发布HTML页面

Jenkins上HTML报告显示无格式?

accessing Jenkins HTML report

  • 如果Shell执行顺利,那么./reports下将会存放着HTML测试报告,所以我们可以添加Publish HTML reports

[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

  • 如果报告发生样式丢失情况,请前往Jenkins-系统管理-脚本命令行,输入

    System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")
    

获取测试情况

  • 首先需要得知测试是否成功,这个值可以在这步查看:docker inspect gauge-taiko --format='{{.State.ExitCode}}'

[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

  • 然后是测试报告,可以之后将该url分享出去

    • 如果希望给匿名用户权限,请在安全 > 全局安全配置 > 授权策略勾选安全矩阵,并为Anonymous Users添加Read权限,如下图

[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

配置Jenkins Pipeline(高级)

jenkins pipeline中获取shell命令的输出_紫眸的博客-CSDN博客

流水线语法 (jenkins.io)

jenkins pipeline将通过执行的shell命令更改环境变量environment_yudelian的博客-CSDN博客

10分钟搞定让你困惑的 Jenkins 环境变量_日拱一兵-CSDN博客

Pipeline的用法相对来说还是稍微比较复杂的,不过如果只是简单应用的话,也不会涉及额外的语句。类似GitLab的流水线,分为多个stage。

如果需要执行插件的功能,可以在流水线 > 流水线语法中使用辅助功能自动生成流水线语句。

[Jenkins]Gauge测试UI+Jenkins流水线+Mattermost消息订阅(Jenkins篇)

流水线总体架构
  • 顺序执行一些stage后,根据测试结果分叉,选择对应的最终阶段

    pipeline{
        agent any
        
        stages{
            stage('test'){
                steps{
                    // stage test scripts
                }
            }
            stage('publish HTML'){
                steps{
                    // stage publish HTML scripts
                }
                
            }
            stage('success'){
                when{
                    // when test success
                }
                steps{
                    // stage success scripts
                }
            }
            stage('failed'){
                when{
                    // when test failed
                }
                steps{
                    script{
                        // stage failed scripts
                    }
                }
            }
        }
    }
    
Stage1:test
  • 在这个阶段里我们直接执行之前写好的shell脚本:

    stage('test'){
        steps{
            script{
                echo "---开始构建---"
                sh 'docker pull your_registry.com/gauge-taiko:master'
                sh 'docker run --privileged --name gauge-taiko your_registry.com/gauge-taiko:master || true'
                TEST_RESULTS =sh(
                    returnStdout: true, 
                    script: "docker inspect gauge-taiko --format='{{.State.ExitCode}}'"
                ).trim()
                sh 'docker cp gauge-taiko:/gauge/reports/html-report/. ./reports'
                sh 'docker rm gauge-taiko'
                echo "---结束构建---"
            }
    
        }
    }
    
    • 这里注意,我们将关键的测试结果赋值给pipeline的变量TEST_RESULTS。trim()去掉了结果前后万恶的空格,
Stage2:publish HTML

Jenkins Pipeline publish html report

  • 这段脚本就是用辅助功能自动生成的

    stage('publish HTML'){
        steps{
            script{
                publishHTML(
                    [allowMissing: false,
                     alwaysLinkToLastBuild: false,
                     keepAll: false,
                     reportDir: './reports',
                     reportFiles: 'index.html',
                     reportName: 'HTML Report',
                     reportTitles: ''])
            }
        }
    }
    
Stage3-1:success
  • 如果TEST_RESULTS为0,证明测试通过。

    • 注意:会有定时构建计划保持下一次构建定时运行
    stage('success'){
        when{
            expression { TEST_RESULTS == "0"}
        }
        steps{
            script{
                echo 'success'
            }
    
        }
    }
    
Stage3-2:failed

Failing a build in Jenkinsfile

How to disable a Jenkins job via curl?

  • 如果TEST_RESULTS为1,证明测试失败

    stage('failed'){
        when{
            expression { TEST_RESULTS == "1"}
        }
        steps{
            script{
                mattermostSend channel: 'jenkins_hook', 
                color: '#E40303',
                endpoint: 'your_mattermost_url/hooks/yx***dw',
                message: '测试失败!测试报告:[GaugeTestPipeline/HTML_20Report/](your_jenkins_url/job/GaugeTestPipeline/HTML_20Report/)'
                
                API_TOKEN= '110301370d3e0bcbb241ae38d3fb69ce2a'
                        CRUMB=sh(returnStdout: true, 
                        	    script: "curl -s 'http://admin:110301370d3e0bcbb241ae38d3fb69ce2a@your_jenkins_url/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,\\\":\\\",//crumb)'"
                        	).trim()
                        echo "$CRUMB"
                sh 'curl -X POST -H "$CRUMB" http://admin:110301370d3e0bcbb241ae38d3fb69ce2a@your_jenkins_url/GaugeTestPipeline/disable'
                error("测试失败")
            }
            
        }
    }
    
    • \\\"会先被pipeline转义成\",然后再被sh转义成"
    • API_TOKEN需要访问个人中心 > 设置 > API Token获取
    • 项目如果被禁用,就不会继续定时构建,这样就防止反复向Mattermost推送失败消息

MINE MIND系列将在我的GitHub上实时更新,同时精选部分汇总于CSDN专栏
GitHub仓库:https://github.com/IcyLeaves/MINE-MIND
CSDN专栏:https://blog.csdn.net/qq_37398834/category_10975647.html

上一篇:如何用canvas拍出 jDer's工作照


下一篇:nnunet(五) edit plans files