在 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"
        }
      }
    }
  }
}