运行Jenkins管道时如何修复'脚本返回的退出代码1'

时间:2020-03-31 05:03:24

标签: jenkins jenkins-pipeline jenkins-blueocean

我正在使用Jenkins Blue Ocean定义管道。

我正在尝试做一个简单的python pep8编码约定,但是如果我进入外壳并直接键入命令,它将运行正常。

但是当在管道中执行相同的命令时,将执行该命令,但最后 显示“脚本返回的退出代码1”。 由于出现此错误代码,因此无法进行下一步。

有解决方法吗?

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 个答案:

答案 0 :(得分:1)

令我惊讶的是,更多的人正在寻找这个问题。

如果要忽略作为Shell脚本运行的代码的错误代码出口1,请使用set +e

答案 1 :(得分:0)

有运气吗? @윤태일 遇到类似的情况,它只是作为管道的一部分而失败,而在手动时总是会成功。

答案 2 :(得分:0)

蝙蝠脚本调用可执行文件时遇到同样的问题,成功时返回状态为1,错误时返回状态为0。

这对詹金斯(Jenkins)来说都是一个问题,对于詹金斯(Jenkins)来说,成功错误代码为0,其他任何状态代码都表示失败,因此通过以下消息停止了作业:script returned exit code 1

我的解决方法:检查最后一个错误代码并反转脚本的返回值:

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

说明:

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)

在Windows cmd上,%ERRORLEVEL%保留在cmd.exe终端或批处理脚本中给定点遇到的最后错误代码。

对于powershell,您可能需要检查$?而不是ERRORLEVEL,让我检查一下其他外壳和平台的等效性。