Skip to content
Snippets Groups Projects
Commit 197a3d05 authored by Shinya Maeda's avatar Shinya Maeda
Browse files

Introduce sidekiq worker for auto merge process

As we have a central domain for auto merge process today,
we should use a single worker for any auto merge process.
parent 9a9c947b
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -166,6 +166,16 @@ module Ci
end
end
 
after_transition any => ::Ci::Pipeline.completed_statuses do |pipeline|
pipeline.run_after_commit do
pipeline.all_merge_requests.each do |merge_request|
next unless merge_request.auto_merge_enabled?
AutoMergeProcessWorker.perform_async(merge_request.id)
end
end
end
after_transition any => [:success, :failed] do |pipeline|
pipeline.run_after_commit do
PipelineNotificationWorker.perform_async(pipeline.id)
Loading
Loading
---
- auto_devops:auto_devops_disable
 
- auto_merge:auto_merge_process
- cronjob:admin_email
- cronjob:expire_build_artifacts
- cronjob:gitlab_usage_ping
Loading
Loading
# frozen_string_literal: true
class AutoMergeProcessWorker
include ApplicationWorker
queue_namespace :auto_merge
def perform(merge_request_id)
MergeRequest.find_by_id(merge_request_id).try do |merge_request|
AutoMergeService.new(merge_request.project, merge_request.merge_user)
.process(merge_request)
end
end
end
Loading
Loading
@@ -6,14 +6,7 @@ class PipelineSuccessWorker
 
queue_namespace :pipeline_processing
 
# rubocop: disable CodeReuse/ActiveRecord
def perform(pipeline_id)
Ci::Pipeline.find_by(id: pipeline_id).try do |pipeline|
pipeline.all_merge_requests.preload(:merge_user).each do |merge_request|
AutoMergeService.new(pipeline.project, merge_request.merge_user)
.process(merge_request)
end
end
# no-op
end
# rubocop: enable CodeReuse/ActiveRecord
end
Loading
Loading
@@ -30,6 +30,7 @@
- [pipeline_default, 3]
- [pipeline_cache, 3]
- [deployment, 3]
- [auto_merge, 3]
- [pipeline_hooks, 2]
- [gitlab_shell, 2]
- [email_receiver, 2]
Loading
Loading
Loading
Loading
@@ -1381,6 +1381,40 @@ describe Ci::Pipeline, :mailer do
end
end
 
describe 'auto merge' do
let(:merge_request) { create(:merge_request, :merge_when_pipeline_succeeds) }
let(:pipeline) do
create(:ci_pipeline, :running, project: merge_request.source_project,
ref: merge_request.source_branch,
sha: merge_request.diff_head_sha)
end
before do
merge_request.update_head_pipeline
end
%w[succeed! drop! cancel! skip!].each do |action|
context "when the pipeline recieved #{action} event" do
it 'performs AutoMergeProcessWorker' do
expect(AutoMergeProcessWorker).to receive(:perform_async).with(merge_request.id)
pipeline.public_send(action)
end
end
end
context 'when auto merge is not enabled in the merge request' do
let(:merge_request) { create(:merge_request) }
it 'performs AutoMergeProcessWorker' do
expect(AutoMergeProcessWorker).not_to receive(:perform_async)
pipeline.succeed!
end
end
end
def create_build(name, *traits, queued_at: current, started_from: 0, **opts)
create(:ci_build, *traits,
name: name,
Loading
Loading
Loading
Loading
@@ -2,25 +2,29 @@
 
require 'spec_helper'
 
describe PipelineSuccessWorker do
describe AutoMergeProcessWorker do
describe '#perform' do
context 'when pipeline exists' do
let(:pipeline) { create(:ci_pipeline, status: 'success', ref: merge_request.source_branch, project: merge_request.source_project) }
subject { described_class.new.perform(merge_request&.id) }
context 'when merge request is found' do
let(:merge_request) { create(:merge_request) }
 
it 'performs "merge when pipeline succeeds"' do
it 'executes AutoMergeService' do
expect_next_instance_of(AutoMergeService) do |auto_merge|
expect(auto_merge).to receive(:process)
end
 
described_class.new.perform(pipeline.id)
subject
end
end
 
context 'when pipeline does not exist' do
it 'does not raise exception' do
expect { described_class.new.perform(123) }
.not_to raise_error
context 'when merge request is not found' do
let(:merge_request) { nil }
it 'does not execute AutoMergeService' do
expect(AutoMergeService).not_to receive(:new)
subject
end
end
end
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment