如何在GitHub Actions中引用JSON文件内容赋值给Slack Payload
解决GitHub Workflow中Slack通知Payload的可替换性问题
核心思路
跳过artifact或输出变量传递的中间环节,直接在Workflow步骤中处理JSON文件的变量插值,将处理后的内容直接作为Slack请求的Payload,从根源规避转义格式错误。
具体实现步骤
1. 编写带自定义占位符的JSON模板
在.github/workflows/data.json中使用不与GitHub语法冲突的占位符,示例:
{ "text": "仓库 ${REPO_NAME} 完成构建", "attachments": [ { "title": "触发分支: ${BRANCH_NAME}", "color": "#36a64f" } ] }
2. 在Workflow中完成变量替换并发送通知
在my_workflow.yml中添加步骤,用envsubst替换占位符后,直接读取处理后的文件作为Payload发送:
jobs: slack-alert: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v4 - name: 替换JSON中的变量 run: envsubst < .github/workflows/data.json > processed_payload.json env: REPO_NAME: ${{ github.repository }} BRANCH_NAME: ${{ github.ref_name }} - name: 发送Slack通知 run: | curl -X POST -H "Content-Type: application/json" \ -d @processed_payload.json \ ${{ secrets.SLACK_WEBHOOK_URL }}
3. 复杂JSON场景的替代方案(用jq处理)
如果JSON结构嵌套复杂,推荐用jq进行精准变量替换,避免字符串转义问题:
- name: 用jq替换变量 run: | jq --arg repo "${{ github.repository }}" \ --arg branch "${{ github.ref_name }}" \ '.text = "仓库 \($repo) 完成构建" | .attachments[0].title = "触发分支: \($branch)"' \ .github/workflows/data.json > processed_payload.json
之前方法出错的原因
::set-output/GITHUB_OUTPUT传递JSON时,换行、引号等特殊字符的转义容易遗漏,导致Payload格式不符合Slack API要求,触发400错误。- GitHub不会自动解析JSON文件内的
${{ }}语法,必须手动完成变量插值。
内容的提问来源于stack exchange,提问作者William
相关产品推荐
相关产品推荐

