我有一个 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-27\code_analyzer\\pep8.config _PR-27\code_analyzer\\..
[2023-04-03T09:20:23.748Z] _PR-27\code_analyzer\\..\release\whl_release.py:47:1: E402 module level import not at top of file
[2023-04-03T09:20:24.009Z] _PR-27\code_analyzer\\..\tests\system\test_utils_build_and_install.py:31:1: E402 module level import not at top of file
[2023-04-03T09:20:24.269Z] _PR-27\code_analyzer\\..\utils\helper.py:45:1: W391 blank line at end of file
script returned exit code 1
我想在退出代码为 1 后继续执行 jenkins 管道。
您可以将其放在 catchError 步骤中或使用基本的 try-catch 块(如果使用脚本语法)。
有关此文档 url 的更多信息。
KiiroiSenko 的有用答案 指向一个 Jenkins 解决方案。
在PowerShell方面可以更简单地解决问题,但是-只需添加
exit 0
作为最后一个语句:
powershell"""
.\\venv\\Scripts\\Activate.ps1
${WORKSPACE}\\code_analyzer\\check_pycodestyle.bat 2>&1 | tee pycodestyle.log
exit 0
"""
即:
powershell.exe
,Windows PowerShell CLI,带有 隐含 -Command
参数,它接受一个或多个要执行的 PowerShell 语句,并确定要向其调用者报告的退出代码,如下所示:
除非您使用
exit
语句来控制进程退出代码explicitly,它是last语句执行的success statusimplicitly确定退出代码,基于的值自动$?
变量:
如果
$?
为$true
,说明语句结果成功,流程退出码变为0
;否则,它是1
.[1]
different非零退出代码的外部程序调用,它也是
1
,如 automatic $LASTEXITCODE
变量因此:
$LASTEXITCODE
的值,中继最近执行的外部程序报告的特定退出代码,使用exit $LASTEXITCODE
0
设置为退出代码来无条件地向调用者发送成功信号,请使用
exit 0
请注意,如果您要使用
-File
CLI 参数 而不是 -Command
- 以便调用脚本 file (*.ps1
),退出代码逻辑会更改:
exit
calls specifying an exit code is honored.0
。1
。
throw
语句或通过 显式触发时,会发生致命错误-ErrorAction Stop
公共参数或 $ErrorActionPrefererence = 'Stop'
偏好变量。有关背景信息,请参阅这个答案。
[1] 如果语句是对 external 程序 的调用或涉及一个作为管道的一部分并且管道中没有其他命令发出错误条件信号,则其进程退出代码(如
$LASTEXITCODE
中所反映的)确定$?
的值:0
将 $?
设置为 $true
,任何非零值将其设置为 $false
.$false
,0
也可以(不恰当地)产生结果,即如果存在 2>&1
重定向and 有实际的 stderr 输出。