如何用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
相关产品推荐
相关产品推荐

