【问题标题】:How do I fail a Jenkins pipeline with below a certain PHPUnit code coverage percentage?如何在低于特定 PHPUnit 代码覆盖率的情况下使 Jenkins 管道失败?
【发布时间】:2020-05-30 16:23:49
【问题描述】:

我正在使用 Jenkins 声明式管道来实现与我的代码的持续集成。代码是一个使用 PHPUnit 进行单元测试的 PHP 项目。

目前,管道

  1. 构建项目
  2. 运行代码嗅探器以查找编码违规
  3. 运行 PHPUnit 测试,生成覆盖率报告并发布

如果任何 PHPUnit 测试失败,Jenkins 作业就会失败(这很好)。

现在,如果代码覆盖率低于一定数量,我也想失败。我找不到这样做的方法。

当前的 Jenkinsfile 如下所示:

pipeline {

    agent any

    stages {
        stage ('Build') {
            steps {
                sh '''
                    cd symfony && composer install --prefer-dist
                    ./vendor/bin/pcov clobber
                '''
            }
        }

        stage('PHP CodeSniffer') {
            steps {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                    sh './symfony/vendor/bin/phpcs-meq.sh ./symfony/src/AppBundle'
                }
            }
        }

        stage('PHPUnit Tests') {
            steps {
                catchError(buildResult: 'FAILURE', stageResult: 'FAILURE') {
                    sh '''
                        cd symfony
                        cp phpunit.xml.dist phpunit.xml
                        ./bin/console cache:warmup --env=test
                        ./vendor/bin/phpunit\
                            --coverage-clover '../reports/coverage/coverage.xml'\
                            --coverage-html '../reports/coverage'\
                            --log-junit '../reports/unitreport.xml'
                    '''
                }

                junit 'reports/unitreport.xml'

                publishHTML([
                    allowMissing: true,
                    alwaysLinkToLastBuild: false,
                    keepAll: true,
                    reportDir: 'reports/coverage',
                    reportFiles: 'index.html',
                    reportName: 'PHPUnit Test Coverage Report'
                ])
            }
        }
    }
}

我找到了这个发布三叶草报告的 sn-p。我认为如果覆盖率没有达到要求,也许使“failingTarget”足够高会退出 1(使管道失败)。它没有 - 它输出警告,但该步骤仍然成功。

            step([
                $class:'CloverPublisher',
                cloverReportDir: '../reports/coverage',
                cloverReportFileName: 'coverage.xml',
                healthyTarget: [methodCoverage: 90, conditionalCoverage: 90, statementCoverage: 90],
                unhealthyTarget: [methodCoverage: 89, conditionalCoverage: 89, statementCoverage: 89],
                failingTarget: [methodCoverage: 88, conditionalCoverage: 88, statementCoverage: 88]
            ])

如果我的 PHP 代码覆盖率低于某个阈值,我如何让 Jenkins 流水线失败?

【问题讨论】:

    标签: jenkins continuous-integration phpunit jenkins-pipeline


    【解决方案1】:

    xml 是唯一可用于输出覆盖率报告的文件格式吗?

    我会专注于读取文件,然后评估必要的元素以确定是否要抛出错误。

    对于 XML,这将涉及导入 groovy.util.XmlSlurper、读取文件、解析文件,然后导航结构。

    JSON 会更简单,可以使用 readJSON jenkins 基本步骤,然后访问地图。

    【讨论】:

    • 谢谢你的建议,我做了类似的事情。在我的 repo 中,我包含了一个 python 脚本,它解析 XML 覆盖率报告并根据它是否达到目标覆盖率百分比以 0 或 1 退出。 Jenkins 在一个阶段运行脚本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 2020-07-21
    • 2012-05-04
    • 2018-04-14
    • 1970-01-01
    • 2012-08-04
    • 2015-02-09
    相关资源
    最近更新 更多