2017-02-24 64 views
6

绝对詹金斯管道/常规小白这里,我有个阶段詹金斯管道冒泡壳退出代码失败阶段

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脚本的退出代码并使舞台失败?

回答

0

刚刚偶然发现了这个问题,原来是Python版本问题,我记不起Python的确切版本,但它是setuptools中的一个问题,IIRC将Python升级到2.7.1x修复了它。

15

步骤sh将返回与您的实际sh命令(本例中的脚本)返回的状态码相同的状态码。从sh documentation

通常情况下,以非零状态码退出的脚本将导致该步骤失败并产生异常。

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

def statusCode = sh script:script, returnStatus:true 

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

您可以使用:

  • currentBuild.result = 'FAILURE'currentBuild.result = 'UNSTABLE'分别标记为步红色/黄色。在这种情况下,构建仍然会处理下一步。
  • error "Your error message"如果你想构建失败并立即退出。
+0

谢谢,所以一旦我有statusCode,我需要在'deploy'函数中返回它吗? –

+0

我已经添加了如何将构建标记为失败的示例。 – Pom12

+0

酷感谢,我现在有一个不同的问题,现在你可以请看看? http://stackoverflow.com/questions/42475073/jenkins-pipeline-sh-step-not-returning-different-status-code –