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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 01:47:06