diff --git a/.circleci/config.yml b/.circleci/config.yml index beab2b7c3c..65bd3eb124 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -927,19 +927,6 @@ jobs: path: *TEST_RESULTS_DIR - run: *notify-slack-failure - # only runs on main: checks latest commit to see if the PR associated has a backport/* or docs* label to cherry-pick - cherry-picker: - docker: - - image: docker.mirror.hashicorp.services/alpine:3.12 - steps: - - run: apk add --no-cache --no-progress git bash curl ncurses jq openssh-client - - checkout - - add_ssh_keys: # needs a key to push cherry-picked commits back to github - fingerprints: - - "fc:55:84:15:0a:1d:c8:e9:06:d0:e8:9c:7b:a9:b7:31" - - run: .circleci/scripts/cherry-picker.sh - - run: *notify-slack-failure - trigger-oss-merge: docker: - image: docker.mirror.hashicorp.services/alpine:3.12 @@ -1202,13 +1189,7 @@ workflows: only: - main - /release\/\d+\.\d+\.x$/ - - cherry-picker: - context: team-consul - filters: - branches: - only: - - main - - /release\/\d+\.\d+\.x$/ + load-test: when: << pipeline.parameters.trigger-load-test >> jobs: diff --git a/.circleci/scripts/cherry-picker.sh b/.circleci/scripts/cherry-picker.sh deleted file mode 100755 index 18c2ec4a80..0000000000 --- a/.circleci/scripts/cherry-picker.sh +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env bash -# -# This script is meant to run on every new commit to main in CircleCI. If the commit comes from a PR, it will -# check the PR associated with the commit for labels. If the label matches `docs*` it will be cherry-picked -# to stable-website. If the label matches `backport/*`, it will be cherry-picked to the appropriate `release/*` -# branch. - -# Requires $CIRCLE_PROJECT_USERNAME, $CIRCLE_PROJECT_REPONAME, and $CIRCLE_SHA1 from CircleCI - -set -o pipefail - -# colorized status prompt -function status { - tput setaf 4 - echo "$@" - tput sgr0 -} - -# Returns the latest GitHub "backport/*" label -function get_latest_backport_label { - local resp - local ret - local latest_backport_label - - resp=$(curl -f -s -H "Authorization: token ${GITHUB_TOKEN}" "https://api.github.com/repos/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/labels?per_page=100") - ret="$?" - if [[ "$ret" -ne 0 ]]; then - status "The GitHub API returned $ret which means it was probably rate limited." - exit $ret - fi - - latest_backport_label=$(echo "$resp" | jq -r '.[] | select(.name | startswith("backport/")) | .name' | sort -rV | head -n1) - echo "$latest_backport_label" - return 0 -} - -# This function will do the cherry-picking of a commit on a branch -# Exit 1 if cherry-picking fails -function cherry_pick_with_slack_notification { - # Arguments: - # $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" - local pr_url="$3" - - git checkout "$branch" || exit 1 - # If git cherry-pick fails or it fails to push, we send a failure notification - if ! (git cherry-pick --mainline 1 "$commit" && git push origin "$branch"); 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 \ - "{ \ - \"attachments\": [ \ - { \ - \"fallback\": \"Cherry pick failed!\", \ - \"text\": \"🍒❌ Cherry picking of <$pr_url|${commit:0:7}> to \`$branch\` failed!\n\nBuild Log: ${CIRCLE_BUILD_URL}\", \ - \"footer\": \"${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}\", \ - \"ts\": \"$(date +%s)\", \ - \"color\": \"danger\" \ - } \ - ] \ - }" "${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 - return 1 - - # Else we send a success notification - else - status "🍒✅ Cherry picking of PR commit ${commit:0:7} from ${pr_url} succeeded!" - curl -X POST -H 'Content-type: application/json' \ - --data \ - "{ \ - \"attachments\": [ \ - { \ - \"fallback\": \"Cherry pick succeeded!\", \ - \"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}") -ret="$?" -if [[ "$ret" -ne 0 ]]; then - status "The GitHub API returned $ret which means it was probably rate limited." - exit $ret -fi - -# get the count from the GitHub API to check if the commit matched a PR -count=$(echo "$resp" | jq '.total_count') -if [[ "$count" -eq 0 ]]; then - status "This commit was not associated with a PR" - exit 0 -fi - -# save PR number -pr_number=$(echo "$resp" | jq '.items[].number') - -# comment on the PR with the build number to make it easy to re-run the job when -# cherry-pick labels are added in the future -github_message=":cherries: If backport labels were added before merging, cherry-picking will start automatically.\n\nTo retroactively trigger a backport after merging, add backport labels and re-run ${CIRCLE_BUILD_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_number}/comments" - - - -# If the API returned a non-zero count, we have found a PR with that commit so we find -# the labels from the PR - -# 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 - status "jq exited with $ret when trying to find label names. Are there labels applied to the PR ($pr_url)?" - # This can be a valid error but usually this means we do not have any labels so it doesn't signal - # cherry-picking is possible. Exit 0 for now unless we run into cases where these failures are important. - exit 0 -fi - -# Attach label for latest release branch if 'docs-cherrypick' is present. Will noop if already applied. -latest_backport_label=$(get_latest_backport_label) -status "latest backport label is $latest_backport_label" -if echo "$resp" | jq -e '.items[].labels[] | select(.name | contains("docs-cherrypick"))'; then - labels=$(curl -f -s -H "Authorization: token ${GITHUB_TOKEN}" -X POST -d "{\"labels\":[\"$latest_backport_label\"]}" "https://api.github.com/repos/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/issues/${pr_number}/labels" | jq --raw-output '.[].name' | sort -rV) - ret="$?" - if [[ "$ret" -ne 0 ]]; then - status "Error applying $latest_backport_label to $pr_url" - exit $ret - fi -fi - -git config --local user.email "github-team-consul-core@hashicorp.com" -git config --local user.name "hc-github-team-consul-core" - -backport_failures=0 -# loop through all labels on the PR -for label in $labels; do - status "checking label: $label" - # if the label matches docs-cherrypick, it will attempt to cherry-pick to stable-website - if [[ $label =~ docs-cherrypick ]]; then - status "backporting to stable-website" - branch="stable-website" - cherry_pick_with_slack_notification "$branch" "$CIRCLE_SHA1" "$pr_url" - backport_failures=$((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=$((backport_failures + "$?")) - fi - # reset the working directory for the next label - git reset --hard -done - -if [ "$backport_failures" -ne 0 ]; then - echo "$backport_failures backports failed" - exit 1 -fi diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index c2b2b9b052..131d9057d2 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -156,12 +156,25 @@ When you're ready to submit a pull request: if your changes aren't finalized but would benefit from in-process feedback. 5. If there's any reason Consul users might need to know about this change, [add a changelog entry](../docs/contributing/add-a-changelog-entry.md). -6. After you submit, the Consul maintainers team needs time to carefully review your +6. Add labels to your pull request. A table of commonly use labels is below. + If you have any questions about which to apply, feel free to call it out in the PR or comments. + | Label | When to Use | + | --- | --- | + | `pr/no-changelog` | This PR does not have an intended changelog entry | + | `pr/no-metrics-test` | This PR does not require any testing for metrics | + | `backport/stable-website` | This PR contains documentation changes that are ready to be deployed immediately. Changes will also automatically get backported to the latest release branch | + | `backport/1.12.x` | Backport the changes in this PR to the targeted release branch. Consult the [Consul Release Notes](https://www.consul.io/docs/release-notes) page to view active releases. | + Other labels may automatically be added by the Github Action CI. +7. After you submit, the Consul maintainers team needs time to carefully review your contribution and ensure it is production-ready, considering factors such as: security, backwards-compatibility, potential regressions, etc. -7. After you address Consul maintainer feedback and the PR is approved, a Consul maintainer +8. After you address Consul maintainer feedback and the PR is approved, a Consul maintainer will merge it. Your contribution will be available from the next major release (e.g., 1.x) unless explicitly backported to an existing or previous major release by the maintainer. +9. Any backport labels will generate an additional PR to the targeted release branch. + These will be linked in the original PR. + Assuming the tests pass, the PR will be merged automatically. + If the tests fail, it is you responsibility to resolve the issues with backports and request another reviewer. #### Checklists diff --git a/.github/workflows/backport-assistant.yml b/.github/workflows/backport-assistant.yml index 91a9cf6ad4..92ab86cd66 100644 --- a/.github/workflows/backport-assistant.yml +++ b/.github/workflows/backport-assistant.yml @@ -8,6 +8,9 @@ on: types: - closed - labeled + branches: + - main + - 'releases/*.*.x' jobs: backport: @@ -16,17 +19,33 @@ jobs: container: hashicorpdev/backport-assistant:0.2.3 steps: - name: Run Backport Assistant for stable-website - # Update this to auto-merge when we have confidence in the process working and kill Circle run: | - backport-assistant backport -merge-method=rebase + backport-assistant backport -merge-method=rebase -auto-merge env: BACKPORT_LABEL_REGEXP: "type/docs-(?Pcherrypick)" BACKPORT_TARGET_TEMPLATE: "stable-website" GITHUB_TOKEN: ${{ secrets.ELEVATED_GITHUB_TOKEN }} - - name: Run Backport Assistant for release branches - # Update this to auto-merge when we have confidence in the process working and kill Circle + - name: Backport changes to latest release branch run: | - backport-assistant backport -merge-method=rebase + resp=$(curl -f -s "https://api.github.com/repos/$GITHUB_REPOSITORY/labels?per_page=100") + ret="$?" + if [[ "$ret" -ne 0 ]]; then + echo "The GitHub API returned $ret" + exit $ret + fi + # get the latest backport label excluding any website labels, ex: `backport/0.3.x` and not `backport/website` + latest_backport_label=$(echo "$resp" | jq -r '.[] | select(.name | (startswith("backport/") and (contains("website") | not))) | .name' | sort -rV | head -n1) + echo "Latest backport label: $latest_backport_label" + # set BACKPORT_TARGET_TEMPLATE for backport-assistant + # trims backport/ from the beginning with parameter substitution + export BACKPORT_TARGET_TEMPLATE="release/${latest_backport_label#backport/}.x" + backport-assistant backport -merge-method=rebase -automerge + env: + BACKPORT_LABEL_REGEXP: "type/docs-(?Pcherrypick)" + GITHUB_TOKEN: ${{ secrets.ELEVATED_GITHUB_TOKEN }} + - name: Run Backport Assistant for release branches + run: | + backport-assistant backport -merge-method=rebase -auto-merge env: BACKPORT_LABEL_REGEXP: "backport/(?P\\d+\\.\\d+)" BACKPORT_TARGET_TEMPLATE: "release/{{.target}}.x" diff --git a/.github/workflows/backport-reminder.yml b/.github/workflows/backport-reminder.yml index 323b90daf6..7a04ccd595 100644 --- a/.github/workflows/backport-reminder.yml +++ b/.github/workflows/backport-reminder.yml @@ -17,7 +17,7 @@ jobs: steps: - name: Comment on PR run: | - github_message="After merging, confirm that you see messages like: 🍒✅ Cherry pick of commit ... onto ... succeeded!" + github_message="After merging, confirm that you see linked PRs AND check that them for CI errors." curl -s -H "Authorization: token ${{ secrets.PR_COMMENT_TOKEN }}" \ -X POST \ -d "{ \"body\": \"${github_message}\"}" \ diff --git a/.github/workflows/pr-metrics-test-checker.yml b/.github/workflows/pr-metrics-test-checker.yml index 3019d357c8..7c42da595b 100644 --- a/.github/workflows/pr-metrics-test-checker.yml +++ b/.github/workflows/pr-metrics-test-checker.yml @@ -8,7 +8,7 @@ on: jobs: metrics_test_check: - if: "!contains(github.event.pull_request.labels.*.name, 'pr/no-metrics-test')" + if: "! ( contains(github.event.pull_request.labels.*.name, 'pr/no-metrics-test') || github.event.pull_request.user.login == 'hc-github-team-consul-core' )" runs-on: ubuntu-latest steps: - uses: actions/checkout@v2