目前我在 Jenkins 中定义了两个阶段,因为它们都需要不同的代理。
这是我的概念验证代码
stages {
stage("Run Tests"){
agent docker
stage("Do setup"){}
stage("Testing") {}
post{
always{
echo "always"
}
failure {
echo "failure"
}
}
}
stage("Generate Reports"){
agent node-label
stage("Generate"){
}
}
}
我需要在不同的代理上“生成报告”,因为某些二进制文件在节点上而不是在 docker 容器内。测试在节点上的 docker 共享卷内运行,因此我获得了在节点上生成报告所需的所有工件
(我尝试在后期运行“生成报告”,但它似乎以某种方式在 docker 容器内运行。)
现在,如果“运行测试”失败,则会由于前一阶段失败而跳过“生成报告”。知道如何强制“生成报告”阶段运行,即使前一阶段失败。
答案 0 :(得分:1)
下面是管道。
pipeline {
agent none
stages {
stage("Run Tests"){
agent { label "agent1" }
stages {
stage("Do setup"){
steps{
sh 'exit 0'
}
}
stage("Testing") {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "exit 1"
} //catchError
} //steps
post{
always{
echo "always"
}
failure {
echo "failure"
}
} // post
} // Testing
} // stages
} // Run Test
stage("Generate Reports"){
agent { label "agent2" }
steps {
sh 'exit 0'
}
} // Reports
}
}
管道成功,但阶段测试显示为失败,您可以根据需要选择buildResult和stageResult的状态它不稳定或失败:
答案 1 :(得分:1)
如果您想始终运行“生成报告”阶段,那么您可以在出现故障时将早期阶段标记为 unstable
。
通过这种方式,Jenkins 将执行所有阶段,并且不会在特定阶段因错误而停止。
示例:
stages {
stage("Run Tests"){
agent docker
stage("Do setup"){}
stage("Testing") {
steps {
script {
// To show an example, Execute "set 1" which will return failure
def result = bat label: 'Check bat......', returnStatus: true, script: "set 1"
if (result !=0) {
// If the result status is not 0 then mark this stage as unstable to continue ahead
// and all later stages will be executed
unstable ('Testing failed')
}
}
}
}
}
}
stage("Generate Reports"){
agent node-label
stage("Generate"){
}
}
}
选项2,如果不想通过返回状态处理,可以使用try and catch block
stage("Testing") {
steps {
script {
try {
// To show an example, Execute "set 1" which will return failure
bat "set 1"
}
catch (e){
unstable('Testing failed!')
}
}
}
}
选项 3:无论阶段失败,您都可以将返回状态更改为完成构建成功。
stage("Testing") {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
script {
// To show an example, Execute "set 1" which will return failure
bat "set 1"
}
}
}
注意:选项 3 有一个缺点,如果有任何错误,它不会在同一阶段执行进一步的步骤。
示例:
在此示例中,将不会执行打印消息“测试阶段”,因为 bat set 1
命令中存在问题
stage("Testing") {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE'){
script {
// To show an example, Execute "set 1" which will return failure
bat "set 1"
// Note : Below step will not be executed since there was failure in prev step
println "Testing stage"
}
}
}
选项 4:您已经尝试将生成报告阶段保持在构建的 Post always
部分,以便始终执行,而不管任何失败。