Github Actions如何将Curl响应的JSON对象导出为ENV环境变量
报错原因
- 原始写法直接将多行JSON内容通过
echo "变量名=内容"的格式写入$GITHUB_ENV时,Github Actions会按换行符逐行解析环境变量定义,JSON中带缩进、引号的独立行会被识别为非法的变量格式,触发解析失败。 - 原计划的读取写法存在语法问题:
${{ env.GIT_COMMIT_OBJECT }}是工作流预替换表达式,运行步骤前会直接把多行JSON文本插入shell命令位置,会直接破坏shell语法,无法正常通过管道传给jq处理。
正确实现方法
1. 单次调用API存储完整JSON到环境变量
使用Github Actions支持的多行环境变量定界符语法写入,避免内容被逐行拆分:
- name: 拉取PR信息 run: | # 单次请求拿到API返回,加-s关闭进度输出,加-f在请求失败时直接报错 PR_DATA=$(curl -f -s -u USER:TOKEN \ -H "Accept: application/vnd.github+json" \ "https://api.github.com/repos/${{ github.repository }}/pulls/${{ github.event.number }}") # 写入多行环境变量,标记定界符开始 echo "GIT_PR_OBJECT<<_JSON_END_" >> $GITHUB_ENV # 写入完整JSON内容 echo "$PR_DATA" >> $GITHUB_ENV # 写入定界符结束标记,必须单独占一行 echo "_JSON_END_" >> $GITHUB_ENV
注意点:
- 定界符
_JSON_END_可以替换为任意不会在JSON内容中单独成行的字符串,只要首尾保持一致即可 - 写入JSON内容时变量必须加双引号,避免shell吞掉换行、空格破坏JSON结构
- 注意变量名前后保持统一,不要混用
GIT_PR_OBJECT和GIT_COMMIT_OBJECT导致读取空值
2. 后续步骤读取JSON字段的正确写法
不要用工作流表达式直接替换变量值,直接通过shell环境变量取值传给jq:
- name: 提取提交者邮箱 run: | echo "GIT_EMAIL=$(echo "$GIT_PR_OBJECT" | jq -r '.commit.author.email')" >> $GITHUB_ENV
其他字段的提取逻辑完全一致,只要修改jq的取值路径即可,全程不需要重复发起API请求。
内容的提问来源于stack exchange,提问作者yung peso
相关产品推荐
相关产品推荐

