You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在GitHub Actions中同时捕获脚本输出与错误退出码?

解决方法

可以通过在同一个步骤中捕获脚本输出、记录退出码、写入输出变量,最后根据退出码手动触发步骤失败来实现,无需重复运行脚本。具体实现如下:

步骤1:编写GitHub Actions工作流执行逻辑

使用Bash命令组合完成全流程操作,示例代码片段如下:

jobs:
  pr-check:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 运行Python检查脚本
        id: run-check
        shell: bash
        run: |
          # 临时关闭自动退出,避免脚本失败后直接终止后续命令
          set +e
          # 运行脚本,捕获所有输出(含标准错误)到变量
          CHECK_OUTPUT=$(python your_check_script.py 2>&1)
          # 记录脚本的退出码
          EXIT_CODE=$?
          # 恢复自动退出机制
          set -e

          # 将多行输出写入GITHUB_OUTPUT,用EOF作为分隔符保留换行
          echo "check-result<<EOF" >> $GITHUB_OUTPUT
          echo "$CHECK_OUTPUT" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

          # 若退出码不为0,手动触发步骤失败
          if [ $EXIT_CODE -ne 0 ]; then
            echo "::error::检查脚本发现问题,退出码:$EXIT_CODE"
            exit $EXIT_CODE
          fi

      - name: 评论Pull Request
        if: always() # 无论检查步骤是否失败,都执行评论
        uses: actions/github-script@v7
        with:
          script: |
            const checkResult = `${{ steps.run-check.outputs.check-result }}`;
            await github.rest.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `### 检查结果\n\`\`\`\n${checkResult}\n\`\`\``
            });

关键细节说明

  • 输出捕获:用2>&1将标准错误重定向到标准输出,确保脚本的所有输出都被捕获;使用<<EOF作为多行分隔符写入GITHUB_OUTPUT,避免换行内容被截断。
  • 退出码处理:通过set +e临时禁用Bash的自动退出机制,保证脚本返回非0码时,后续记录退出码、写入输出的命令仍能执行;最后根据EXIT_CODE手动调用exit触发步骤失败。
  • 评论逻辑:添加if: always()确保无论检查步骤成功或失败,都能将结果评论到对应的Pull Request中。

内容的提问来源于stack exchange,提问作者user3316291

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 01:07:12