Created
June 3, 2019 15:56
-
-
Save ivan-pinatti/5355402e070cee16a23b94b667317386 to your computer and use it in GitHub Desktop.
Git - Check stale branches and alert on Slack - #git #stale #branches #slack #sanity
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env bash | |
: ' Script that checks stale branches based on a specific date on a git | |
repository and send an alert message on a Slack channel | |
' | |
# check if debug flag is set | |
if [ "${DEBUG}" = true ]; then | |
set -x # enable print commands and their arguments as they are executed. | |
export # show all declared variables (includes system variables) | |
whoami # print current user | |
else | |
# unset if flag is not set | |
unset DEBUG | |
fi | |
# bash default parameters | |
set -o errexit # make your script exit when a command fails | |
set -o pipefail # exit status of the last command that threw a non-zero exit code is returned | |
set -o nounset # exit when your script tries to use undeclared variables | |
# check binaries | |
__BASENAME=$(which basename) | |
__CURL=$(which curl) | |
__DATE=$(which date) | |
__GIT=$(which git) | |
__HEAD=$(which head) | |
__SED=$(which sed) | |
# parameters | |
__date=${1:-"4 weeks ago"} | |
__branch_exclusion_list=${2:-"dev|stage|master"} | |
__slack_channel_or_person="${3:-"#my-ci-channel"}" | |
__msg_from="${4:-"bitbucket-sanity-check-bot"}" | |
__msg_alert_icon="${5:-":x:"}" | |
__slack_webhook_url="${6:-"https://hooks.slack.com/services/ASD4456S5/AHCE54563/ai85930591zBNasd456qwett"}" | |
# variables | |
readonly __date_epoch=$(${__DATE} --date="${__date}" +%s) | |
readonly __git_repo_name=$(${__BASENAME} $(${__GIT} rev-parse --show-toplevel)) | |
# functions | |
function push_to_slack { | |
# parameters | |
local __from="${1:-}" | |
local __channel_or_person="${2:-}" | |
local __text="${3:-}" | |
# push to slack via webhook | |
${__CURL} --request POST \ | |
--data-urlencode \ | |
"payload={\"username\": \"${__from}\", | |
\"channel\": \"${__channel_or_person}\", | |
\"text\": \"${__text}\", | |
\"as_user\": \"false\", | |
\"link_names\": \"true\" | |
}" \ | |
"${__slack_webhook_url}" | |
} # end of push_to_slack | |
# flow | |
for __branch in $(${__GIT} branch --remote); do | |
# check if it is not one of the environment branches/tags | |
if [[ ! ${__branch} =~ ^.*(${__branch_exclusion_list}|->|origin\/HEAD)$ ]]; then | |
# get the last commit date in UNIX epoch format | |
__last_commit_date_epoch=$(${__GIT} show ${__branch} --name-only --pretty="format:%at" | ${__HEAD} -1) | |
# check if the last commit is older than the reference date | |
if [[ ${__last_commit_date_epoch} < ${__date_epoch} ]]; then | |
__branch_name=$(echo ${__branch} | ${__SED} 's/^origin\///') | |
__last_commit_author=$(${__GIT} show ${__branch} --name-only --pretty="format: %ci by %an" | ${__HEAD} -n 1) | |
push_to_slack "${__msg_from}" \ | |
"${__slack_channel_or_person}" \ | |
"${__msg_alert_icon} Repository *${__git_repo_name}* ${__msg_alert_icon}\nBranch *${__branch_name}* is older than *${__date}*\n Last commit *${__last_commit_author}* \n@channel please check." | |
fi | |
fi | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment