我有一个jenkins阶段,它将根据pycodestyle标准检查repo中的所有.py文件。
为此,我使用.bat文件来执行此命令。但是,如果批处理文件的退出代码不为0,jenkins管道也将停止。有没有办法,不管批处理文件的退出代码是什么,我都可以继续执行jenkins管道?
现在我的舞台是这样的。
pycodestyle: {
powershell"""
.\venv\Scripts\Activate.ps1
${WORKSPACE}\code_analyzer\check_pycodestyle.bat 2>&1 | tee pycodestyle.log
"""
批处理文件的输出如下所示。
[2023-04-03T09:20:23.748Z]
[2023-04-03T09:20:23.748Z] _PR-27>pycodestyle --exclude venv,mfile,resource_rc.py --config=_PR-27code_analyzer\pep8.config _PR-27code_analyzer\..
[2023-04-03T09:20:23.748Z] _PR-27code_analyzer\..releasewhl_release.py:47:1: E402 module level import not at top of file
[2023-04-03T09:20:24.009Z] _PR-27code_analyzer\..testssystemtest_utils_build_and_install.py:31:1: E402 module level import not at top of file
[2023-04-03T09:20:24.269Z] _PR-27code_analyzer\..utilshelper.py:45:1: W391 blank line at end of file
script returned exit code 1
即使在退出代码为1之后,我也希望继续执行jenkins管道。
您可以将其放入catchError步骤或使用基本的try-catch块(如果使用脚本语法)。
有关此文档url的更多信息。
这个问题可以在PowerShell端更简单地解决,但是,只需添加exit 0
作为最后一条语句:
powershell"""
.\venv\Scripts\Activate.ps1
${WORKSPACE}\code_analyzer\check_pycodestyle.bat 2>&1 | tee pycodestyle.log
exit 0
"""
即:
您正在使用隐含的
-Command
参数调用Windows PowerShell CLIpowershell.exe
,该参数接受一个或多个要执行的PowerShell语句,并确定要向其调用方报告的退出代码,如下所示:除非使用
exit
语句显式控制进程退出代码,否则是执行的最后一个语句的success状态,根据自动$?
变量的值隐式地确定退出代码如果
$?
是$true
,表示语句结果成功,则进程退出代码变为0
;否则为1
[1]- 请注意,即使最后一条语句是报告不同非零退出代码的外部程序调用,它也是
1
,如自动$LASTEXITCODE
变量中所反映的
- 请注意,即使最后一条语句是报告不同非零退出代码的外部程序调用,它也是
因此:
- 如果您希望报告
$LASTEXITCODE
的值,以中继最近执行的外部程序报告的特定退出代码,请使用exit $LASTEXITCODE
- 相反,与您的情况一样,如果您希望无条件地通过将
0
设置为退出代码来向调用者发出成功信号,请使用exit 0
- 如果您希望报告
请注意,如果要使用
-File
CLI参数而不是-Command
-来调用脚本文件(*.ps1
),则退出代码逻辑将更改:- 只有显式指定退出代码的
exit
调用才被接受 - 否则:
- 无论脚本执行过程中是否发生错误,都会报告退出代码
0
- 除非发生致命(脚本终止)错误,在这种情况下会报告
1
。- 当脚本调用从根本上失败时(例如,由于语法错误或阻止脚本执行的有效执行策略),或者当脚本通过
throw
语句或-ErrorAction Stop
公共参数或$ErrorActionPrefererence = 'Stop'
首选变量显式触发脚本时,就会发生致命错误
- 当脚本调用从根本上失败时(例如,由于语法错误或阻止脚本执行的有效执行策略),或者当脚本通过
- 无论脚本执行过程中是否发生错误,都会报告退出代码
- 只有显式指定退出代码的
有关背景信息,请参阅此答案。
[1]如果一个语句是对外部程序的调用,或者包含一个作为管道一部分的程序,并且管道中没有其他命令发出错误信号,则其进程退出代码(如$LASTEXITCODE
所示)确定$?
的值:0
将$?
设置为$true
,任何非零值都将其设置为$false
在Windows PowerShell中(但不再在PowerShell(Core)7+),即使退出代码为0
,$false
也可能(不适当地)产生,即如果存在2>&1
重定向并且存在实际的stderr输出