GitHub Actions提交消息字符转义问题及处理方法咨询
解决GitHub Action中提交消息含双引号导致curl JSON格式错误的问题
方法一:使用GitHub Actions内置的toJSON过滤器(推荐)
GitHub Actions提供toJSON上下文过滤器,能自动将字符串转义为合法的JSON格式,无需手动处理特殊字符。直接在curl命令中使用即可:
curl -H 'Content-Type:application/json' -d '{ "commit": ${{ toJSON(github.event.head_commit.message) }}, ...}'
当提交消息包含双引号(如feat(#7): replace "FAQ" by "Help Center")时,toJSON会自动将双引号转义为\",生成的JSON结构完全合法,不会触发语法错误。
方法二:通过Shell变量中转后写入环境变量
如果需要将转义后的提交消息存入环境变量,避免GitHub直接替换上下文变量时破坏脚本结构,可先将上下文变量赋值给Shell变量,再进行转义处理:
- run: | # 先将上下文变量赋值给Shell变量,用双引号包裹避免特殊字符导致语法错误 COMMIT_MSG="${{ github.event.head_commit.message }}" # 转义双引号 ESCAPED_MSG=$(printf '%s' "$COMMIT_MSG" | sed 's/"/\\"/g') # 写入环境变量 echo "GITHUB_COMMIT=$ESCAPED_MSG" >> $GITHUB_ENV
后续使用环境变量时,直接引用${{ env.GITHUB_COMMIT }}即可,此时的内容已经是转义后的合法字符串。
方法三:用jq构造合法的JSON Payload
对于更复杂的JSON结构,使用jq工具构造Payload是最可靠的方式,它会自动处理所有JSON格式要求:
- run: | curl -H 'Content-Type:application/json' -d "$(jq -n --arg msg "${{ github.event.head_commit.message }}" '{commit: $msg, key1: "value1", key2: "value2"}')" https://your-webhook-url.com
通过jq的--arg参数将提交消息传入,再构造完整的JSON对象,生成的Payload绝对符合JSON规范,无需担心任何特殊字符问题。
内容的提问来源于stack exchange,提问作者OOM
相关产品推荐
相关产品推荐

