Recipes

Work In Progress

Prevent accidental merging of Pull Requests that are work in progress by labeling it WIP or prefixing the title with the abbreviation.

version: 2
mergeable:
  - when: pull_request.*
    validate:
      - do: title
        must_exclude:
          regex: ^\[WIP\]
      - do: label
        must_exclude:
          regex: 'wip'

No Empty Description

Ensure all Pull Requests have a description so that reviewers have context.

version: 2
mergeable:
  - when: pull_request.*
    validate:
      - do: description
        no_empty:
          enabled: true
          message: Description matter and should not be empty. Provide detail with **what** was changed, **why** it was changed, and **how** it was changed.

Dependent Files

Certain files are related and you want to ensure that they are updated as part of the PR (i.e. if package.json is updated, so should yarn.lock and package-lock.json)

version: 2
mergeable:
  - when: pull_request.*
    validate:
      - do: dependent
        changed:
          file: 'package.json'  # also supports globs expressions
          required: ['package-lock.json', 'yarn.lock'] # alias: `files` for backward compatibility

Must Include Milestone

Ensure that all Pull Requests have a milestone associated. Mergeable will also detect when you are `closing an issue<https://help.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue>`_ that is associated with the specified milestone.

version: 2
mergeable:
  - when: pull_request.*
    validate:
      - do: milestone
        must_include:
          regex: Release 1

Small PR Size

Size: Ensure that PRs don’t exceed a certain size in terms of lines changed (excluding file patterns specified with ignore).

version: 2
mergeable:
  - when: pull_request.*
    validate:
      - do: size
        ignore: ['ignore_me.js', 'ignore_this_directory/*', '**/ignore_this_prefix*.js']
        lines:
          max:
            count: 500
            message: Change is very large. Should be under 500 lines of addtions and deletions.

Comment If Guidelines not met

Automatically create a comment when a new issue is openened to remind the author when the title does not follow conventions or is missing a label.

version: 2
mergeable:
  - when: issues.opened
    validate:
      - do: title
        begins_with:
          match: ['AUTH', 'SOCIAL', 'CORE']
      - do: label
        must_include:
          regex: bug|enhancement
    fail:
      - do: comment
        payload:
          body: >
            The following problems were found with this issue:
              - Title must begin with `AUTH`, `SOCIAL` or `CORE`
              - The issue should either be labeled `bug` or `enhancement`

Check Stale PR and Issues

Detect issues and pull requests that are n days old (stale) and notify authors and collaborators by creating a comment.

version: 2
mergeable:
  - when: schedule.repository
    validate:
      - do: stale
        days: 20
        type: pull_request, issues
    pass:
      - do: comment
        payload:
          body: This is old. Is it still relevant?

Greet a new contributor

Add a comment on a pull request when it is created

version: 2
mergeable:
  - when: pull_request.opened
    name: "Greet a contributor"
    validate: []
    pass:
      - do: comment
        payload:
          body: >
            Thanks for creating a pull request! A maintainer will review your changes shortly. Please don't be discouraged if it takes a while.

Auto-merge pull requests once all checks pass

This recipe relies on the fact that the main branch has been protected and only allows merges when the required checks have passed or the required number of reviews/other conditions are met. This basically means that mergeable will merge the pull request as soon as it shows a green merged button on Github.

Notice the blank validator which ensures that the merge event happens as soon as Github allows mergeable to merge the pull request.

version: 2
mergeable:
  - when: pull_request.*, pull_request_review.*, status.*, check_suite.*
    name: "Automatically merge pull requests once it passes all checks"
    validate: []
    pass:
      - do: merge
        merge_method: "squash"

Approval check + title check if certain files are changed

Add 2 checks to the PR 1. Approval check - Checks whether the PR has been approved by certain people 2. Title should match a regex if certain files are changed. If no changes are made in those files, check should pass

version: 2
mergeable:
  - when: pull_request.*, pull_request_review.*
    name: 'Approval check'
    validate:
      - do: approvals
        min:
          count: 1
        limit:
          users: [ 'approverA', 'approverB' ]

  - when: pull_request.*, pull_request_review.*
    name: 'PR title check'
    validate:
      - do: or
        validate:
          - do: changeset
            must_exclude:
              regex: 'some/regex/for/those/certain/files/*'
          - do: and
            validate:
              - do: changeset
                must_include:
                  regex: 'some/regex/for/those/certain/files/*'
              - do: title
                begins_with:
                  match: [ 'some prefix' ]

Only run rules if PR is not a draft

Checks that the PR’s draft state is false before running actions.

version: 2
mergeable:
  - when: pull_request.*, pull_request_review.*
    name: 'Draft check'
    validate:
      - do: payload
        pull_request:
          draft:
            boolean:
              match: false
    pass:
      - do: comment
        payload:
          body: This PR is NOT a draft!
    fail:
      - do: comment
        payload:
          body: This PR is STILL a draft!

Allow commits only if they contain a Issue ID (like an Azure DevOps Work Item)

Checks that the PR’s draft state is false before running actions.

version: 2
mergeable:
  - when: pull_request.*
    validate:
      - do: commit
        message:
            regex: '^(AB#[0-9]{1,})' #check if all commit messages begin with an AzDO Work Item
    pass:
      - do: comment
        payload:
          body: >
           <h2>Successfully checked for Azure Work Item IDs in commits</h2>
           <h3>All commits in your PR have Azure Board Work Item IDs. Ready for Review!</h3>
           :+1:
      - do: labels
        add: 'Ready for Review'
    fail:
      - do: comment
        payload:
          body: >
            :warning:
            <h2>Azure Boards Work Item IDs missing in commits</h2>
            <h3>Some commits messages were found not having the Azure Boards Work Item ID (AB#1234).</h3>
            <h3>We will close this PR for now.</h3>
            <h3>To resolve, please do one of the following</h3>
            <ul>
              <li>Identify your Azure Boards Work Item ID and <a href="https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4">amend your commits</a>. Then re-open the PR</li>
              <li>In case you do not have a Work Item ID to reference, please discuss with your reviewer(s) for alternate options</li>
            </ul>
      - do: labels
        add: 'Non-Compliant'
      - do: close