当前位置: 首页 > 面试题库 >

Jenkins管道使shell退出代码冒泡以使阶段失败

盖泽宇
2023-03-14
问题内容

绝对詹金斯管道/时髦菜鸟在这里,我有一个舞台

stage('Building and Deploying'){
    def build = new Build()
    build.deploy()
}

使用共享库,其源在Build.groovy这里:

def deploy(branch='master', repo='xxx'){
    if (env.BRANCH_NAME.trim() == branch) {
        def script = libraryResource 'build/package_indexes/python/build_push.sh'
        // TODO: Test out http://stackoverflow.com/questions/40965725/jenkins-pipeline-cps-global-lib-resource-file-for-shell-script-purpose/40994132#40994132
        env.PYPI_REPO = repo
        sh script
    }else {
        echo "Not pushing to repo because branch is: "+env.BRANCH_NAME.trim()+" and not "+branch
    }
}

问题是,当无法将构建推送到远程存储库时(请参见下文),阶段仍然最终显示成功。

running upload
Submitting dist/xxx-0.0.7.tar.gz to https://xxx.jfrog.io/xxx/api/pypi/grabone-pypi-local
Upload failed (403): Forbidden
...
Finished: SUCCESS

如何使shell脚本的退出代码冒泡并使阶段失败?


问题答案:

sh步骤返回的状态代码与实际的sh命令(在本例中为您的脚本)返回的状态代码相同。从sh文档中:

通常,以非零状态代码退出的脚本将导致该步骤失败并出现异常

您必须确保脚本失败时返回非零状态代码。如果不确定脚本返回的内容,则可以使用步骤的returnStatus参数检查返回值sh,这不会使构建失败,但会返回状态代码。例如:

def statusCode = sh script:script, returnStatus:true

然后,您可以使用此状态代码来设置当前构建的结果。

您可以使用 :

  • currentBuild.result = 'FAILURE'currentBuild.result = 'UNSTABLE'分别将步骤标记为红色/黄色。在这种情况下,构建仍将处理后续步骤。
  • error "Your error message" 如果您希望构建失败并立即退出。


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

  • 我有一系列执行快速检查的阶段。我想完成所有这些,即使有失败。例如: 第二阶段失败,因此默认情况下第三阶段不执行。 通常这将是的工作,但我想在阶段视图中显示它们。在下面的模型中: 构建4显示了通常发生的情况。作业失败,因此不运行

  • 我的Jenkins管道中的一个阶段应根据其步骤中脚本的退出代码设置为不稳定:2应将阶段状态设置为不稳定性,而1应将阶段结果设置为失败。 如何做到这一点?我检查了“catchError”,但它似乎没有区分失败状态,只提供了一种捕获非0退出(1,2...)的方法。

  • 我不确定发生了什么,过去我们在Azure Devops中的管道构建的一切都很好。 但是就在最近,我们的每个构建都在zipariing上失败了... APK zipmays和构建在使用Android Studio IDE时很好,但在Azure Devops管道中失败了。 以下是Azure中zipalign的开始: 这是最后的失败消息: 最后,这是我们管道YAML的上下文: 任何帮助都将不胜感激! 编

  • 我正在编写一个Groovy脚本,其中包含部署terraform的作业。我正在使用作业DSL并使种子作业由JCasC实现,一切正常。然后我有一个包含作业的Groovy文件的存储库。 如果我将Groovy文件保持为单个作业,它就可以正常工作。 然而,我希望能够构建具有构建阶段的管道。我知道我可以把管道写在詹金斯文件中 我有这个作为开始: 但是,我看到了这个错误: 我已经尝试了各种方法,并阅读了一堆文档

  • 我有一个带有、、等的声明性Jenkins管道。如果设置生成不稳定/失败,我想停止运行。 我知道,当构建未成功时,我可以使用停止运行中的步骤,但无法找到一种方法,在不运行以下阶段的情况下退出管道 以下是我所拥有的: 如果阶段3将执行跳过阶段2 注意:我不能包括阶段2/3/...阶段1中的步骤。应该是那样的。基于构建参数第2/3/4阶段...将在第1阶段之后调用