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

问题描述 投票:0回答:2

我有一个 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 管道。

powershell batch-file jenkins-pipeline pycodestyle
2个回答
1
投票

您可以将其放在 catchError 步骤中或使用基本的 try-catch 块(如果使用脚本语法)。

有关此文档 url 的更多信息。


0
投票

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]

    • 因此:

      • 如果你想报告
        $LASTEXITCODE
        的值,中继最近执行的外部程序报告的特定退出代码
        ,使用
        exit $LASTEXITCODE
      • 相反-如您的情况-如果您希望通过将0设置为退出代码来无条件地
        向调用者发送成功
        信号,请使用
        exit 0
  • 请注意,如果您要使用

    -File
    CLI 参数 而不是
    -Command
    - 以便调用脚本 file (
    *.ps1
    ),退出代码逻辑会更改:

有关背景信息,请参阅这个答案


[1] 如果语句是对 external 程序 的调用或涉及一个作为管道的一部分并且管道中没有其他命令发出错误条件信号,则其进程退出代码(如

$LASTEXITCODE
中所反映的)确定
$?
的值:
0
$?
设置为
$true
,任何非零值将其设置为
$false
.
Windows PowerShell 中(但不再在 PowerShell (Core) 7+ 中),即使退出代码为
$false
0
也可以(不恰当地)产生结果,即如果存在
2>&1
重定向and 有实际的 stderr 输出。

© www.soinside.com 2019 - 2024. All rights reserved.