diff --git a/.circleci/scripts/cherry-picker.sh b/.circleci/scripts/cherry-picker.sh index 52a293f6b..096b61d24 100755 --- a/.circleci/scripts/cherry-picker.sh +++ b/.circleci/scripts/cherry-picker.sh @@ -23,6 +23,10 @@ function cherry_pick_with_slack_notification { # $1 - branch to cherry-pick to # $2 - commit to cherry-pick # $3 - url to PR of commit + # + # Return: + # 0 for success + # 1 for error local branch="$1" local commit="$2" @@ -32,6 +36,8 @@ function cherry_pick_with_slack_notification { # If git cherry-pick fails, we send a failure notification if ! git cherry-pick --mainline 1 "$commit"; then status "🍒❌ Cherry pick of commit ${commit:0:7} from $pr_url onto $branch failed!" + + # send slack notification curl -X POST -H 'Content-type: application/json' \ --data \ "{ \ @@ -45,11 +51,22 @@ function cherry_pick_with_slack_notification { } \ ] \ }" "${CONSUL_SLACK_WEBHOOK_URL}" + + # post PR comment to GitHub + github_message=":cherries::x: Cherry pick of commit ${commit} onto \`$branch\` failed! [Build Log]($CIRCLE_BUILD_URL)" + pr_id=$(basename ${pr_url}) + curl -f -s -H "Authorization: token ${GITHUB_TOKEN}" \ + -X POST \ + -d "{ \"body\": \"${github_message}\"}" \ + "https://api.github.com/repos/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/issues/${pr_id}/comments" + + # run git status to leave error in CircleCI log git status - exit 1 + return 1 + # Else we send a success notification else - status "🍒✅ Cherry picking of PR commit ${commit:0:7} from $pr_url succeeded!" + status "🍒✅ Cherry picking of PR commit ${commit:0:7} from ${pr_url} succeeded!" # push changes to the specified branch git push origin "$branch" curl -X POST -H 'Content-type: application/json' \ @@ -58,18 +75,28 @@ function cherry_pick_with_slack_notification { \"attachments\": [ \ { \ \"fallback\": \"Cherry pick succeeded!\", \ - \"text\": \"🍒✅ Cherry picking of <$pr_url|${commit:0:7}> to \`$branch\` succeeded!\n\nBuild Log: ${CIRCLE_BUILD_URL}\", \ + \"text\": \"🍒✅ Cherry picking of <$pr_url|${commit:0:7}> to \`$branch\` succeeded!\", \ \"footer\": \"${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}\", \ \"ts\": \"$(date +%s)\", \ \"color\": \"good\" \ } \ ] \ }" "${CONSUL_SLACK_WEBHOOK_URL}" + + # post PR comment to GitHub + github_message=":cherries::white_check_mark: Cherry pick of commit ${commit} onto \`$branch\` succeeded!" + pr_id=$(basename ${pr_url}) + curl -f -s -H "Authorization: token ${GITHUB_TOKEN}" \ + -X POST \ + -d "{ \"body\": \"${github_message}\"}" \ + "https://api.github.com/repos/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/issues/${pr_id}/comments" fi + + return 0 } # search for the PR labels applicable to the specified commit -resp=$(curl -f -s -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/search/issues?q=repo:$CIRCLE_PROJECT_USERNAME/$CIRCLE_PROJECT_REPONAME+sha:$CIRCLE_SHA1") +resp=$(curl -f -s -H "Authorization: token ${GITHUB_TOKEN}" "https://api.github.com/search/issues?q=repo:${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}+sha:${CIRCLE_SHA1}") ret="$?" if [[ "$ret" -ne 0 ]]; then status "The GitHub API returned $ret which means it was probably rate limited." @@ -85,7 +112,9 @@ fi # If the API returned a non-zero count, we have found a PR with that commit so we find # the labels from the PR -labels=$(echo "$resp" | jq --raw-output '.items[].labels[] | .name') + +# sorts the labels from a PR via version sort +labels=$(echo "$resp" | jq --raw-output '.items[].labels[] | .name' | sort -rV) ret="$?" pr_url=$(echo "$resp" | jq --raw-output '.items[].pull_request.html_url') if [[ "$ret" -ne 0 ]]; then @@ -95,6 +124,7 @@ if [[ "$ret" -ne 0 ]]; then exit 0 fi +backport_failures=0 # loop through all labels on the PR for label in $labels; do git config --local user.email "hashicorp-ci@users.noreply.github.com" @@ -105,10 +135,17 @@ for label in $labels; do status "backporting to stable-website" branch="stable-website" cherry_pick_with_slack_notification "$branch" "$CIRCLE_SHA1" "$pr_url" + (( backport_failures += "$?" )) # else if the label matches backport/*, it will attempt to cherry-pick to the release branch elif [[ $label =~ backport/* ]]; then status "backporting to $label" branch="${label/backport/release}.x" cherry_pick_with_slack_notification "$branch" "$CIRCLE_SHA1" "$pr_url" + (( backport_failures += "$?" )) fi done + +if [ "$backport_failures" -ne 0 ]; then + echo "$backport_failures backports failed" + exit $backport_failures +fi \ No newline at end of file