Jenkins管道因执行的批处理文件退出代码而失败



我有一个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的更多信息。

KiiroiSenko的有用答案指向了一个Jenkins解决方案。

这个问题可以在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
  • 请注意,如果要使用-FileCLI参数而不是-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输出

相关内容

  • 没有找到相关文章

最新更新