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

如何用slackapi/slack-github-action@v1.18.0将Git日志JSON以Block Kit格式发送至Slack?

问题:通过slack-github-action发送Git日志Block Kit消息失败

现有Git日志JSON格式

{
  "content": [
    {
      "commit": "testing",
      "subject": "testing",
      "author": {
        "name": "testing",
        "email": "testing",
        "date": "testing"
      }
    },
    {
      "commit": "testing",
      "subject": "testing",
      "author": {
        "name": "testing",
        "email": "testing",
        "date": "testing"
      }
    }
  ]
}

我的尝试

获取Git日志的脚本

PENDING_PR=$(git log --pretty=format:'{%n  "commit": "%H",%n "subject": "%s",%n "author": {%n    "name": "%aN",%n    "email": "%aE",%n    "date": "%aD"%n  }%n},' origin/blabla...feature/blabla | sed "$ s/,$//" | sed ':a;N;$!ba;s/\r\n\([^{]\)/\\n\1/g'| awk 'BEGIN { print("[") } { print($0) } END { print("]") }')  >> $GITHUB_OUTPUT

Slack Action配置

steps:
  - name: Send Slack message when release is unsuccessful
    uses: slackapi/slack-github-action@v1.18.0
    with:
      # For posting a rich message using Block Kit
      payload: |
        {
         "blocks": [
             {
               "type": "section",
               "text": {
                 "type": "mrkdwn",
                 "text": "${{ fromJSON(needs.testing.outputs.PENDING_PR) }}"
              }
             }
          ]
         }
    env:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
      SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK

遇到的错误

{
  content: [
    {
      commit: 'test',
      subject: 'test',
      author: [Object]
    },
    {
      commit: 'test',
      subject: 'test)',
      author: [Object]
    },
    {
      commit: 'test',
      subject: 'test',
      author: [Object]
    },
    {
      commit: 'test',
      subject: 'test',
      author: [Object]
    }
  ]
}
Error: no_text
Error: Request failed with status code 400

解决方案

1. 修正Git日志JSON生成脚本

当前脚本存在两个问题:一是直接将变量追加到$GITHUB_OUTPUT会导致格式错误,二是未转义commit主题中的双引号,破坏JSON结构。修正后的脚本:

# 生成合法的JSON数组,转义双引号并正确输出到GITHUB_OUTPUT
PENDING_PR=$(git log --pretty=format:'{"commit": "%H", "subject": "%s", "author": {"name": "%aN", "email": "%aE", "date": "%aD"}}' origin/blabla...feature/blabla \
  | sed 's/"/\\"/g' \
  | sed 's/$/,/' \
  | sed '$ s/,$//' \
  | awk 'BEGIN { print("[") } { print($0) } END { print("]") }')
# 正确写入GITHUB_OUTPUT,避免换行解析问题
echo "PENDING_PR=$PENDING_PR" >> $GITHUB_OUTPUT

2. 修正Slack Action的Payload结构

错误原因是直接将JSON数组塞到mrkdwn文本字段中,Slack无法解析,且缺少降级用的顶层text字段。以下是生成美观Block Kit格式的配置:

steps:
  - name: Send Slack message when release is unsuccessful
    uses: slackapi/slack-github-action@v1.18.0
    with:
      payload: |
        {
          "text": "以下是待处理的提交记录",
          "blocks": [
            {
              "type": "header",
              "text": {
                "type": "plain_text",
                "text": "🔔 待处理提交记录",
                "emoji": true
              }
            },
            ${{ join(fromJSON(needs.testing.outputs.PENDING_PR) | map('format', '{"type": "section", "text": {"type": "mrkdwn", "text": "*Commit哈希*: `{0}`\n*提交主题*: {1}\n*提交人*: {2} ({3})\n*提交时间*: {4}}", .commit, escape(.subject), .author.name, .author.email, .author.date), ',') }}
          ]
        }
    env:
      SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}
      SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
  • 顶层text字段作为降级内容,确保在不支持Block Kit的客户端能正常显示。
  • 使用fromJSON解析提交数组,通过map和format将每个提交转换为独立的Section块,join函数将所有块拼接成合法的JSON数组。
  • escape(.subject)用于转义提交主题中的特殊字符(如<、>、&),避免破坏Slack的mrkdwn格式。

3. 验证JSON合法性

在运行脚本后,可通过以下命令验证生成的JSON是否合法:

echo "$PENDING_PR" | jq .

如果jq无报错,说明JSON格式正确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:05:24