如何在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
相关产品推荐
相关产品推荐

