当前位置: 首页 > 知识库问答 >
问题:

如何根据脚本退出代码将Jenkins管道阶段设置为不稳定?

邬良才
2023-03-14

我的Jenkins管道中的一个阶段应根据其步骤中脚本的退出代码设置为不稳定:2应将阶段状态设置为不稳定性,而1应将阶段结果设置为失败。

如何做到这一点?我检查了“catchError”,但它似乎没有区分失败状态,只提供了一种捕获非0退出(1,2...)的方法。

pipeline {
    agent any

    parameters {
         string(name: 'FOO', defaultValue: 'foo', description: 'My foo param')
         string(name: 'BAR', defaultValue: 'bar', description: 'My bar param')
    }

    stages {
        stage('First') {
            steps {
                    // If "script.py" exit code is 2, set stage to unstable
                    // If "script.py" exit code is 1, set stage to failed 
                    
                       sh """
                          . ${WORKSPACE}/venv/bin/activate
                          python ${WORKSPACE}/script.py --foo ${FOO} --bar ${BAR}
                          deactivate
                       """
                }
            }
        }
        stage('Second') {
            steps {
                echo('Second step')
            }
        }
    }
}

共有1个答案

燕刚毅
2023-03-14

您需要执行以下步骤:

  1. 将所有代码放入脚本块中
  2. 修改 sh 以返回状态代码
  3. 使用条件检查状态代码
  4. 投掷并捕获错误与捕获错误。将生成设置为“成功”,将阶段相应地设置为“失败”或“不稳定”

我正在使用错误来强制异常,但你也可以使用sh'exit 1'或抛出新的异常('')

pipeline {
    agent any

    parameters {
         string(name: 'FOO', defaultValue: 'foo', description: 'My foo param')
         string(name: 'BAR', defaultValue: 'bar', description: 'My bar param')
    }

    stages {
        stage('First') {
            steps {
                script {
                    
                    def pythonScript = """
                          . ${WORKSPACE}/venv/bin/activate
                          python ${WORKSPACE}/script.py --foo ${FOO} --bar ${BAR}
                          deactivate
                          """
                    
                    def statusCode = sh( script:pythonScript, returnStatus:true )
                    
                    
                    if(statusCode == 2) {
                        catchError(buildResult: 'SUCCESS', stageResult: 'UNSTABLE') {
                            error 'STAGE UNSTABLE'
                        }
                    } else if(statusCode == 1) {
                        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
                            error 'STAGE FAILURE'
                        }
                    }
                            
                }
            }
        }
    }
}
    
 类似资料:
  • 我有一个带有、、等的声明性Jenkins管道。如果设置生成不稳定/失败,我想停止运行。 我知道,当构建未成功时,我可以使用停止运行中的步骤,但无法找到一种方法,在不运行以下阶段的情况下退出管道 以下是我所拥有的: 如果阶段3将执行跳过阶段2 注意:我不能包括阶段2/3/...阶段1中的步骤。应该是那样的。基于构建参数第2/3/4阶段...将在第1阶段之后调用

  • 问题内容: 绝对詹金斯管道/时髦菜鸟在这里,我有一个舞台 使用共享库,其源在这里: 问题是,当无法将构建推送到远程存储库时(请参见下文),阶段仍然最终显示成功。 如何使shell脚本的退出代码冒泡并使阶段失败? 问题答案: 该步骤返回的状态代码与实际的sh命令(在本例中为您的脚本)返回的状态代码相同。从sh文档中: 通常,以非零状态代码退出的脚本将导致该步骤失败并出现异常。 您必须确保脚本失败时返

  • 问题内容: 我们有一个Jenkinsfile,它使用docker插件在给定容器内运行脚本。对于某些图像,此方法工作正常,但对于其他图像,则立即失败,返回-1退出代码。我们已将错误简化为一个简单的错误。这是Jenkinsfile: 这是詹金斯的输出 有趣的是,如果睡眠时间少于1秒,则该时间过去了(但120秒睡眠在许多其他图像上也可以正常工作)。 作为参考,这是一个有效的jessie图像,一个无效的j

  • 我希望能够在Jenkins中包装一个“阶段”,这样我就可以在一个阶段的开始和结束时执行自定义代码,比如: 我想我可以通过使用元类来做到这一点: 但是Groovy脚本本身似乎是一个绑定,它没有元类: 我还在学习Groovy和Jenkins管道是如何工作的,所以也许我只是错过了一些东西。

  • 当我在jenkins中运行多分支管道代码时,我收到以下的以下错误: java.lang.NoSuchMethodError:在步骤中找不到这样的DSL方法“管道”[archive,bat,build,catchError,checkout,deleteDir,dir,echo,emailext,EmailExtrecients,error,fileExists,getContext,git,inp

  • 问题内容: 当前,当maven-job不稳定(黄色)时,我的管道失败(红色)。 在此示例中,作业单元测试的结果不稳定,但在管道中显示为失败。 如何更改Jobs / Pipeline /Jenkins,使(1)管道步骤不稳定而不是失败,以及(2)管道状态不稳定而不是失败。 我尝试添加参数,但没有解决问题。我不确定如何包装成可以捕获和处理结果的逻辑。 使用这种逻辑添加子管道并不能解决问题,因为没有选项