如何获取命令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!'
}
我关注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!'
}