You need to enable JavaScript to run this app. GitHub Actions使用pre-commit action时如何获取步骤错误输出用于PR评论
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions使用pre-commit action时如何获取步骤错误输出用于PR评论

pre-commit 报错获取方案

核心思路是不依赖pre-commit/action的内置输出暴露能力,通过重定向运行日志、抓取工作流日志的方式拿到具体检查错误,填充到PR通知内容中,所有调整都可以在工作流YAML层面完成,不需要修改action源码。

方案1:手动执行pre-commit流程,主动捕获全量错误日志

pre-commit/action的核心功能就是帮你配置运行环境、拉取工具缓存、执行pre-commit检查,我们完全可以拆开这些步骤,自己执行检查命令,将标准输出、错误输出重定向为本地文件,后续步骤直接读取文件内容拼接通知:

  • 保留原有拉取代码、变更文件检测的步骤
  • 自行完成pre-commit的安装、缓存配置
  • 执行pre-commit检查时,将所有输出写入本地日志文件,记录命令退出码,不因为检查失败直接中断工作流
  • 检查失败时,直接读取本地日志文件,把全量报错拼入PR评论

对应参考配置:

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取仓库代码
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: 配置Python运行环境
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: 安装pre-commit工具
        run: pip install pre-commit

      - name: 检查PR变更文件
        id: file_changes
        uses: trilom/file-changes-action@v1.2.3
        with:
          output: ' '

      - name: 执行pre-commit检查并保存日志
        id: commit_check
        run: |
          set +e
          pre-commit run --files ${{ steps.file_changes.outputs.files }} > pre_commit_error.log 2>&1
          # 记录命令退出码到环境变量,供后续步骤判断
          echo "pre_commit_exit_code=$?" >> $GITHUB_ENV
        continue-on-error: true

      - name: 缓存pre-commit依赖
        if: always()
        uses: actions/cache@v4
        with:
          path: ~/.cache/pre-commit
          key: pre-commit-${{ hashFiles('.pre-commit-config.yaml') }}

      - name: 发送带具体错误的PR评论
        if: env.pre_commit_exit_code != 0
        uses: actions/github-script@v6
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          script: |
            const fs = require('fs');
            const errorContent = fs.readFileSync('pre_commit_error.log', 'utf8');
            github.issues.createComment({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              body: `pre-commit 检查未通过,具体报错如下:\n\`\`\`\n${errorContent}\n\`\`\``
            });

方案2:保留现有pre-commit action配置,直接抓取工作流运行日志

如果不想改动现有对pre-commit/action的使用逻辑,可以在评论步骤中通过GitHub API拉取当前Job的运行日志,匹配提取出失败的pre-commit检查条目,拼入PR通知:

  • 保持原有pre-commit/action的步骤不变
  • 在评论步骤中,通过GitHub Actions的日志接口拉取当前Job的全量运行日志
  • 过滤日志中标记为Failed的检查错误行,作为通知内容

对应脚本参考:

// 拉取当前Job的全量运行日志
const jobLogs = await github.actions.getJobLogs({
  owner: context.repo.owner,
  repo: context.repo.repo,
  job_id: context.job.run_id
});
// 提取日志中所有pre-commit失败的条目
const failedItems = jobLogs.data.split('\n')
  .filter(line => line.includes('Failed'))
  .join('\n');
github.issues.createComment({
  issue_number: context.issue.number,
  owner: context.repo.owner,
  repo: context.repo.repo,
  body: `pre-commit 检查未通过,失败项如下:\n\`\`\`\n${failedItems}\n\`\`\``
});

注意事项

  • 第一种方案稳定性更高,不依赖第三方action的内部实现细节,即使后续pre-commit action的版本迭代调整,捕获日志的逻辑也不会失效
  • 第二种方案不需要大幅调整现有工作流配置,但是依赖日志的固定格式,如果后续pre-commit调整输出的日志关键词,需要同步更新日志过滤规则
  • 所有拼入PR评论的日志内容建议放在代码块中,避免Markdown格式错乱导致评论显示异常

内容的提问来源于stack exchange,提问作者João Pacheco

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 11:06:03