View as Markdown

Migrate from Bulldozer to Mergify

Move from Bulldozer automerge to Mergify's Merge Queue for safer, faster merges.


Bulldozer focuses on automerging pull requests based on labels, reviews, and status checks. Mergify’s Merge Queue covers that and more, with automatic PR updates, prioritization, batching, and parallel checks.

This page shows a practical path to move from Bulldozer to Mergify’s Merge Queue.

  1. Keep your labels and branch protections as-is
  2. Set up a Mergify merge queue with conditions matching your Bulldozer config
  3. Start with a low-impact setup and expand gradually

Common Bulldozer config → Mergify Merge Queue

Section titled Common Bulldozer config → Mergify Merge Queue

Example Bulldozer snippet:

merge:
trigger:
labels: ["merge when ready"]
branch_patterns: ["feature/.*"]
method: squash
required_statuses:
- "ci/circleci: ete-tests"

Equivalent Mergify configuration:

.mergify.yml
merge_protections_settings:
auto_merge_conditions:
- or:
- label = merge when ready
- base ~= ^feature/
merge_protections:
- name: bulldozer-equivalent
if:
- or:
- label = merge when ready
- base ~= ^feature/
success_conditions:
- "check-success = ci/circleci: ete-tests"
queue_rules:
- name: default
merge_method: squash

Notes:

  • auto_merge_conditions is where Bulldozer’s trigger goes: a pull request that matches it is queued without anyone commenting @mergifyio queue. Set the field to true instead and every pull request is queued, including ones that match no merge protection rule. Those reach the queue gated by your branch protections and the queue’s own queue_conditions alone

  • Bulldozer merges a pull request that matches any one of its trigger entries, so they go under an or. Listed side by side, Mergify conditions must all match, which would queue only labeled pull requests that also target a feature/ branch

  • branches and branch_patterns match the branch a pull request targets, which Mergify calls base. Bulldozer matches each pattern against the whole branch name, while ~= matches anywhere in it, so anchor the regex: feature/.* becomes ^feature/, and branches: ["develop"] becomes base = develop

  • Bulldozer’s required_statuses become check-success = <name> conditions (or check-skipped, check-neutral) under success_conditions, where they gate both entry to the queue and the merge. Bulldozer checks them only on pull requests its trigger matches, so the rule’s if repeats the trigger

  • Required labels map to label = <name> conditions

  • Approvals map to review count or specific reviewers

  • The merge queue keeps PRs updated automatically, so no manual rebases are needed

Going Further with Merge Queue

Section titled Going Further with Merge Queue

Once you have basic automerge working, you can take advantage of features Bulldozer doesn’t offer:

  • Priorities: urgent PRs jump ahead in the queue

  • Batches: merge multiple PRs at once to reduce CI load

  • Parallel checks: test multiple queue entries simultaneously

  • Merge methods: squash/merge/rebase → supported via merge_method

  • Delete branch after merge → use GitHub’s “Automatically delete head branches” repository setting

  • Rebase/update before merge → automatic in merge queue

  • Require labels → label = in auto_merge_conditions to trigger the queue, or in success_conditions to require the label as a merge protection

  • Restrict by authors/paths → author =, files ~=, etc. in success_conditions or if

Was this page helpful?