Skip to content

Instantly share code, notes, and snippets.

@linjer
Last active April 20, 2019 06:40
Show Gist options
  • Save linjer/2ee6146d3b320cbe9225 to your computer and use it in GitHub Desktop.
Save linjer/2ee6146d3b320cbe9225 to your computer and use it in GitHub Desktop.
Atlassian Stash 3.2 Git integration with Slack through external web hooks
#!/bin/bash
# $1 => Slack hook URL
# $2 => Channel name
# $3 => URL to web repo browser for base project
slack_url="$1"
channel="$2"
browser_url="$3"
# Debugging output in /tmp/stash_slack.txt
# pwd > /tmp/stash_slack.txt
text=""
# Each column shown in the payload.
comm_desc_col="{\"title\":\"Commit\",\"short\":true,\"value\":\""
author_time_col="{\"title\":\"Author\",\"short\":true,\"value\":\""
first=1
# For every ref updated.
while read from_ref to_ref ref_name; do
echo ${from_ref} ${to_ref} ${ref_name} >> /tmp/stash_slack.txt
args=("log" '--format=%H %h "%an" "%s" "%ar"' "${from_ref}..${to_ref}")
commits=$(git "${args[@]}")
# echo "${commits}" >> /tmp/stash_slack.txt
commit_count=`echo "${commits}" | wc -l`
if [ ${first} -eq 1 ]; then
first=0
text="[<${browser_url}|${STASH_REPO_NAME}>] ${STASH_USER_NAME} <$STASH_USER_EMAIL> pushed: $commit_count commit"
else
text="${text}, ${commit_count} commit"
fi
if [ $commit_count -gt 1 ]; then text="${text}s"; fi
text="${text} to ${ref_name#*/}"
# Indexes
# [0] Full hash
# [1] Abbrev hash
# [2] Author name
# [3] Commit message
# [4] Author relative date
while read -r line; do
eval array=($line)
commit_link="<${browser_url}/commits/${array[0]}|${array[1]}>"
comm_desc_col="${comm_desc_col}${commit_link}: ${array[3]}\n"
author_time_col="${author_time_col}${array[2]}, ${array[4]}\n"
done <<< "$commits"
done
payload="payload={\"channel\":\"${channel}\",\"text\":\"${text}\",\"attachments\":[{\"fallback\":\"Table of commits in this push.\",\"color\":\"good\",\"fields\":["
# Close off all remaining blocks
comm_desc_col="${comm_desc_col}\"},"
author_time_col="${author_time_col}\"}"
payload="${payload}${comm_desc_col}${author_time_col}]}]}"
# Deliver!
# echo "$payload" >> /tmp/stash_slack.txt
curl -X POST --data-urlencode "$payload" ${slack_url}
# cat /tmp/stash_slack.txt
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment