Automerge your Scala Steward pull-requests
If you code in Scala, it is likely that you use Scala Steward to keep your dependencies up-to-date. But merging all the pull-requests it generates is tiring. This blog post tries to solve that.
As a note, the following instructions only work if you store your codebase in Github. Which is a safe bet, nowadays. If you use Gitlab or another system, you need to adapt the instructions to your platform.
Prerequisites
You need Administrator access to the repository. You need to tweak some settings in Github to allow for the automation,
An associated Github App, for your repository or organisation, must exist. To create one, follow steps 1 to 4 from these instructions. You don’t need to configure Scala Steward at this point. We provide the configuration required later on. But the secrets must exist in the repository.
Finally, you need an existing Github action that builds your project. This must be set up to build any pull-request created in the project. Without it, we can’t know if a library upgrade breaks the codebase and if we can merge it.
Repository Settings
To start with, we need to change some settings in the repository.
Go to Settings
and, in the General
tab, scroll down to he Pull Request
section. Make sure to select both Allow Auto-merge
, and Automatically delete head branches
. If you see some options greyed out, that may be because you have an organisation that is using the free plan. In this case, you can’t enable auto-merge until you upgrade to a paid plan, sorry.
In Settings
, go to the Branches
section and create a new Branch protection rule
. Select your main
branch as the target, or a branch where you usually merge your pull-requests. Then, select the following options:
Require a pull request before merging
andRequire approvals
(set to 1) . AlsoDismiss stale pull requests approvals
Require status checks to pass before merging
. In the search box, find the Github action that builds your project. KeepRequire branches to be up to date
disabled.
Workflows
Save the changes to your repository settings. Now you need to add the following three workflows to your repository. You can copy the contents into the indicated files.
File: autoapprove.yaml
name: Auto approve
on: pull_request
jobs:
auto-approve:
runs-on: ubuntu-latest
permissions:
pull-requests: write
if: startsWith(github.head_ref, 'update/')
steps:
- uses: hmarr/auto-approve-action@v3
File: automerge.yml
name: Auto-merge
on: pull_request
jobs:
automerge:
runs-on: ubuntu-latest
if: startsWith(github.head_ref, 'update/')
steps:
- name: Generate token
id: generate-token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- uses: peter-evans/enable-pull-request-automerge@v2
with:
pull-request-number: ${{ github.event.pull_request.number }}
merge-method: rebase
token: ${{ steps.generate-token.outputs.token }}
File: scala-steward.yml
# This workflow will launch at 7:00 am (UTC) each night
on:
schedule:
- cron: '0 7 * * *'
workflow_dispatch:
name: Scala Steward
jobs:
scala-steward:
runs-on: ubuntu-latest
name: Launch Scala Steward
steps:
- name: Generate token
id: generate-token
uses: tibdex/github-app-token@v1
with:
app_id: ${{ secrets.APP_ID }}
private_key: ${{ secrets.APP_PRIVATE_KEY }}
- name: Launch Scala Steward
uses: scala-steward-org/[email protected]
with:
github-token: ${{ steps.generate-token.outputs.token }}
author-name: scala-steward
author-email: [email protected]
other-args: '--add-labels'
Commit and push the files, and you are ready to test this.
Go to Actions
in your repository, select Scala Steward
, and click on run workflow
. Run it against the main
branch (or your corresponding branch). Once Scala Steward finishes, check your current pull-requests. You can open any new pull-request created, and see the build process and approvals. Once the build step finishes successfully, it will be merged. If a build fails, it will not be merged.
That’s all for now, I hope this was informative and useful. As always, feedback via Mastodon/Email is more than welcome. Cheers!