web-dev-qa-db-ger.com

Die Pipeline von Jenkins sprudelt den Shell-Exit-Code auf, um die Stufe zu verlassen

Absolute Jenkins Pipeline/grooviger Noob hier, ich habe eine Etappe

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

die die gemeinsam genutzte Bibliothek verwendet, ist die Quelle des Build.groovy hier:

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

Das Problem ist, wenn der Build nicht zu einem Remote-Repo (siehe unten) verschoben wird. Die Bühne wird trotzdem erfolgreich angezeigt.

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

Wie kann ich den Exit-Code des Shell-Skripts aufblähen und die Phase fehlschlagen?

14
James Lin

Der Schritt sh gibt denselben Statuscode zurück, den Ihr tatsächlicher sh-Befehl (in diesem Fall Ihr Skript) zurückgibt. Aus sh Dokumentation :

Normalerweise führt ein Skript, das mit einem Statuscode ungleich Null beendet wird, dazu, dass der Schritt mit einer Ausnahme fehlschlägt.

Sie müssen sicherstellen, dass Ihr Skript bei einem Fehler einen Statuscode ungleich Null zurückgibt. Wenn Sie nicht sicher sind, was Ihr Skript zurückgibt, können Sie den Rückgabewert mit dem Parameter returnStatus des sh-Schritts überprüfen. Der Build wird nicht fehlschlagen, der Statuscode wird jedoch zurückgegeben. Z.B:

def statusCode = sh script:script, returnStatus:true

Sie können diesen Statuscode dann verwenden, um das Ergebnis Ihres aktuellen Builds festzulegen.

Sie können verwenden:

  • currentBuild.result = 'FAILURE' oder currentBuild.result = 'UNSTABLE', um den Schritt als rot/gelb zu kennzeichnen. In diesem Fall verarbeitet der Build die nächsten Schritte.
  • error "Your error message", wenn der Build fehlschlagen soll und sofort beendet wird.
28
Pom12

Ich bin gerade wieder auf diese Frage gestoßen, es stellte sich heraus, dass es sich um ein Problem mit der Python-Version handelt. Ich kann mich nicht an die genaue Version von Python erinnern, aber es war ein Problem innerhalb von setuptools. Das Upgrade von Python durch IIRC auf 2.7.1x wurde behoben.

0
James Lin