Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 5 additions & 46 deletions .github/workflows/gardener-notify-slack.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Gardener - Notify Slack
# Runs after `Gardener - Notify Event` completes and does the real work:
# applies the devtools-gardener label and posts a summary to Slack.
# applies the devtools-gardener label and posts a repo-prefixed linked title to Slack.
#
# The workflow_run trigger runs this job in the default-branch context with
# full GITHUB_TOKEN permissions and Actions secret access — this is what
Expand Down Expand Up @@ -59,57 +59,16 @@ jobs:
SLACK_BOT_TOKEN: ${{ secrets.SLACK_GARDENER_BOT_TOKEN }}
SLACK_CHANNEL_ID: ${{ vars.GARDENER_SLACK_CHANNEL_ID }}
run: |
KIND=$(jq -r 'if has("pull_request") then "PR" else "Issue" end' event.json)
# Pull the body out, truncate, then convert GitHub Markdown to
# Slack mrkdwn. Links and fenced code blocks are stashed before
# the HTML-escape pass so their contents survive verbatim (a `&`
# inside a URL must stay raw, and code content shouldn't be
# mangled). Blockquote `> ` markers are also stashed so the
# `>` → `>` escape doesn't break them. Everything else is
# HTML-escaped so user-supplied `<`, `>`, `&` can't collide
# with Slack link syntax or injected mentions like <!channel>.
BODY=$(jq -r '(.issue // .pull_request).body // ""' event.json)
if [ ${#BODY} -gt 1000 ]; then
BODY="${BODY:0:1000}…"
fi
BODY=$(printf '%s' "$BODY" | perl -0777 -pe '
my @u;
s{\[([^\]]+)\]\(([^)]+)\)}{push @u, $2; "\x01$#u\x02$1\x03"}ge;
my @c;
s{^```[^\n]*\n(.*?)\n```$}{push @c, $1; "\x04$#c\x05"}gems;
s/^> /\x06/gm;
s/^#{1,6}\s+(.+)$/*$1*/gm;
s/\*\*(.+?)\*\*/*$1*/g;
s/^(\s*)- \[x\]\s+/$1✓ /gm;
s/^(\s*)[-*]\s+/$1• /gm;
s/&/&amp;/g;
s/</&lt;/g;
s/>/&gt;/g;
s/\x06/> /g;
s{\x01(\d+)\x02(.*?)\x03}{"<$u[$1]|$2>"}ge;
s{\x04(\d+)\x05}{"```\n$c[$1]\n```"}ge;
')
jq \
--arg channel "$SLACK_CHANNEL_ID" \
--arg kind "$KIND" \
--arg body "$BODY" \
'
def escape: gsub("&";"&amp;") | gsub("<";"&lt;") | gsub(">";"&gt;");

(.issue // .pull_request) as $i
| ([$i.labels[]?.name | select(. != "devtools-gardener")]
| map("`\(.)`") | join(" ")) as $labels
| (if $kind == "PR"
then " · \($i.changed_files) files, +\($i.additions)/-\($i.deletions)"
+ (if $i.draft then " · draft" else "" end)
else "" end) as $meta
| [ "*<\($i.html_url)|\($kind) #\($i.number)>* — \(($i.title | escape))",
"_opened by \($i.user.login)\($meta)_" ]
+ (if $body != "" then [$body] else [] end)
+ (if $labels != "" then [$labels] else [] end)
| join("\n") as $msg
| { channel: $channel, text: "\($kind) #\($i.number): \($i.title)",
blocks: [{ type: "section", text: { type: "mrkdwn", text: $msg } }] }
| { channel: $channel,
text: "\(.repository.name) · <\($i.html_url)|\($i.title | escape)>",
unfurl_links: false,
unfurl_media: false }
' event.json | curl -sf -X POST \
-H "Authorization: Bearer $SLACK_BOT_TOKEN" \
-H 'Content-type: application/json; charset=utf-8' \
Expand Down
Loading