如何配置Jenkins:当Cypress测试用例失败时触发构建失败?
问题
我在Jenkins的一个阶段中通过Docker容器运行Cypress测试,当前阶段配置代码如下:
stage('Run E2E tests') { steps { withCredentials([ sshUserPrivateKey(credentialsId: '*********', keyFileVariable: 'SSH_KEY_FILE', usernameVariable: 'SSH_USER') ]) { sh """ eval `ssh-agent -s` ssh-add ${SSH_KEY_FILE} ~/earthly \\ --no-cache \\ --config=.earthly/config.yaml \\ +e2e eval `ssh-agent -k` """ } } }
同时通过publishHTML发布测试报告,配置代码如下:
post { always { echo "-- Archive report artifacts" archiveArtifacts artifacts: 'results', allowEmptyArchive: 'true' echo "-- Publish HTLM test result report" publishHTML (target: [ allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: 'results/html/', reportFiles: 'mochawesome-bundle.html', reportName: "Test Result Report" ]) } }
我需要实现当Cypress的Mocha报告中有任意测试用例(TC)失败时,让Jenkins构建失败,请问有什么解决方案?
解决方案
下面几种方案可以实现需求:
方案一:让Earthly的+e2e目标返回非零退出码
Jenkins的sh步骤默认会根据命令的退出码判断是否失败,只要Earthly执行Cypress测试后,在测试失败时返回非零退出码,Jenkins就会自动终止构建并标记失败。
检查你的Earthly +e2e目标配置,确保:
- Cypress测试命令失败时返回非零值(Cypress默认行为就是这样)
- Earthly没有用
RUN --ignore-failure执行测试命令,否则会忽略测试失败的退出码
如果当前Earthly目标已经满足上述条件,那你的现有Jenkins配置不需要额外修改——只要+e2e执行失败,sh步骤就会失败,进而让整个构建失败。
方案二:解析Mocha JSON报告手动判断失败用例
如果Earthly的退出码无法直接反映测试结果(比如有自定义逻辑覆盖了退出码),可以先配置Cypress生成JSON格式的报告,然后在Jenkins中解析报告,统计失败用例数量,手动触发构建失败。
具体步骤:
- 修改Cypress配置(
cypress.config.js),生成JSON报告:
module.exports = defineConfig({ e2e: { reporter: 'mochawesome', reporterOptions: { reportDir: 'results/json', overwrite: false, html: false, json: true } } });
- 在Jenkins的测试阶段添加解析脚本,比如用
jq工具(需要Jenkins节点提前安装):
在现有sh块的末尾添加:
# 解析Mocha JSON报告,统计失败用例数 FAIL_COUNT=$(jq '.stats.failures' results/json/mochawesome.json) if [ "$FAIL_COUNT" -gt 0 ]; then echo "发现$FAIL_COUNT个失败测试用例,构建终止" exit 1 fi
方案三:使用Jenkins Mocha测试结果插件
安装Jenkins的Mocha Test Result Plugin,该插件可以直接解析Mocha的JSON报告,自动根据测试结果标记构建状态。
配置步骤:
- 先按方案二的第一步配置Cypress生成Mocha JSON报告
- 在Jenkins的
post阶段添加插件解析步骤,保留原有的归档和HTML发布逻辑:
post { always { echo "-- Archive report artifacts" archiveArtifacts artifacts: 'results', allowEmptyArchive: 'true' echo "-- Publish HTLM test result report" publishHTML (target: [ allowMissing: false, alwaysLinkToLastBuild: false, keepAll: true, reportDir: 'results/html/', reportFiles: 'mochawesome-bundle.html', reportName: "Test Result Report" ]) // 添加Mocha插件解析步骤 mocha testResultsPattern: 'results/json/mochawesome.json' } }
插件会自动识别报告中的失败用例,一旦有失败就会把构建标记为失败状态。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

