Skip to content
Open
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,5 +1,5 @@
name: Gardener - Notify Slack
# Runs after `Gardener - Notify Event` completes. Posts a summary to Slack,
# Runs after `Gardener - Notify Event` completes. Posts a linked title to Slack,
# and for Dependabot-opened PRs also applies the `devtools-gardener` label
# (so Dependabot PRs show up in the gardener flow without a human having
# to label them).
Expand Down Expand Up @@ -61,57 +61,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: "<\($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