2017-02-24 51 views
6

Absolute Jenkins rurociąg/Groovy noobem tutaj, mam scenęJenkins rurociąg bańka się kodem wyjścia powłoki na niepowodzenie scenę

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

który korzysta z udostępnionego lib, źródłem Build.groovy jest tutaj:

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 
    } 
} 

Problem polega na tym, że jeśli nie uda się przesłać kompilacji do zdalnego repo (patrz poniżej), etap nadal kończy się pomyślnie.

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 

Jak wypisać kod zakończenia skryptu powłoki i zakończyć etap?

Odpowiedz

0

Właśnie natknęliśmy się na to pytanie jeszcze raz okazało się, że jest to problem wersji Pythona, nie pamiętam dokładnej wersji Pythona, ale to był problem w setuptools, IIRC modernizacja Python do 2.7.1x naprawił.

15

Krok sh zwraca ten sam kod stanu, który zwraca twoje rzeczywiste polecenie sh (w tym przypadku skrypt). Od sh documentation:

Zwykle skrypt kończący się z niezerowym kodem statusu spowoduje niepowodzenie kroku z wyjątkiem.

Musisz się upewnić, że skrypt zwróci niezerowy kod stanu, gdy zawiedzie. Jeśli nie masz pewności, co zwraca skrypt, możesz sprawdzić wartość zwracaną za pomocą parametru returnStatus kroku sh, który nie zawiedzie kompilacji, ale zwróci kod stanu. Np .:

def statusCode = sh script:script, returnStatus:true 

Możesz użyć tego kodu statusu, aby ustawić wynik aktualnej wersji.

Można użyć:

  • currentBuild.result = 'FAILURE' lub currentBuild.result = 'UNSTABLE' oznaczyć krok jako czerwony/żółty odpowiednio. W takim przypadku kompilacja nadal będzie przetwarzać kolejne kroki.
  • error "Your error message" jeśli chcesz, aby kompilacja zakończyła się niepowodzeniem i natychmiast zakończy.
+0

dziękuję, więc gdy już posiadam statusCode, czy muszę go zwrócić w funkcji 'deploy'? –

+0

Dodałem przykłady tego, jak można oznaczyć kompilację jako nieudaną. – Pom12

+0

Fajne dzięki, mam inny problem teraz możesz proszę spojrzeć? http://stackoverflow.com/questions/42475073/jenkins-pipeline-sh-step-not-returning-different-status-code –