Je définis un pipeline en utilisant Jenkins Blue Ocean.
J'essaie de faire une simple convention de codage python pep8, mais si je vais à l'intérieur du shell et que je tape la commande directement, cela fonctionne bien.
Mais lorsque la même commande est exécutée dans le pipeline, elle est exécutée, mais à la fin, «le script a renvoyé le code de sortie 1» est affiché. En raison de ce code d'erreur, il ne passe pas à l'étape suivante.
Y at-il un travail autour?
using credential github > git rev-parse --is-inside-work-tree # timeout=10 Fetching changes from the remote Git repository > git config remote.origin.url https://github.com/YunTaeIl/jenkins_retest.git # timeout=10 Cleaning workspace > git rev-parse --verify HEAD # timeout=10 Resetting working tree > git reset --hard # timeout=10 > git clean -fdx # timeout=10 Fetching without tags Fetching upstream changes from https://github.com/YunTaeIl/jenkins_retest.git > git --version # timeout=10 using GIT_ASKPASS to set credentials GitHub Access Token > git fetch --no-tags --progress -- https://github.com/YunTaeIl/jenkins_retest.git +refs/heads/master:refs/remotes/origin/master # timeout=10 Checking out Revision fe49ddf379732305a7a50f014ab4b25f9382c913 (master) > git config core.sparsecheckout # timeout=10 > git checkout -f fe49ddf379732305a7a50f014ab4b25f9382c913 # timeout=10 > git branch -a -v --no-abbrev # timeout=10 > git branch -D master # timeout=10 > git checkout -b master fe49ddf379732305a7a50f014ab4b25f9382c913 # timeout=10 Commit message: "Added Jenkinsfile" > git rev-list --no-walk bc12a035337857b29a4399f05d1d4442a2f0d04f # timeout=10 Cleaning workspace > git rev-parse --verify HEAD # timeout=10 Resetting working tree > git reset --hard # timeout=10 > git clean -fdx # timeout=10 + ls Jenkinsfile README.md jenkins-retest + python3.7 --version Python 3.7.3 + python3.7 -m flake8 jenkins-retest jenkins-retest/N801_py3.py:3:1: E302 expected 2 blank lines, found 0 jenkins-retest/N801_py3.py:6:1: E302 expected 2 blank lines, found 0 jenkins-retest/N801_py3.py:9:1: E302 expected 2 blank lines, found 0 jenkins-retest/N801_py3.py:12:1: E302 expected 2 blank lines, found 0 jenkins-retest/N801_py3.py:15:1: E302 expected 2 blank lines, found 0 jenkins-retest/N801_py3.py:18:1: E302 expected 2 blank lines, found 0 jenkins-retest/N801_py3.py:24:1: E303 too many blank lines (4) jenkins-retest/N801_py3.py:24:11: E999 SyntaxError: invalid syntax jenkins-retest/python_testfile.py:1:1: E999 SyntaxError: invalid syntax jenkins-retest/python_testfile.py:1:2: E228 missing whitespace around modulo operator jenkins-retest/python_testfile.py:3:1: E402 module level import not at top of file jenkins-retest/python_testfile.py:3:20: W291 trailing whitespace jenkins-retest/python_testfile.py:5:1: E302 expected 2 blank lines, found 1 jenkins-retest/python_testfile.py:8:1: E305 expected 2 blank lines after class or function definition, found 0 jenkins-retest/python_testfile.py:11:33: W291 trailing whitespace jenkins-retest/python_testfile.py:12:1: E402 module level import not at top of file jenkins-retest/python_testfile.py:12:19: W291 trailing whitespace jenkins-retest/python_testfile.py:14:4: E714 test for object identity should be 'is not' jenkins-retest/python_testfile.py:17:16: W291 trailing whitespace jenkins-retest/python_testfile.py:18:80: E501 line too long (95 > 79 characters) script returned exit code 1
3 Réponses :
une chance? @ 윤태일 éprouver quelque chose de similaire où il échoue uniquement dans le cadre du pipeline mais toujours réussi lorsqu'il est manuel.
J'ai eu le même problème avec un script bat appelant un exécutable dont le statut de retour était 1 en cas de succès et 0 en cas d'erreur.
C'était un problème pour Jenkins comme pour Jenkins, le code d'erreur de réussite est 0 et tout autre code d'état signifie un échec, donc arrête le travail avec le message suivant: le script returned exit code 1
Ma solution de contournement: vérifiez le dernier code d'erreur et inversez la valeur de retour du script:
IF %ERRORLEVEL% EQU 1 (exit /B 0) ELSE (exit /B 1) // if previous command returned 1 (meaning success for this command), // then we exit with return code 0 (meaning success for Jenkins), // otherwise we exit with return code 1 (meaning failure for Jenkins)
Explication:
stages { stage("My stage") { steps { bat label: 'My batch script', script: ''' @echo off return_1_if_success.exe // command which returns 1 in case of success, 0 otherwise IF %ERRORLEVEL% EQU 1 (exit /B 0) ELSE (exit /B 1)''' } } }
Sous Windows cmd, %ERRORLEVEL%
contient ce dernier code d'erreur rencontré dans un terminal cmd.exe ou à un moment donné dans un script batch.
Pour PowerShell, vous voudrez peut-être vérifier $?
au lieu de ERRORLEVEL
, je vous laisse vérifier l'équivalent de ceci pour d'autres shell et plateforme.
Les scripts par lots ne peuvent être exécutés que sur les nœuds Windows
@Zam l'équivalent ou ERRORLEVEL sous Linux est $?, Donc il peut être facilement transposé
Je suis surpris que plus de gens recherchent ce problème que je ne le pense.
Utilisez set +e
si vous avez l'intention d'ignorer le code d'erreur exit 1 du code exécuté en tant que script shell.
Pourquoi voulez-vous continuer le pipeline après avoir trouvé des problèmes? Votre outil indique un problème avec le code de retour et Jenkins abandonne le pipeline (à cause de la valeur de retour 1). Je pense que votre pipeline fonctionne correctement.
omg ... C'était mon illusion. Même s'il y avait une erreur, je pensais que le pipeline spécifié serait exécuté et que seule la partie avec l'erreur serait affichée. Je suis vraiment désolé... :(
Oui mais quand il y a "script retourné code de sortie 1", le résultat est un échec. Comment le convertir en succès?