Better Pull Request Management with Custom Labels
GitHub has some neat features for managing pull requests, but sometimes it’s tough to quickly get a high-level status for each request.
To improve this workflow, we’ve implemented a custom labeling pattern for pull requests on some of our code repos.
Using GitHub Labels, we mark the state each PR is in, so that it’s clear where the Pull Request is at in its flow.
The Main Flow
Almost all PRs move through the following cycle:
- Code added/updated, needs review
- Code reviewed, needs update
- Repeat as necessary until good to merge
We mark where the PR is in the cycle with the following labels:
PR: Needs Review
After opening a Pull Request, you’ll likely want someone to review it. Mark it with the PR: Needs Review
label to identify to others on your team that your PR is ready for review.
PR: Reviewed w/ Comments
After the initial review, most PRs are left with a few comments/questions about the changes. As a cue to the original author that you’ve passed through the changes and have finished your thoughts, the reviewer removes the PR: Needs Review
label (if applicable) and adds PR: Reviewed w/Comments
.
Next, the submitter responds to the comments and updates the code as necessary. They then begin the cycle again by adding PR: Needs Review
and removing PR: Reviewed w/ Comments
.
PR: Good to Merge
At some point, the PR should be good to go. To help avoid any ambiguity in state, the reviewer should mark the PR as PR: Good to Merge
. This lets the author know that their code is fully accepted by the team.
After merging, the labels can be left as is. The Pull Request is complete and won’t need updating again.
Other Scenarios
There are a few special cases that deserve their own label. They don’t come up as often, but are good to have around when needed.
PR: Needs Manual Merge
Sometimes PRs get out of date with the main branch and need a manual merge. GitHub will let you know this by greying out the “Merge” button, but it can be helpful to mark this via a label so the team can easily know the status of the PR.
PR: Merge on CICD Pass
For small PRs, or PRs reviewed and small updates applied, there are times when the code has been reviewed but the CICD task hasn’t completed yet. A reviewer can mark the PR as good to merge with the condition that the build passes by using the PR: Merge on CICD Pass
label.
DO NOT MERGE
There are times when you have some experimental work in the form of a PR that you’d like to open up for review. Ensure it doesn’t accidentally get merged in by adding the DO NOT MERGE
label. While this doesn’t disable the “Merge” button, it should be a red flag to anyone reviewing the code not to merge it in.
On Hold/Work in Progress
For when you want to put some future functionality out there for review, or an unexpected blocker arises during the PR process, or you just need to wait until another PR goes through, the On Hold
and Work in Progress
labels help reviewers know the status of a PR that isn’t progressing in the workflow.
Using this label is helpful in avoiding review fatigue, where PRs seem to die out unexpectedly. At least now if they die out, reviewers aren’t left wondering the state of the PR. They know to just let it sit until time is found to continue work on the PR, or the PR is closed without merge because circumstances changed.
Similar to the “DO NOT MERGE” label, you can also update the title of the PR to be extra clear of its current state.
Challenges
There are two major challenges with this system:
- Newcomers won’t be familiar with the convention and may not follow the steps. It usually doesn’t take much effort to get everyone up to speed, but it can be confusing when people forget to update the label.
- The labels have to be manually added to every Github repo, as the defaults aren’t configurable. It’s tedious to take this step when you’re just trying out a new idea and also makes it difficult to validate the convention is being followed across all repos.
One way to overcome both of these drawbacks would be to add a PR Review bot, which would help set up and enforce the labelling. Something similar to MentionBot. In fact, this is something we hope to look at in the near future using the Github API.
There’s certainly always room for improvement, but using this pattern for our PRs has already paid off. Give it a shot and let us know if there are any labels you think we should add to our bucket.