Skip to content

Commit

Permalink
Replace mergify with GHAs (#3346)
Browse files Browse the repository at this point in the history
Replacing `mergify` that gets hard to maintain with GitHub actions with
features:
1. automerge for PRs
* `automerge` label is attached if and only if the PR author is
`softwaremill-ci` and exactly one file from the specified list is
changed,
* auto-merge action is performed if and only if there is an `automerge`
label attached and `ci` and `mima` jobs complete successfully.
2. `/rebase` as PR comment to rebase it.
  • Loading branch information
micsza authored Nov 30, 2023
1 parent 87ee1a9 commit 3cfec95
Show file tree
Hide file tree
Showing 5 changed files with 104 additions and 112 deletions.
14 changes: 14 additions & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
version: 1
labels:
- label: "automerge"
authors: ["softwaremill-ci"]
files:
- "build.sbt"
- "project/Versions.scala"
- "project/plugins.sbt"
- label: "dependency"
authors: ["softwaremill-ci"]
files:
- "build.sbt"
- "project/Versions.scala"
- "project/plugins.sbt"
56 changes: 51 additions & 5 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
name: CI
on:
pull_request:
branches: ['**']
push:
branches: ['**']
tags: [v*]
Expand All @@ -10,8 +9,12 @@ env:
SBT_JAVA_OPTS: -J-Xms4g -J-Xmx4g
jobs:
ci:
# run on external PRs, but not on internal PRs since those will be run by push to branch
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
# run on 1) push, 2) external PRs, 3) softwaremill-ci PRs
# do not run on internal, non-steward PRs since those will be run by push to branch
if: |
github.event_name == 'push' ||
github.event.pull_request.head.repo.full_name != github.repository ||
github.event.pull_request.user.login == 'softwaremill-ci'
runs-on: ubuntu-22.04
strategy:
fail-fast: false
Expand Down Expand Up @@ -102,9 +105,14 @@ jobs:
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# identify binary incompatibilities (check build.sbt for details)
mima:
# run on external PRs, but not on internal PRs since those will be run by push to branch
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
# run on 1) push, 2) external PRs, 3) softwaremill-ci PRs
# do not run on internal, non-steward PRs since those will be run by push to branch
if: |
github.event_name == 'push' ||
github.event.pull_request.head.repo.full_name != github.repository ||
github.event.pull_request.user.login == 'softwaremill-ci'
runs-on: ubuntu-22.04
steps:
- name: Checkout
Expand Down Expand Up @@ -175,3 +183,41 @@ jobs:
version: "v${{ env.VERSION }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


# `automerge` label is attached iff there is exactly one file changed by steward and this file belongs to a
# whitelist specified by `labeler.yml`
label:
name: Attach automerge label
# only for PRs by softwaremill-ci
if: github.event.pull_request.user.login == 'softwaremill-ci'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
with:
fetch-depth: 2
# count number of files changed
- name: Count number of files changed
id: count-changed-files
run: |
N=$(git diff --name-only -r HEAD^1 HEAD | wc -w)
echo "changed_files_num=$N" >> $GITHUB_OUTPUT
- name: Launch labeler
# skip if more than one file changed
if: steps.count-changed-files.outputs.changed_files_num == 1
uses: srvaroa/labeler@master
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"

auto-merge:
name: Auto merge
# only for PRs by softwaremill-ci
if: github.event.pull_request.user.login == 'softwaremill-ci'
needs: [ ci, mima, label ]
runs-on: ubuntu-22.04
steps:
- id: automerge
name: automerge
uses: "pascalgn/[email protected]"
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
19 changes: 19 additions & 0 deletions .github/workflows/rebase-cmd-dispatch.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# On any comment, it will look for '/rebase' in the comment body and in case of hit, it dispatches rebase cmd
# with event type 'rebase-command' which triggers 'rebase-command` WF that performs the rebase operation.
name: Slash Command Dispatch
on:
issue_comment:
types: [created]
jobs:
slashCommandDispatch:
# to fast-skip for typical, non-rebase comments
if: contains(github.event.comment.body, '/rebase')
runs-on: ubuntu-latest
steps:
- name: Slash Command Dispatch
uses: peter-evans/slash-command-dispatch@v3
with:
token: ${{ secrets.GITHUB_TOKEN }}
commands: rebase
permission: write
issue-type: pull-request
20 changes: 20 additions & 0 deletions .github/workflows/rebase-cmd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
name: rebase-command
on:
repository_dispatch:
types: [rebase-command]
jobs:
rebase:
runs-on: ubuntu-latest
steps:
- uses: peter-evans/rebase@v2
id: rebase
with:
head: ${{ github.event.client_payload.pull_request.head.label }}
- name: Add reaction
if: steps.rebase.outputs.rebased-count == 1
uses: peter-evans/create-or-update-comment@v1
with:
token: ${{ secrets.GITHUB_TOKEN }}
repository: ${{ github.event.client_payload.github.payload.repository.full_name }}
comment-id: ${{ github.event.client_payload.github.payload.comment.id }}
reaction-type: hooray
107 changes: 0 additions & 107 deletions .mergify.yml

This file was deleted.

0 comments on commit 3cfec95

Please sign in to comment.