Как получить вывод команды maven - PullRequest
0 голосов
/ 11 мая 2018

У меня есть следующие 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, чтобы пометить сборку как «неуспешную» в случае ошибки компиляции. Если ошибки нет и все тесты пройдены, перейдите к xUnit. Как я могу это сделать?

Я попробовал ответы на другие вопросы, но в моем случае это не сработало. Когда я пробую это Jenkinsfile выше, сборка завершается сбоем, и я не получаю выходное значение.

Моя версия Дженкинса 2.107.2

1 Ответ

0 голосов
/ 11 мая 2018

По умолчанию, если сценарий, переданный шагу sh, существует с ненулевым кодом выхода, шаг конвейера завершается ошибкой и генерируется исключение.В этом случае следующая строка кода, где вы читаете файл, не выполняется.

Jenkins 'sh step поддерживает опцию returnStatus.Если вы установите его на true, он сделает sh шаговый код возврата возврата и не будет выдавать никаких исключений, если этот код выхода будет отличным от нуля.Однако в этом случае вы должны отреагировать, если код выхода сообщит вам об ошибке.Рассмотрим следующий пример:

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!'
}

Ссылка: 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!'
}
...