Commit 9bcd2fd0 authored by Dylan Griffith's avatar Dylan Griffith

Merge branch 'merge-base-pipeline' into 'master'

Introduce MergeRequest#merge_base_pipeline for CodeQuality artifact comparison to merged results

See merge request gitlab-org/gitlab!44648
parents 50fea87b f5d33bc1
...@@ -1599,6 +1599,12 @@ class MergeRequest < ApplicationRecord ...@@ -1599,6 +1599,12 @@ class MergeRequest < ApplicationRecord
.find_by(sha: diff_base_sha, ref: target_branch) .find_by(sha: diff_base_sha, ref: target_branch)
end end
def merge_base_pipeline
@merge_base_pipeline ||= project.ci_pipelines
.order(id: :desc)
.find_by(sha: actual_head_pipeline.target_sha, ref: target_branch)
end
def discussions_rendered_on_frontend? def discussions_rendered_on_frontend?
true true
end end
......
...@@ -120,7 +120,11 @@ class MergeRequestWidgetEntity < Grape::Entity ...@@ -120,7 +120,11 @@ class MergeRequestWidgetEntity < Grape::Entity
end end
expose :base_path do |merge_request| expose :base_path do |merge_request|
base_pipeline_downloadable_path_for_report_type(:codequality) if use_merge_base_with_merged_results?
merge_base_pipeline_downloadable_path_for_report_type(:codequality)
else
base_pipeline_downloadable_path_for_report_type(:codequality)
end
end end
end end
...@@ -156,6 +160,16 @@ class MergeRequestWidgetEntity < Grape::Entity ...@@ -156,6 +160,16 @@ class MergeRequestWidgetEntity < Grape::Entity
object.base_pipeline&.present(current_user: current_user) object.base_pipeline&.present(current_user: current_user)
&.downloadable_path_for_report_type(file_type) &.downloadable_path_for_report_type(file_type)
end end
def use_merge_base_with_merged_results?
Feature.enabled?(:merge_base_pipelines, object.target_project) &&
object.actual_head_pipeline&.merge_request_event_type == :merged_result
end
def merge_base_pipeline_downloadable_path_for_report_type(file_type)
object.merge_base_pipeline&.present(current_user: current_user)
&.downloadable_path_for_report_type(file_type)
end
end end
MergeRequestWidgetEntity.prepend_if_ee('EE::MergeRequestWidgetEntity') MergeRequestWidgetEntity.prepend_if_ee('EE::MergeRequestWidgetEntity')
---
name: merge_base_pipelines
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/44648
rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/263724
type: development
group: group::testing
default_enabled: false
...@@ -3520,6 +3520,25 @@ RSpec.describe MergeRequest, factory_default: :keep do ...@@ -3520,6 +3520,25 @@ RSpec.describe MergeRequest, factory_default: :keep do
end end
end end
describe '#merge_base_pipeline' do
let(:merge_request) do
create(:merge_request, :with_merge_request_pipeline)
end
let(:merge_base_pipeline) do
create(:ci_pipeline, ref: merge_request.target_branch, sha: merge_request.target_branch_sha)
end
before do
merge_base_pipeline
merge_request.update_head_pipeline
end
it 'returns a pipeline pointing to a commit on the target ref' do
expect(merge_request.merge_base_pipeline).to eq(merge_base_pipeline)
end
end
describe '#has_commits?' do describe '#has_commits?' do
it 'returns true when merge request diff has commits' do it 'returns true when merge request diff has commits' do
allow(subject.merge_request_diff).to receive(:commits_count) allow(subject.merge_request_diff).to receive(:commits_count)
......
...@@ -88,25 +88,53 @@ RSpec.describe MergeRequestWidgetEntity do ...@@ -88,25 +88,53 @@ RSpec.describe MergeRequestWidgetEntity do
end end
describe 'codequality report artifacts', :request_store do describe 'codequality report artifacts', :request_store do
let(:merge_base_pipeline) { create(:ci_pipeline, :with_codequality_report, project: project) }
before do before do
project.add_developer(user) project.add_developer(user)
allow(resource).to receive_messages( allow(resource).to receive_messages(
merge_base_pipeline: merge_base_pipeline,
base_pipeline: pipeline, base_pipeline: pipeline,
head_pipeline: pipeline head_pipeline: pipeline
) )
end end
context "with report artifacts" do context 'with report artifacts' do
let(:pipeline) { create(:ci_pipeline, :with_codequality_report, project: project) } let(:pipeline) { create(:ci_pipeline, :with_codequality_report, project: project) }
let(:generic_job_id) { pipeline.builds.first.id }
let(:merge_base_job_id) { merge_base_pipeline.builds.first.id }
it 'has head_path and base_path entries' do
expect(subject[:codeclimate][:head_path]).to be_present
expect(subject[:codeclimate][:base_path]).to be_present
end
context 'on pipelines for merged results' do
let(:pipeline) { create(:ci_pipeline, :merged_result_pipeline, :with_codequality_report, project: project) }
context 'with merge_base_pipelines enabled' do
it 'returns URLs from the head_pipeline and merge_base_pipeline' do
expect(subject[:codeclimate][:head_path]).to include("/jobs/#{generic_job_id}/artifacts/download?file_type=codequality")
expect(subject[:codeclimate][:base_path]).to include("/jobs/#{merge_base_job_id}/artifacts/download?file_type=codequality")
end
end
context 'with merge_base_pipelines disabled' do
before do
stub_feature_flags(merge_base_pipelines: false)
end
it "has data entry" do it 'returns URLs from the head_pipeline and base_pipeline' do
expect(subject).to include(:codeclimate) expect(subject[:codeclimate][:head_path]).to include("/jobs/#{generic_job_id}/artifacts/download?file_type=codequality")
expect(subject[:codeclimate][:base_path]).to include("/jobs/#{generic_job_id}/artifacts/download?file_type=codequality")
end
end
end end
end end
context "without artifacts" do context 'without artifacts' do
it "does not have data entry" do it 'does not have data entry' do
expect(subject).not_to include(:codeclimate) expect(subject).not_to include(:codeclimate)
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment