Jenkins管道sh步骤不返回不同的状态代码

时间:2017-02-26 22:36:08

标签: jenkins jenkins-pipeline

我在管道中有以下代码

def deploy(branch='master', repo='xxx'){
    if (env.BRANCH_NAME.trim() == branch) {
        def script = libraryResource 'build/package_indexes/python/build_push.sh'
        env.PYPI_REPO = repo
        sh script
    }else {
        echo "Not pushing to repo because branch is: "+env.BRANCH_NAME.trim()+" and not "+branch
    }
}

脚本看起来像这样:

if [ -f "setup.cfg" ]; then
  # only build a wheel if setup.cfg exists, so we can disable wheel build if need be
  echo "Build package ${PACKAGE_NAME} tar.gz and wheel, and push to jfrog repo: $PYPI_REPO"
  python setup.py sdist upload -r jfrog
  echo "status code: $?"
fi

当我直接在shell中执行脚本时:

sh push.sh

当无法推送到repo时返回状态码1,请参阅输出:

Submitting dist/xxx-xxxx-0.0.7.tar.gz to https://xxx.jfrog.io/xxx/xxx-pypi/
Upload failed (405): Method Not Allowed
error: Upload failed (405): Method Not Allowed
status code: 1

但是当我在Jenkins中执行管道时,如果无法推送到repo,状态代码为0:

Submitting dist/xxx-xxxx-0.0.7.tar.gz to https://xxx.jfrog.io/xxx/xxx-pypi/
Upload failed (403): Forbidden
+ echo status code: 0
status code: 0

如果Jenkins作业失败,如何让它返回状态码?

更新

看起来问题不在Jenkins内部,我可以在Jenkins服务器的shell上复制相同的问题。

2 个答案:

答案 0 :(得分:2)

这不是Jenkins管道问题,而是bash问题。您可以阅读本文以了解how bash scripts exit codes work

  

在Linux中,从命令行运行的任何脚本都有退出代码。同   Bash脚本,如果脚本本身未指定退出代码   使用的退出代码将是最后一个命令运行的退出代码。

基本上,您的内部Python脚本返回非零代码,但echo命令(执行的最后一个命令)成功,使您的脚本返回0 /成功代码。

您可以删除echo或在需要时添加exit 1

答案 1 :(得分:0)

要返回状态代码,您需要像这样调用shsh returnStatus: true, script: 'echo "test"'

关于您的输出,看起来您在此处有不同的结果,您确定应该获得相同的退出代码吗? echo仅在第二种情况下被调用。