From d40386a33510eacf6abbc4dfa0e5c7cc2fa95ea7 Mon Sep 17 00:00:00 2001 From: Victor Martinez Date: Thu, 27 Feb 2025 15:16:51 +0100 Subject: [PATCH] mergify: support backports automation with labels (#16937) --- .buildkite/pull-requests.json | 4 +- .ci/Makefile | 47 ++++++++ .github/workflows/mergify-labels-copier.yml | 23 ++++ .github/workflows/pre-commit.yml | 18 ++++ .github/workflows/version_bumps.yml | 29 +++-- .mergify.yml | 114 ++++++++++++++++++++ .pre-commit-config.yaml | 6 ++ 7 files changed, 234 insertions(+), 7 deletions(-) create mode 100644 .ci/Makefile create mode 100644 .github/workflows/mergify-labels-copier.yml create mode 100644 .github/workflows/pre-commit.yml create mode 100644 .mergify.yml create mode 100644 .pre-commit-config.yaml diff --git a/.buildkite/pull-requests.json b/.buildkite/pull-requests.json index bc386fef8..2414a75b5 100644 --- a/.buildkite/pull-requests.json +++ b/.buildkite/pull-requests.json @@ -14,8 +14,10 @@ "skip_ci_labels": [ ], "skip_target_branches": [ ], "skip_ci_on_only_changed": [ - "^docs/", "^.github/", + "^docs/", + "^.mergify.yml$", + "^.pre-commit-config.yaml", "\\.md$" ], "always_require_ci_on_changed": [ ] diff --git a/.ci/Makefile b/.ci/Makefile new file mode 100644 index 000000000..e6abdee71 --- /dev/null +++ b/.ci/Makefile @@ -0,0 +1,47 @@ +.SILENT: +MAKEFLAGS += --no-print-directory +.SHELLFLAGS = -euc +SHELL = /bin/bash + +####################### +## Templates +####################### +## Mergify template +define MERGIFY_TMPL + + - name: backport patches to $(BRANCH) branch + conditions: + - merged + - base=main + - label=$(BACKPORT_LABEL) + actions: + backport: + assignees: + - "{{ author }}" + branches: + - "$(BRANCH)" + labels: + - "backport" + title: "[{{ destination_branch }}] {{ title }} (backport #{{ number }})" +endef + +# Add mergify entry for the new backport label +.PHONY: mergify +export MERGIFY_TMPL +mergify: BACKPORT_LABEL=$${BACKPORT_LABEL} BRANCH=$${BRANCH} PUSH_BRANCH=$${PUSH_BRANCH} +mergify: + @echo ">> mergify" + echo "$$MERGIFY_TMPL" >> ../.mergify.yml + git add ../.mergify.yml + git status + if [ ! -z "$$(git status --porcelain)" ]; then \ + git commit -m "mergify: add $(BACKPORT_LABEL) rule"; \ + git push origin $(PUSH_BRANCH) ; \ + fi + +# Create GitHub backport label +.PHONY: backport-label +backport-label: BACKPORT_LABEL=$${BACKPORT_LABEL} +backport-label: + @echo ">> backport-label" + gh label create $(BACKPORT_LABEL) --description "Automated backport with mergify" --color 0052cc --force diff --git a/.github/workflows/mergify-labels-copier.yml b/.github/workflows/mergify-labels-copier.yml new file mode 100644 index 000000000..d5ff3ed0e --- /dev/null +++ b/.github/workflows/mergify-labels-copier.yml @@ -0,0 +1,23 @@ +name: mergify backport labels copier + +on: + pull_request: + types: + - opened + +permissions: + contents: read + +jobs: + mergify-backport-labels-copier: + runs-on: ubuntu-latest + if: startsWith(github.head_ref, 'mergify/bp/') + permissions: + # Add GH labels + pull-requests: write + # See https://github.com/cli/cli/issues/6274 + repository-projects: read + steps: + - uses: elastic/oblt-actions/mergify/labels-copier@v1 + with: + excluded-labels-regex: "^backport-*" diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 000000000..23545b29c --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,18 @@ +name: pre-commit + +on: + pull_request: + push: + branches: + - main + - 8.* + - 9.* + +permissions: + contents: read + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: elastic/oblt-actions/pre-commit@v1 diff --git a/.github/workflows/version_bumps.yml b/.github/workflows/version_bumps.yml index a888bcc9c..e674c0b6c 100644 --- a/.github/workflows/version_bumps.yml +++ b/.github/workflows/version_bumps.yml @@ -25,9 +25,13 @@ jobs: version_bumper: name: Bump versions runs-on: ubuntu-latest + env: + INPUTS_BRANCH: "${{ inputs.branch }}" + INPUTS_BUMP: "${{ inputs.bump }}" + BACKPORT_LABEL: "backport-${{ inputs.branch }}" steps: - name: Fetch logstash-core team member list - uses: tspascoal/get-user-teams-membership@v1 + uses: tspascoal/get-user-teams-membership@57e9f42acd78f4d0f496b3be4368fc5f62696662 #v3.0.0 with: username: ${{ github.actor }} organization: elastic @@ -37,14 +41,14 @@ jobs: if: ${{ steps.checkUserMember.outputs.isTeamMember == 'false' }} run: exit 1 - name: checkout repo content - uses: actions/checkout@v2 + uses: actions/checkout@v4 with: fetch-depth: 0 - ref: ${{ github.event.inputs.branch }} + ref: ${{ env.INPUTS_BRANCH }} - run: git config --global user.email "43502315+logstashmachine@users.noreply.github.com" - run: git config --global user.name "logstashmachine" - run: ./gradlew clean installDefaultGems - - run: ./vendor/jruby/bin/jruby -S bundle update --all --${{ github.event.inputs.bump }} --strict + - run: ./vendor/jruby/bin/jruby -S bundle update --all --${{ env.INPUTS_BUMP }} --strict - run: mv Gemfile.lock Gemfile.jruby-*.lock.release - run: echo "T=$(date +%s)" >> $GITHUB_ENV - run: echo "BRANCH=update_lock_${T}" >> $GITHUB_ENV @@ -53,8 +57,21 @@ jobs: git add . git status if [[ -z $(git status --porcelain) ]]; then echo "No changes. We're done."; exit 0; fi - git commit -m "Update ${{ github.event.inputs.bump }} plugin versions in gemfile lock" -a + git commit -m "Update ${{ env.INPUTS_BUMP }} plugin versions in gemfile lock" -a git push origin $BRANCH + + - name: Update mergify (minor only) + if: ${{ inputs.bump == 'minor' }} + continue-on-error: true + run: make -C .ci mergify BACKPORT_LABEL=$BACKPORT_LABEL BRANCH=$INPUTS_BRANCH PUSH_BRANCH=$BRANCH + - name: Create Pull Request run: | - curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -X POST -d "{\"title\": \"bump lock file for ${{ github.event.inputs.branch }}\",\"head\": \"${BRANCH}\",\"base\": \"${{ github.event.inputs.branch }}\"}" https://api.github.com/repos/elastic/logstash/pulls + curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" -X POST -d "{\"title\": \"bump lock file for ${{ env.INPUTS_BRANCH }}\",\"head\": \"${BRANCH}\",\"base\": \"${{ env.INPUTS_BRANCH }}\"}" https://api.github.com/repos/elastic/logstash/pulls + + - name: Create GitHub backport label (Mergify) (minor only) + if: ${{ inputs.bump == 'minor' }} + continue-on-error: true + run: make -C .ci backport-label BACKPORT_LABEL=$BACKPORT_LABEL + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.mergify.yml b/.mergify.yml new file mode 100644 index 000000000..192bfab15 --- /dev/null +++ b/.mergify.yml @@ -0,0 +1,114 @@ +pull_request_rules: + - name: ask to resolve conflict + conditions: + - conflict + actions: + comment: + message: | + This pull request is now in conflicts. Could you fix it @{{author}}? 🙏 + To fixup this pull request, you can check out it locally. See documentation: https://help.github.com/articles/checking-out-pull-requests-locally/ + ``` + git fetch upstream + git checkout -b {{head}} upstream/{{head}} + git merge upstream/{{base}} + git push upstream {{head}} + ``` + + - name: notify the backport policy + conditions: + - -label~=^backport + - base=main + actions: + comment: + message: | + This pull request does not have a backport label. Could you fix it @{{author}}? 🙏 + To fixup this pull request, you need to add the backport labels for the needed + branches, such as: + * `backport-8./d` is the label to automatically backport to the `8./d` branch. `/d` is the digit. + * `backport-8.x` is the label to automatically backport to the `8.x` branch. + + - name: add backport-8.x for the all the PRs targeting main if no skipped or assigned already + conditions: + - -label~=^(backport-skip|backport-8.x)$ + - base=main + actions: + comment: + message: | + `backport-8.x` has been added to help with the transition to the new branch `8.x`. + If you don't need it please use `backport-skip` label. + label: + add: + - backport-8.x + + - name: remove backport-skip label + conditions: + - label~=^backport-\d + actions: + label: + remove: + - backport-skip + + - name: remove backport-8.x label if backport-skip is present + conditions: + - label~=^backport-skip + actions: + label: + remove: + - backport-8.x + + - name: notify the backport has not been merged yet + conditions: + - -merged + - -closed + - author=mergify[bot] + - "#check-success>0" + - schedule=Mon-Mon 06:00-10:00[Europe/Paris] + actions: + comment: + message: | + This pull request has not been merged yet. Could you please review and merge it @{{ assignee | join(', @') }}? 🙏 + + - name: backport patches to 8.x branch + conditions: + - merged + - base=main + - label=backport-8.x + actions: + backport: + assignees: + - "{{ author }}" + branches: + - "8.x" + labels: + - "backport" + title: "[{{ destination_branch }}] {{ title }} (backport #{{ number }})" + + - name: backport patches to 8.16 branch + conditions: + - merged + - base=main + - label=backport-8.16 + actions: + backport: + assignees: + - "{{ author }}" + branches: + - "8.16" + labels: + - "backport" + title: "[{{ destination_branch }}] {{ title }} (backport #{{ number }})" + + - name: backport patches to 8.17 branch + conditions: + - merged + - base=main + - label=backport-8.17 + actions: + backport: + assignees: + - "{{ author }}" + branches: + - "8.17" + labels: + - "backport" + title: "[{{ destination_branch }}] {{ title }} (backport #{{ number }})" diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..56f1047be --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-merge-conflict + args: ['--assume-in-merge']