A github bot for merging & updating pull requests with a label.
This bot can merge and keep your branches up to date with the latest changes from base (master/main).
Place merge-with-label.yml
in .github
repository:
version: 1
merge:
# specify a list of labels that indicate whether a pull request is eligible
# for merging (regex)
# (or-list, only one label must be present on a pull request)
# (leave empty to disable the merge feature)
labels:
- "merge"
# strategy to merge (can be "commit", "squash" or "rebase")
strategy: "squash"
# amount of required approvals before merging
#requiredApprovals: 1
# specify a list of users that are required for review (regex)
# (and-list, all users need to approve)
#requireApprovalsFrom:
# -
# names of the checks that are need to pass before merging (regex)
# (and-list, all checks need to pass)
requiredChecks:
- ".*"
# require a linear history
requireLinearHistory: false
# delete branch after merging
deleteBranch: true
# never merge pull requests that were created by these users (regex)
#ignoreFromUsers:
# - "dependabot"
# never merge pull requests that match one of these titles (regex)
#ignoreWithTitles:
# - "chore:.+"
# never update pull requests that match one of these labels (regex)
#ignoreWithLabels:
# - "dont-merge"
update:
# specify a list of labels that indicate whether a pull request is eligible
# for updating (regex)
# (or-list, only one label must be present on a pull request)
# (leave empty to disable the update feature)
labels:
- "update-branch"
# never update pull requests that were created by these users (regex)
ignoreFromUsers:
- "dependabot"
# never update pull requests that match one of these titles (regex)
#ignoreWithTitles:
# - "chore:.+"
# never update pull requests that match one of these titles (regex)
#ignoreWithTitles:
# - "chore:.+"
# never update pull requests that match one of these labels (regex)
#ignoreWithLabels:
# - "dont-update"
-
Create a new github app with following permissions & events
Permission Level Actions Read Checks Read and write Commit statuses Read-Only Contents Read and write Metadata Read-Only Pull requests Read and write Workflows Read and write - Check run
- Pull request
- Pull request review
- Push
- Status
-
Create a private key and save it
-
Note down the app id
-
Spin up the instance somewhere using
docker compose
version: '3.9' services: nats: image: nats:2.9.20 restart: unless-stopped command: ["--js", "-user", "nats", "-pass", "425751fd-62e2-4b73-9e1b-5a9b0dafc5ad"] server: image: ghcr.io/eun/merge-with-label:latest restart: unless-stopped command: "server" ports: - "8000:8000" environment: PORT: 8000 NATS_URL: nats://nats:425751fd-62e2-4b73-9e1b-5a9b0dafc5ad@nats:4222 depends_on: - nats worker: image: ghcr.io/eun/merge-with-label:latest restart: unless-stopped command: "worker" volumes: - "./private-key.pem:/private-key.pem:ro" environment: NATS_URL: nats://nats:425751fd-62e2-4b73-9e1b-5a9b0dafc5ad@nats:4222 APP_ID: <your app id> PRIVATE_KEY: /private-key.pem depends_on: - server
Make sure you fill in your app id, provide the private-key.pem file and modify the nats username and password
-
Point the webhook url to the deployment
Following environment variables are available
Variable | Default Value |
---|---|
AllowedRepositories |
.* |
AllowOnlyPublicRepositories |
false |
BotName |
merge-with-label |
StreamName |
mwl_bot_events |
PullRequestSubject |
pull_request |
PushSubject |
push |
MessageRetryAttempts |
5 |
MessageRetryWait |
15s |
RateLimitBucketName |
mwl_rate_limit |
RateLimitBucketTTL |
24h |
RateLimitInterval |
30s |
AccessTokensBucketName |
mwl_access_tokens |
AccessTokensBucketTTL |
24h |
ConfigsBucketName |
mwl_configs |
ConfigsBucketTTL |
24h |
CheckRunsBucketName |
mwl_check_runs |
CheckRunsBucketTTL |
10m |
DurationBeforeMergeAfterCheck |
10s |
DurationToWaitAfterUpdateBranch |
30s |
MaxMessageAge |
10m |
MessageChannelSizePerSubject |
64 |
Additionally, you can enable debug logging by setting the
DEBUG
environment variable totrue
.