【问题标题】:GitHubActions on Windows host (powershell?): exit code of previous lines being ignoredWindows 主机上的 GitHub Actions(powershell?):前几行的退出代码被忽略
【发布时间】:2021-12-05 11:01:36
【问题描述】:

我在 macOS 通道中完成了这一步:

jobs:
  macOS_build:
    runs-on: macOS-latest
    steps:
    - uses: actions/checkout@v1
    - name: Build in DEBUG and RELEASE mode
      run: ./configure.sh && make DEBUG && make RELEASE

然后我这样成功拆分:

jobs:
  macOS_build:
    runs-on: macOS-latest
    steps:
    - name: Build in DEBUG and RELEASE mode
      run: |
        ./configure.sh
        make DEBUG
        make RELEASE

此转换有效,因为如果 make DEBUG 失败,make RELEASE 将不会执行,整个步骤将被 GitHubActions 标记为 FAILED。

但是,尝试从 Windows 通道转换它:

jobs:
  windows_build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v1
    - name: Build in DEBUG and RELEASE mode
      shell: cmd
      run: configure.bat && make.bat DEBUG && make.bat RELEASE

到这里:

jobs:
  windows_build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v1
    - name: Build in DEBUG and RELEASE mode
      shell: cmd
      run: |
        configure.bat
        make.bat DEBUG
        make.bat RELEASE

不起作用,因为奇怪的是,只执行了第一行。所以我尝试将shell属性更改为powershell

jobs:
  windows_build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v1
    - name: Build in DEBUG and RELEASE mode
      shell: powershell
      run: |
        configure.bat
        make.bat DEBUG
        make.bat RELEASE

但是这失败了:

configure.bat : 术语“configure.bat”未被识别为名称 cmdlet、函数、脚本文件或可运行程序的名称。检查 名称的拼写,或者如果包含路径,请验证路径 是正确的,然后再试一次。

然后我看到this other SO answer,所以我把它转换成:

jobs:
  windows_build:
    runs-on: windows-latest
    steps:
    - uses: actions/checkout@v1
    - name: Build in DEBUG and RELEASE mode
      shell: powershell
      run: |
        & .\configure.bat
        & .\make.bat DEBUG
        & .\make.bat RELEASE

这最终独立启动了所有批处理文件,但它似乎忽略了退出代码(因此如果 configure.bat 失败,它仍会运行下一行)。

知道如何正确分隔 GithubActions 工作流程中的行吗?

【问题讨论】:

    标签: windows powershell batch-file github-actions exit-code


    【解决方案1】:

    在 PowerShell 中,如果您想对最近执行的外部程序或脚本的(非零)退出代码执行操作,则必须在每次调用后检查 automatic $LASTEXITCODE variable

    if ($LASTEXITCODE) { exit $LASTEXITCODE }
    

    如果您想保持代码较小,您可以通过 automatic $? variable 检查中间成功与失败,如果最近的命令或表达式成功,则它是一个包含 $true 的布尔值,在这种情况下如果退出代码为0,则推断外部程序:

    .\configure.bat
    if ($?) { .\make.bat DEBUG }
    if ($?) { .\make.bat RELEASE }
    exit $LASTEXITCODE
    

    请注意,如果您要使用 PowerShell (Core) 7+,您可以使用类似 bash 的方法,因为 &&||pipeline-chain operators现在支持 - 只要您以 && 结束每个语句内部行,您就可以将每个调用放在自己的行上:

    # PSv7+
    .\configure.bat && 
    .\make.bat DEBUG && 
    .\make.bat RELEASE
    

    但是,请注意,当通过 -Command 调用 PowerShell CLI 时,任何非零退出代码都会映射到 1,我认为这是在幕后发生的,并且假设调用了外部程序 最后。也就是说,特定非零退出代码丢失。如果感兴趣,请在上面添加 exit $LASTEXITCODE 行。

    【讨论】:

    • 您的 PSv7+ 建议将保留为一,因为最初的动机是拆分线路,而不是只要您放好它就离开它
    • @knocte,如果这是关于可读性,您应该能够将声明分散到多行 - 请查看我的更新,它现在还显示了更简洁的 WinPS 解决方案。
    • 嗯,它是关于可读性但不会失去功能(因此我的退出代码有问题);谢谢,将测试您的解决方案
    猜你喜欢
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    • 2018-02-08
    • 2017-12-23
    • 1970-01-01
    • 2022-07-27
    • 2020-04-01
    • 2022-01-25
    相关资源
    最近更新 更多