Commit c16619c5 authored by Kamil Trzciński's avatar Kamil Trzciński

Merge branch 'mc/feature/custom-metrics-ce' into 'master'

Backport metrics report type

See merge request gitlab-org/gitlab-ce!26798
parents 29a53c4c 0cfa25ff
...@@ -98,20 +98,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo ...@@ -98,20 +98,7 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
end end
def test_reports def test_reports
result = @merge_request.compare_test_reports reports_response(@merge_request.compare_test_reports)
case result[:status]
when :parsing
Gitlab::PollingInterval.set_header(response, interval: 3000)
render json: '', status: :no_content
when :parsed
render json: result[:data].to_json, status: :ok
when :error
render json: { status_reason: result[:status_reason] }, status: :bad_request
else
render json: { status_reason: 'Unknown error' }, status: :internal_server_error
end
end end
def edit def edit
...@@ -353,4 +340,19 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo ...@@ -353,4 +340,19 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo
# Also see https://gitlab.com/gitlab-org/gitlab-ce/issues/42441 # Also see https://gitlab.com/gitlab-org/gitlab-ce/issues/42441
Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42438') Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42438')
end end
def reports_response(report_comparison)
case report_comparison[:status]
when :parsing
::Gitlab::PollingInterval.set_header(response, interval: 3000)
render json: '', status: :no_content
when :parsed
render json: report_comparison[:data].to_json, status: :ok
when :error
render json: { status_reason: report_comparison[:status_reason] }, status: :bad_request
else
render json: { status_reason: 'Unknown error' }, status: :internal_server_error
end
end
end end
...@@ -104,8 +104,8 @@ module Ci ...@@ -104,8 +104,8 @@ module Ci
where('NOT EXISTS (?)', Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').trace) where('NOT EXISTS (?)', Ci::JobArtifact.select(1).where('ci_builds.id = ci_job_artifacts.job_id').trace)
end end
scope :with_test_reports, ->() do scope :with_reports, ->(reports_scope) do
with_existing_job_artifacts(Ci::JobArtifact.test_reports) with_existing_job_artifacts(reports_scope)
.eager_load_job_artifacts .eager_load_job_artifacts
end end
......
...@@ -21,7 +21,8 @@ module Ci ...@@ -21,7 +21,8 @@ module Ci
container_scanning: 'gl-container-scanning-report.json', container_scanning: 'gl-container-scanning-report.json',
dast: 'gl-dast-report.json', dast: 'gl-dast-report.json',
license_management: 'gl-license-management-report.json', license_management: 'gl-license-management-report.json',
performance: 'performance.json' performance: 'performance.json',
metrics: 'metrics.txt'
}.freeze }.freeze
TYPE_AND_FORMAT_PAIRS = { TYPE_AND_FORMAT_PAIRS = {
...@@ -29,6 +30,7 @@ module Ci ...@@ -29,6 +30,7 @@ module Ci
metadata: :gzip, metadata: :gzip,
trace: :raw, trace: :raw,
junit: :gzip, junit: :gzip,
metrics: :gzip,
# All these file formats use `raw` as we need to store them uncompressed # All these file formats use `raw` as we need to store them uncompressed
# for Frontend to fetch the files and do analysis # for Frontend to fetch the files and do analysis
...@@ -88,7 +90,8 @@ module Ci ...@@ -88,7 +90,8 @@ module Ci
dast: 8, ## EE-specific dast: 8, ## EE-specific
codequality: 9, ## EE-specific codequality: 9, ## EE-specific
license_management: 10, ## EE-specific license_management: 10, ## EE-specific
performance: 11 ## EE-specific performance: 11, ## EE-specific
metrics: 12 ## EE-specific
} }
enum file_format: { enum file_format: {
......
...@@ -210,6 +210,10 @@ module Ci ...@@ -210,6 +210,10 @@ module Ci
where(source: branch_pipeline_sources).where(ref: ref, tag: false) where(source: branch_pipeline_sources).where(ref: ref, tag: false)
end end
scope :with_reports, -> (reports_scope) do
where('EXISTS (?)', ::Ci::Build.latest.with_reports(reports_scope).where('ci_pipelines.id=ci_builds.commit_id').select(1))
end
# Returns the pipelines in descending order (= newest first), optionally # Returns the pipelines in descending order (= newest first), optionally
# limited to a number of references. # limited to a number of references.
# #
...@@ -689,13 +693,13 @@ module Ci ...@@ -689,13 +693,13 @@ module Ci
@latest_builds_with_artifacts ||= builds.latest.with_artifacts_not_expired.to_a @latest_builds_with_artifacts ||= builds.latest.with_artifacts_not_expired.to_a
end end
def has_test_reports? def has_reports?(reports_scope)
complete? && builds.latest.with_test_reports.any? complete? && builds.latest.with_reports(reports_scope).exists?
end end
def test_reports def test_reports
Gitlab::Ci::Reports::TestReports.new.tap do |test_reports| Gitlab::Ci::Reports::TestReports.new.tap do |test_reports|
builds.latest.with_test_reports.each do |build| builds.latest.with_reports(Ci::JobArtifact.test_reports).each do |build|
build.collect_test_reports!(test_reports) build.collect_test_reports!(test_reports)
end end
end end
......
...@@ -1152,7 +1152,7 @@ class MergeRequest < ApplicationRecord ...@@ -1152,7 +1152,7 @@ class MergeRequest < ApplicationRecord
end end
def has_test_reports? def has_test_reports?
actual_head_pipeline&.has_test_reports? actual_head_pipeline&.has_reports?(Ci::JobArtifact.test_reports)
end end
def predefined_variables def predefined_variables
......
...@@ -11,7 +11,7 @@ module Gitlab ...@@ -11,7 +11,7 @@ module Gitlab
include ::Gitlab::Config::Entry::Validatable include ::Gitlab::Config::Entry::Validatable
include ::Gitlab::Config::Entry::Attributable include ::Gitlab::Config::Entry::Attributable
ALLOWED_KEYS = %i[junit codequality sast dependency_scanning container_scanning dast performance license_management].freeze ALLOWED_KEYS = %i[junit codequality sast dependency_scanning container_scanning dast performance license_management metrics].freeze
attributes ALLOWED_KEYS attributes ALLOWED_KEYS
...@@ -28,6 +28,7 @@ module Gitlab ...@@ -28,6 +28,7 @@ module Gitlab
validates :dast, array_of_strings_or_string: true validates :dast, array_of_strings_or_string: true
validates :performance, array_of_strings_or_string: true validates :performance, array_of_strings_or_string: true
validates :license_management, array_of_strings_or_string: true validates :license_management, array_of_strings_or_string: true
validates :metrics, array_of_strings_or_string: true
end end
end end
......
...@@ -166,8 +166,8 @@ describe Ci::Build do ...@@ -166,8 +166,8 @@ describe Ci::Build do
end end
end end
describe '.with_test_reports' do describe '.with_reports' do
subject { described_class.with_test_reports } subject { described_class.with_reports(Ci::JobArtifact.test_reports) }
context 'when build has a test report' do context 'when build has a test report' do
let!(:build) { create(:ci_build, :success, :test_reports) } let!(:build) { create(:ci_build, :success, :test_reports) }
......
...@@ -426,6 +426,26 @@ describe Ci::Pipeline, :mailer do ...@@ -426,6 +426,26 @@ describe Ci::Pipeline, :mailer do
end end
end end
describe '.with_reports' do
subject { described_class.with_reports(Ci::JobArtifact.test_reports) }
context 'when pipeline has a test report' do
let!(:pipeline_with_report) { create(:ci_pipeline, :with_test_reports) }
it 'selects the pipeline' do
is_expected.to eq([pipeline_with_report])
end
end
context 'when pipeline does not have metrics reports' do
let!(:pipeline_without_report) { create(:ci_empty_pipeline) }
it 'does not select the pipeline' do
is_expected.to be_empty
end
end
end
describe '.merge_request_event' do describe '.merge_request_event' do
subject { described_class.merge_request_event } subject { described_class.merge_request_event }
...@@ -2729,8 +2749,8 @@ describe Ci::Pipeline, :mailer do ...@@ -2729,8 +2749,8 @@ describe Ci::Pipeline, :mailer do
end end
end end
describe '#has_test_reports?' do describe '#has_reports?' do
subject { pipeline.has_test_reports? } subject { pipeline.has_reports?(Ci::JobArtifact.test_reports) }
context 'when pipeline has builds with test reports' do context 'when pipeline has builds with test reports' do
before do before do
......
...@@ -30,7 +30,7 @@ describe Ci::RetryBuildService do ...@@ -30,7 +30,7 @@ describe Ci::RetryBuildService do
job_artifacts_sast job_artifacts_dependency_scanning job_artifacts_sast job_artifacts_dependency_scanning
job_artifacts_container_scanning job_artifacts_dast job_artifacts_container_scanning job_artifacts_dast
job_artifacts_license_management job_artifacts_performance job_artifacts_license_management job_artifacts_performance
job_artifacts_codequality scheduled_at].freeze job_artifacts_codequality job_artifacts_metrics scheduled_at].freeze
IGNORE_ACCESSORS = IGNORE_ACCESSORS =
%i[type lock_version target_url base_tags trace_sections %i[type lock_version target_url base_tags trace_sections
......
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