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

GitHub Actions中如何访问github.event嵌套JSON对象字段

核心原因

你访问失败基本是两个问题:

  • 你贴的JSON结构是自己脑补的,多套了一层不存在的event嵌套,github.event本身就对应webhook下发的完整事件负载,不存在github.event.event路径。
  • 混淆了不同触发事件的payload结构,90%的同类问题都是把pull_request等其他事件的commit结构,和push事件的结构搞混了。你能拿到github.event.commits[0].message,只能说明你当前触发事件下commits[0].message路径存在,不代表你对commits下其他字段的层级认知正确。
正确访问写法

首先确认你的工作流是被push事件触发——只有push事件的github.event根节点下直接挂载commits数组,对应字段访问路径如下:

  • 提交作者姓名:${{ github.event.commits[0].author.name }}
  • 提交作者邮箱:${{ github.event.commits[0].author.email }}
  • 提交作者用户名:${{ github.event.commits[0].author.username }}
  • 提交提交者姓名:${{ github.event.commits[0].committer.name }}
  • 提交提交者邮箱:${{ github.event.commits[0].committer.email }}
  • 提交提交者用户名:${{ github.event.commits[0].committer.username }}

注意:如果是pull_request事件触发,commits相关字段不在event根节点,且结构多一层嵌套,正确路径为${{ github.event.pull_request.head.commit.author.name }},不要直接套push事件的路径。

失效排查方案

如果上述写法仍不生效,按以下步骤排查:

  1. 不要靠脑补写路径,先加调试步骤打印完整的event上下文,看实际返回的结构:
- name: 打印完整event负载
  run: echo '${{ toJSON(github.event) }}'
  1. 检查数组索引是否越界:单次提交的push事件只有commits[0]有值,批量push多个提交时,要对应匹配索引,不要访问不存在的数组项。
  2. 字段值可能为空:网页端创建的提交、机器人提交的username字段经常为null,直接访问会触发表达式错误,建议加默认值兜底:
    # 兜底写法,字段为空时返回unknown
    AUTHOR_NAME: ${{ github.event.commits[0].author.name || 'unknown' }}
    
  3. Shell中取值要加引号:如果在run步骤里直接用表达式赋值,必须给表达式加双引号,避免字段值里的空格、特殊字符导致解析截断:
    # 错误写法,特殊字符会导致取值失败
    - run: AUTHOR_NAME=${{ github.event.commits[0].author.name }}
    
    # 正确写法
    - run: |
        AUTHOR_NAME="${{ github.event.commits[0].author.name }}"
        echo "$AUTHOR_NAME"
    
  4. 需要遍历所有提交时,建议用jq解析JSON结构,避免手写路径出错:
- name: 遍历所有提交信息
  run: |
    COMMITS_JSON='${{ toJSON(github.event.commits) }}'
    COMMIT_COUNT=$(echo "$COMMITS_JSON" | jq length)
    echo "本次推送共 $COMMIT_COUNT 个提交"
    for i in $(seq 0 $((COMMIT_COUNT-1))); do
      COMMIT=$(echo "$COMMITS_JSON" | jq ".[$i]")
      echo "提交信息: $(echo "$COMMIT" | jq -r '.message')"
      echo "作者: $(echo "$COMMIT" | jq -r '.author.name') <$(echo "$COMMIT" | jq -r '.author.email')>"
      echo "提交者: $(echo "$COMMIT" | jq -r '.committer.name') <$(echo "$COMMIT" | jq -r '.committer.email')>"
    done

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 13:42:29