在 Jenkins 的一个阶段多次执行 newman
Multiple execution of newman in a single stage on Jenkins
我有一些用 Postman 制作的集合,想在 Jenkins 环境中的同一阶段使用 Newman 执行它们。
我的 Jennkinsfile 如下所示:
sh 'newman run /xxx/collection1.json'
sh 'newman run /xxx/collection2.json'
sh 'newman run /xxx/collection3.json'
但是,如果第一个集合中的任何一个测试失败,shell 将以 1 退出,因此集合 2 和 3 都不会是 运行。
我尝试在每次 shell 执行结束时添加 || true
,但这会使生成的退出代码始终为 0,因此我无法从我的仪表板中看到错误,即使有些的测试失败。
sh 'newman run /xxx/collection1.json || true'
sh 'newman run /xxx/collection2.json || true'
sh 'newman run /xxx/collection3.json || true'
有没有办法在让所有shell都运行的情况下知道最终的测试结果?
我想到的唯一方法是将测试阶段包装在 sub-stages 中 运行 中的某个 parallel
块中。以下方法应该有效:
pipeline {
agent any
options {
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '5')
}
stages {
stage('First') {
steps {
sh 'echo "This stage is going to run very first"'
}
}
stage('Hello') {
failFast false
parallel {
stage('one') {
steps {
sh 'echo one; exit 1'
}
}
stage('two') {
steps {
sh 'echo two'
}
}
stage('three') {
steps {
sh 'echo three'
}
}
}
}
}
}
阶段“第一”应该 运行 首先,其他 3 个阶段将 运行 并行,阶段“二”和“三”运行 会成功,尽管阶段“一个”失败了。整个构建被标记为失败,但阶段“二”和“三”在仪表板中标记为绿色。
编辑:
如果您对显示单个阶段的失败不感兴趣,您可以将 shell 步骤包装在 try/catch
块中,将结果作为布尔值写入全局变量并在之后检查它们。像这样:
Boolean run1 = true
Boolean run2 = true
Boolean run3 = true
pipeline {
agent any
stages {
stage('Hello') {
steps {
script {
try {
sh "echo one; exit 1"
} catch (any) {
run1 = false
}
try {
sh "echo two"
} catch (any) {
run2 = false
}
try {
sh "echo three"
} catch (any) {
run3 = false
}
if (run1 == false || run2 == false || run3 == false) {
currentBuild.result = 'FAILURE'
}
}
}
}
}
}
但在你的情况下,最优雅的方法是将每个新人 运行 包装在 catchError
块中:
pipeline {
agent any
stages {
stage('First') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "echo one; exit 1"
}
}
}
stage('Second') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "echo two"
}
}
}
stage('Third') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "echo three"
}
}
}
}
}
我有一些用 Postman 制作的集合,想在 Jenkins 环境中的同一阶段使用 Newman 执行它们。
我的 Jennkinsfile 如下所示:
sh 'newman run /xxx/collection1.json'
sh 'newman run /xxx/collection2.json'
sh 'newman run /xxx/collection3.json'
但是,如果第一个集合中的任何一个测试失败,shell 将以 1 退出,因此集合 2 和 3 都不会是 运行。
我尝试在每次 shell 执行结束时添加 || true
,但这会使生成的退出代码始终为 0,因此我无法从我的仪表板中看到错误,即使有些的测试失败。
sh 'newman run /xxx/collection1.json || true'
sh 'newman run /xxx/collection2.json || true'
sh 'newman run /xxx/collection3.json || true'
有没有办法在让所有shell都运行的情况下知道最终的测试结果?
我想到的唯一方法是将测试阶段包装在 sub-stages 中 运行 中的某个 parallel
块中。以下方法应该有效:
pipeline {
agent any
options {
buildDiscarder logRotator(artifactDaysToKeepStr: '', artifactNumToKeepStr: '', daysToKeepStr: '', numToKeepStr: '5')
}
stages {
stage('First') {
steps {
sh 'echo "This stage is going to run very first"'
}
}
stage('Hello') {
failFast false
parallel {
stage('one') {
steps {
sh 'echo one; exit 1'
}
}
stage('two') {
steps {
sh 'echo two'
}
}
stage('three') {
steps {
sh 'echo three'
}
}
}
}
}
}
阶段“第一”应该 运行 首先,其他 3 个阶段将 运行 并行,阶段“二”和“三”运行 会成功,尽管阶段“一个”失败了。整个构建被标记为失败,但阶段“二”和“三”在仪表板中标记为绿色。
编辑:
如果您对显示单个阶段的失败不感兴趣,您可以将 shell 步骤包装在 try/catch
块中,将结果作为布尔值写入全局变量并在之后检查它们。像这样:
Boolean run1 = true
Boolean run2 = true
Boolean run3 = true
pipeline {
agent any
stages {
stage('Hello') {
steps {
script {
try {
sh "echo one; exit 1"
} catch (any) {
run1 = false
}
try {
sh "echo two"
} catch (any) {
run2 = false
}
try {
sh "echo three"
} catch (any) {
run3 = false
}
if (run1 == false || run2 == false || run3 == false) {
currentBuild.result = 'FAILURE'
}
}
}
}
}
}
但在你的情况下,最优雅的方法是将每个新人 运行 包装在 catchError
块中:
pipeline {
agent any
stages {
stage('First') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "echo one; exit 1"
}
}
}
stage('Second') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "echo two"
}
}
}
stage('Third') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "echo three"
}
}
}
}
}