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

如何在GitHub Action失败时获取并展示类似Actions标签页的日志?

获取GitHub Actions失败任务的详细日志方案

你的工作流目前仅能获取任务的失败状态(success/failure),无法拿到具体日志内容。可以通过以下两种方式获取并展示失败任务的完整日志:

方法一:使用GitHub CLI(gh)获取日志

GitHub Hosted Runner默认预装了gh CLI,只需配置权限即可访问工作流日志。修改后的工作流如下:

name: 你的工作流名称
on: [push, pull_request]

# 配置权限,允许读取Actions日志
permissions:
  actions: read

jobs:
  # 这里是你的sonar和main任务示例
  sonar:
    runs-on: ubuntu-latest
    steps:
      - name: Sonar任务步骤
        run: echo "Sonar执行步骤"
  main:
    runs-on: ubuntu-latest
    steps:
      - name: Main任务步骤
        run: echo "Main执行步骤" && exit 1 # 模拟失败

  run-if-failed:
    runs-on: macos-11
    needs: [ sonar, main ]
    if: always() && (needs.sonar.result == 'failure' || needs.main.result == 'failure')
    steps:
      - name: 获取失败任务日志
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          # 遍历需要检查的任务
          for job_name in sonar main; do
            if [ "${{ needs.$job_name.result }}" == "failure" ]; then
              echo "=== 任务 $job_name 失败日志 ==="
              # 获取该任务的ID
              JOB_ID=$(gh run view ${{ github.run_id }} --json jobs --jq ".jobs[] | select(.name == \"$job_name\") | .id")
              # 输出完整日志
              gh run view --job $JOB_ID --log
            fi
          done

方法二:调用GitHub REST API获取日志

如果不想依赖gh CLI,可以直接通过API请求日志,macos-11 runner默认预装jq和gunzip,可直接使用:

# 同样需要配置permissions: actions: read

run-if-failed:
    runs-on: macos-11
    needs: [ sonar, main ]
    if: always() && (needs.sonar.result == 'failure' || needs.main.result == 'failure')
    steps:
      - name: 通过API获取失败日志
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          RUN_ID: ${{ github.run_id }}
          REPO: ${{ github.repository }}
        run: |
          for job_name in sonar main; do
            if [ "${{ needs.$job_name.result }}" == "failure" ]; then
              echo "=== 任务 $job_name 失败日志 ==="
              # 请求任务列表,筛选目标任务ID
              JOB_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \
                "https://api.github.com/repos/$REPO/actions/runs/$RUN_ID/jobs" | \
                jq -r ".jobs[] | select(.name == \"$job_name\") | .id")
              # 请求日志并解压输出
              curl -s -H "Authorization: token $GITHUB_TOKEN" \
                "https://api.github.com/repos/$REPO/actions/jobs/$JOB_ID/logs" | gunzip
            fi
          done

注意事项

  • 必须在工作流开头配置permissions: actions: read,否则无法访问日志资源。
  • 日志内容会直接输出到run-if-failed任务的工作流日志中,你可以在Actions标签页的该任务下查看完整失败详情,无需通过notice(日志过长会被截断)。
  • 原工作流中if: ${{ failure() }}的条件无效,因为run-if-failed任务本身是成功执行的(仅负责获取日志),所以该步骤永远不会触发,建议移除。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:54:22