Add Merge immediately option without interrupting merge train by API
Problem to Solve
In some software projects you might need merge trains enabled due to high velocity and ensuring continuity of your default branch. However, those projects might also integrate with other projects or service that need to keep some metadata in order for other systems (logs, changelogs, etc..) which are low risk of impacting the overall stability of your default branch.
Currently your only option is to merge immediately, which bypasses the merge train, but then interrupts the whole merge train and causes it to restart. If you have a need to keep this file up to date regularly, this makes it nearly impossible to receive the benefits from merge trains.
Proposal
An additional merge option could be specified that allows you to merge immediately without interrupting the merge train
. This would be similar to existing merge immediately
behavior, but wouldn't trigger the downstream impacts to merge trains.
Technical proposal
Skip the creation of new pipelines and the cancellation of the old ones in this particular case. The mergability check would use the existing pipeline rather than the new one.
-
implementation note:
MergeTrains::RefreshMergeRequestService
is responsible for creating and canceling pipelines via the methodcreate_pipeline!
which calls theMergeTrains::RefreshMergeRequestService
Make this available in the API only.
Acceptance Criteria
Make "skip the merge train but don't interrupt" only available based on an allowlist of files changed in a directory. Bypass the train for files outside of that list. Either way, the train could be considered representative of the files in the allowlist.
Other relevant information
- Cons of this approach is that it makes a trade off of "keeping main green" to manage a batched merge process (atomic merges)
- The current functionality of merge trains is to restart the merge train when a commit is merged immediately. In this case, we would want to not restart the merge train or rebase. Maybe there is a world where we can process the merge train and then as a final step rebase including the already merged commit.