Merge branch 'dm-fix-pipeline-creation-race-condition' into 'master'

Fix race condition between pipeline creation and MR diff_head_sha update

Closes #33219

See merge request !11859
This commit is contained in:
Kamil Trzciński 2017-06-01 20:36:59 +00:00
commit b92e3d7464
3 changed files with 9 additions and 14 deletions

View File

@ -63,13 +63,10 @@ module Ci
private
def update_merge_requests_head_pipeline
merge_requests = MergeRequest.where(source_branch: @pipeline.ref, source_project: @pipeline.project)
return unless pipeline.latest?
merge_requests = merge_requests.select do |mr|
mr.diff_head_sha == @pipeline.sha
end
MergeRequest.where(id: merge_requests).update_all(head_pipeline_id: @pipeline.id)
MergeRequest.where(source_project: @pipeline.project, source_branch: @pipeline.ref).
update_all(head_pipeline_id: @pipeline.id)
end
def skip_ci?

View File

@ -30,15 +30,12 @@ module MergeRequests
def head_pipeline_for(merge_request)
return unless merge_request.source_project
sha = merge_request.source_branch_head&.id
sha = merge_request.source_branch_sha
return unless sha
pipelines =
Ci::Pipeline.where(ref: merge_request.source_branch, project_id: merge_request.source_project.id, sha: sha).
order(id: :desc)
pipelines = merge_request.source_project.pipelines.where(ref: merge_request.source_branch, sha: sha)
pipelines.first
pipelines.order(id: :desc).first
end
end
end

View File

@ -72,10 +72,11 @@ describe Ci::CreatePipelineService, services: true do
end
end
context 'when merge request head commit sha does not match pipeline sha' do
context 'when the pipeline is not the latest for the branch' do
it 'does not update merge request head pipeline' do
merge_request = create(:merge_request, source_branch: 'master', target_branch: "branch_1", source_project: project)
allow_any_instance_of(MergeRequestDiff).to receive(:head_commit).and_return(double(id: 1234))
allow_any_instance_of(Ci::Pipeline).to receive(:latest?).and_return(false)
pipeline