如何获取命令maven的输出

How to get the output of the command maven

我关注Jenkinsfile :

node {
  stage('Checkout') {
    checkout scm
  }
  stage('Build') {
    try {
      sh ''' mvn clean -B org.jacoco:jacoco-maven-plugin:prepare-agent install  > commandResult '''
      def result = readFile('commandResult').trim()
    }
    catch (err) {
      step([$class: 'XUnitBuilder', testTimeMargin: '3000', thresholdMode: 1, thresholds: [
        [$class: 'FailedThreshold', failureThreshold: '', unstableThreshold: '1'],
        [$class: 'SkippedThreshold', failureThreshold: '', unstableThreshold: '']
      ], tools: [
        [$class: 'JUnitType', deleteOutputFiles: false, failIfNotNew: false, pattern: '**/target/surefire-reports/TEST-*.xml', skipNoTestFiles: true, stopProcessingIfError: false]
      ]])
    }
    finally {
      echo "{$result}"
    }
  }
}

我正在使用插件 xUnit 在某些测试失败时设置不稳定构建的阈值(在这种情况下,当 1 个或多个测试失败时,构建被标记为不稳定)。如果存在编译错误,我还想解析 Maven shell 命令的输出以将构建标记为 "failed"。如果没有错误并且所有测试都通过,则继续执行 xUnit。我怎样才能做到这一点?

我已经尝试过其他问题中提供的答案,但它对我的情况不起作用。当我在上面尝试这个 Jenkinsfile 时,构建失败并且我没有得到输出值。

我的 Jenkins 版本是 2.107.2

默认情况下,如果传递给 sh 步骤的脚本存在非零退出代码,则管道步骤失败并抛出异常。在这种情况下,您读取文件的代码的下一行不会被执行。

Jenkins 的 sh 步骤支持 returnStatus 选项。如果您将它设置为 true,它将使 sh 步骤 return 退出代码,如果此退出代码不是零,它不会抛出任何异常。但是,在这种情况下,如果退出代码通知您错误,您必须做出反应。考虑以下示例:

stage ('Build') {
  def exitCode = sh(script: 'mvn clean -B org.jacoco:jacoco-maven-plugin:prepare-agent install  > commandResult', returnStatus: true)
  def result = readFile('commandResult').trim()

  if (exitCode != 0) {
    // error happened 
    step([$class: 'XUnitBuilder', testTimeMargin: '3000', thresholdMode: 1, thresholds: [
      [$class: 'FailedThreshold',  failureThreshold: '', unstableThreshold: '1'],
      [$class: 'SkippedThreshold', failureThreshold: '', unstableThreshold: '']
    ],tools: [
      [$class: 'JUnitType', deleteOutputFiles: false, failIfNotNew: false, pattern: '**/target/surefire-reports/TEST-*.xml', skipNoTestFiles: true, stopProcessingIfError: false]
    ]])
  }

  // do something with result
  echo "{$result}"

  // e.g mark build as error
  error 'Maven command failed!'
}

Reference: https://jenkins.io/doc/pipeline/steps/workflow-durable-task-step/#code-sh-code-shell-script

使用 mvn --log-file 代替 >

你也可以试试:

stage ('Build') {
  def exitCode = sh(script: 'mvn --log-file commandResult clean -B org.jacoco:jacoco-maven-plugin:prepare-agent install', returnStatus: true)
  def result = readFile('commandResult').trim()

  if (exitCode != 0) {
    // error happened 
    step([$class: 'XUnitBuilder', testTimeMargin: '3000', thresholdMode: 1, thresholds: [
      [$class: 'FailedThreshold',  failureThreshold: '', unstableThreshold: '1'],
      [$class: 'SkippedThreshold', failureThreshold: '', unstableThreshold: '']
    ],tools: [
      [$class: 'JUnitType', deleteOutputFiles: false, failIfNotNew: false, pattern: '**/target/surefire-reports/TEST-*.xml', skipNoTestFiles: true, stopProcessingIfError: false]
    ]])
  }

  // do something with result
  echo "{$result}"

  // e.g mark build as error
  error 'Maven command failed!'
}