2017-02-24 81 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 –