web-dev-qa-db-fra.com

Un pipeline Jenkins gonfle le code de sortie de Shell pour faire échouer l'étape

Pipeline Jenkins absolu/groovy noob ici, j'ai une scène

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

qui utilise la bibliothèque partagée, la source du Build.groovy est ici:

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

Le problème est qu’en cas d’échec de la génération du rapport dans un dépôt distant (voir ci-dessous), l’étape finit toujours par réussir.

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

Comment bouillonner le code de sortie du script shell et faire échouer l'étape?

14
James Lin

L'étape sh renvoie le même code d'état que votre commande sh actuelle (votre script dans ce cas). De sh documentation :

Normalement, un script qui se termine avec un code d'état différent de zéro entraînera l'échec de l'étape avec une exception.

Vous devez vous assurer que votre script renvoie un code d'état différent de zéro en cas d'échec. Si vous n'êtes pas sûr du résultat de votre script, vous pouvez vérifier la valeur de retour à l'aide du paramètre returnStatus de l'étape sh, ce qui n'échouera pas la construction mais renverra le code d'état. Par exemple:

def statusCode = sh script:script, returnStatus:true

Vous pouvez ensuite utiliser ce code de statut pour définir le résultat de votre construction actuelle.

Vous pouvez utiliser :

  • currentBuild.result = 'FAILURE' ou currentBuild.result = 'UNSTABLE' pour marquer le pas comme rouge/jaune respectivement. Dans ce cas, la construction continuera à traiter les étapes suivantes.
  • error "Your error message" si vous voulez que la construction échoue et quitte immédiatement.
28
Pom12

Je suis juste tombé par hasard sur cette question, il s’est avéré qu’il s’agissait d’un problème de version Python; je ne me souviens pas de la version exacte de Python, mais c’était un problème dans setuptools.

0
James Lin