我在管道中有以下代码
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上复制相同的问题。
答案 0 :(得分:2)
这不是Jenkins管道问题,而是bash问题。您可以阅读本文以了解how bash scripts exit codes work。
在Linux中,从命令行运行的任何脚本都有退出代码。同 Bash脚本,如果脚本本身未指定退出代码 使用的退出代码将是最后一个命令运行的退出代码。
基本上,您的内部Python脚本返回非零代码,但echo命令(执行的最后一个命令)成功,使您的脚本返回0 /成功代码。
您可以删除echo
或在需要时添加exit 1
。
答案 1 :(得分:0)
要返回状态代码,您需要像这样调用sh
:sh returnStatus: true, script: 'echo "test"'
关于您的输出,看起来您在此处有不同的结果,您确定应该获得相同的退出代码吗? echo
仅在第二种情况下被调用。