Merge branch '7125-refactor-code-quality-similar-to-junit-tests-ce' into 'master'
CE Resolve "Refactor code quality similar to JUnit tests" See merge request gitlab-org/gitlab-ce!21932
This commit is contained in:
commit
cfc72c126e
12 changed files with 79 additions and 8 deletions
|
@ -14,6 +14,8 @@ class Projects::ArtifactsController < Projects::ApplicationController
|
||||||
before_action :entry, only: [:file]
|
before_action :entry, only: [:file]
|
||||||
|
|
||||||
def download
|
def download
|
||||||
|
return render_404 unless artifacts_file
|
||||||
|
|
||||||
send_upload(artifacts_file, attachment: artifacts_file.filename)
|
send_upload(artifacts_file, attachment: artifacts_file.filename)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -100,7 +102,7 @@ class Projects::ArtifactsController < Projects::ApplicationController
|
||||||
# rubocop: enable CodeReuse/ActiveRecord
|
# rubocop: enable CodeReuse/ActiveRecord
|
||||||
|
|
||||||
def artifacts_file
|
def artifacts_file
|
||||||
@artifacts_file ||= build.artifacts_file
|
@artifacts_file ||= build.artifacts_file_for_type(params[:file_type] || :archive)
|
||||||
end
|
end
|
||||||
|
|
||||||
def entry
|
def entry
|
||||||
|
|
|
@ -522,6 +522,13 @@ module Ci
|
||||||
self.job_artifacts.update_all(expire_at: nil)
|
self.job_artifacts.update_all(expire_at: nil)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def artifacts_file_for_type(type)
|
||||||
|
file = job_artifacts.find_by(file_type: Ci::JobArtifact.file_types[type])&.file
|
||||||
|
# TODO: to be removed once legacy artifacts is removed
|
||||||
|
file ||= legacy_artifacts_file if type == :archive
|
||||||
|
file
|
||||||
|
end
|
||||||
|
|
||||||
def coverage_regex
|
def coverage_regex
|
||||||
super || project.try(:build_coverage_regex)
|
super || project.try(:build_coverage_regex)
|
||||||
end
|
end
|
||||||
|
|
|
@ -15,6 +15,7 @@ module Ci
|
||||||
metadata: nil,
|
metadata: nil,
|
||||||
trace: nil,
|
trace: nil,
|
||||||
junit: 'junit.xml',
|
junit: 'junit.xml',
|
||||||
|
codequality: 'codequality.json',
|
||||||
sast: 'gl-sast-report.json',
|
sast: 'gl-sast-report.json',
|
||||||
dependency_scanning: 'gl-dependency-scanning-report.json',
|
dependency_scanning: 'gl-dependency-scanning-report.json',
|
||||||
container_scanning: 'gl-container-scanning-report.json',
|
container_scanning: 'gl-container-scanning-report.json',
|
||||||
|
@ -26,6 +27,7 @@ module Ci
|
||||||
metadata: :gzip,
|
metadata: :gzip,
|
||||||
trace: :raw,
|
trace: :raw,
|
||||||
junit: :gzip,
|
junit: :gzip,
|
||||||
|
codequality: :gzip,
|
||||||
sast: :gzip,
|
sast: :gzip,
|
||||||
dependency_scanning: :gzip,
|
dependency_scanning: :gzip,
|
||||||
container_scanning: :gzip,
|
container_scanning: :gzip,
|
||||||
|
@ -73,7 +75,8 @@ module Ci
|
||||||
sast: 5, ## EE-specific
|
sast: 5, ## EE-specific
|
||||||
dependency_scanning: 6, ## EE-specific
|
dependency_scanning: 6, ## EE-specific
|
||||||
container_scanning: 7, ## EE-specific
|
container_scanning: 7, ## EE-specific
|
||||||
dast: 8 ## EE-specific
|
dast: 8, ## EE-specific
|
||||||
|
codequality: 9 ## EE-specific
|
||||||
}
|
}
|
||||||
|
|
||||||
enum file_format: {
|
enum file_format: {
|
||||||
|
|
|
@ -11,7 +11,7 @@ module Gitlab
|
||||||
include Validatable
|
include Validatable
|
||||||
include Attributable
|
include Attributable
|
||||||
|
|
||||||
ALLOWED_KEYS = %i[junit sast dependency_scanning container_scanning dast].freeze
|
ALLOWED_KEYS = %i[junit codequality sast dependency_scanning container_scanning dast].freeze
|
||||||
|
|
||||||
attributes ALLOWED_KEYS
|
attributes ALLOWED_KEYS
|
||||||
|
|
||||||
|
@ -21,6 +21,7 @@ module Gitlab
|
||||||
|
|
||||||
with_options allow_nil: true do
|
with_options allow_nil: true do
|
||||||
validates :junit, array_of_strings_or_string: true
|
validates :junit, array_of_strings_or_string: true
|
||||||
|
validates :codequality, array_of_strings_or_string: true
|
||||||
validates :sast, array_of_strings_or_string: true
|
validates :sast, array_of_strings_or_string: true
|
||||||
validates :dependency_scanning, array_of_strings_or_string: true
|
validates :dependency_scanning, array_of_strings_or_string: true
|
||||||
validates :container_scanning, array_of_strings_or_string: true
|
validates :container_scanning, array_of_strings_or_string: true
|
||||||
|
|
|
@ -19,10 +19,42 @@ describe Projects::ArtifactsController do
|
||||||
end
|
end
|
||||||
|
|
||||||
describe 'GET download' do
|
describe 'GET download' do
|
||||||
it 'sends the artifacts file' do
|
subject { get :download, namespace_id: project.namespace, project_id: project, job_id: job, file_type: file_type }
|
||||||
expect(controller).to receive(:send_file).with(job.artifacts_file.path, hash_including(disposition: 'attachment')).and_call_original
|
|
||||||
|
|
||||||
get :download, namespace_id: project.namespace, project_id: project, job_id: job
|
context 'when no file type is supplied' do
|
||||||
|
let(:file_type) { nil }
|
||||||
|
|
||||||
|
it 'sends the artifacts file' do
|
||||||
|
expect(controller).to receive(:send_file).with(job.artifacts_file.path, hash_including(disposition: 'attachment')).and_call_original
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when a file type is supplied' do
|
||||||
|
context 'when an invalid file type is supplied' do
|
||||||
|
let(:file_type) { 'invalid' }
|
||||||
|
|
||||||
|
it 'returns 404' do
|
||||||
|
subject
|
||||||
|
|
||||||
|
expect(response).to have_gitlab_http_status(404)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when codequality file type is supplied' do
|
||||||
|
let(:file_type) { 'codequality' }
|
||||||
|
|
||||||
|
before do
|
||||||
|
create(:ci_job_artifact, :codequality, job: job)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sends the codequality report' do
|
||||||
|
expect(controller).to receive(:send_file).with(job.job_artifacts_codequality.file.path, hash_including(disposition: 'attachment')).and_call_original
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,16 @@ FactoryBot.define do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
trait :codequality do
|
||||||
|
file_type :codequality
|
||||||
|
file_format :gzip
|
||||||
|
|
||||||
|
after(:build) do |artifact, evaluator|
|
||||||
|
artifact.file = fixture_file_upload(
|
||||||
|
Rails.root.join('spec/fixtures/codequality/codequality.json.gz'), 'application/x-gzip')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
trait :correct_checksum do
|
trait :correct_checksum do
|
||||||
after(:build) do |artifact, evaluator|
|
after(:build) do |artifact, evaluator|
|
||||||
artifact.file_sha256 = Digest::SHA256.file(artifact.file.path).hexdigest
|
artifact.file_sha256 = Digest::SHA256.file(artifact.file.path).hexdigest
|
||||||
|
|
1
spec/fixtures/codequality/codequality.json
vendored
Normal file
1
spec/fixtures/codequality/codequality.json
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
spec/fixtures/codequality/codequality.json.gz
vendored
Normal file
BIN
spec/fixtures/codequality/codequality.json.gz
vendored
Normal file
Binary file not shown.
|
@ -33,6 +33,7 @@ describe Gitlab::Ci::Config::Entry::Reports do
|
||||||
|
|
||||||
where(:keyword, :file) do
|
where(:keyword, :file) do
|
||||||
:junit | 'junit.xml'
|
:junit | 'junit.xml'
|
||||||
|
:codequality | 'codequality.json'
|
||||||
:sast | 'gl-sast-report.json'
|
:sast | 'gl-sast-report.json'
|
||||||
:dependency_scanning | 'gl-dependency-scanning-report.json'
|
:dependency_scanning | 'gl-dependency-scanning-report.json'
|
||||||
:container_scanning | 'gl-container-scanning-report.json'
|
:container_scanning | 'gl-container-scanning-report.json'
|
||||||
|
|
|
@ -1278,6 +1278,19 @@ describe Ci::Build do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#artifacts_file_for_type' do
|
||||||
|
let(:build) { create(:ci_build, :artifacts) }
|
||||||
|
let(:file_type) { :archive }
|
||||||
|
|
||||||
|
subject { build.artifacts_file_for_type(file_type) }
|
||||||
|
|
||||||
|
it 'queries artifacts for type' do
|
||||||
|
expect(build).to receive_message_chain(:job_artifacts, :find_by).with(file_type: Ci::JobArtifact.file_types[file_type])
|
||||||
|
|
||||||
|
subject
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#merge_request' do
|
describe '#merge_request' do
|
||||||
def create_mr(build, pipeline, factory: :merge_request, created_at: Time.now)
|
def create_mr(build, pipeline, factory: :merge_request, created_at: Time.now)
|
||||||
create(factory, source_project: pipeline.project,
|
create(factory, source_project: pipeline.project,
|
||||||
|
|
|
@ -34,7 +34,7 @@ describe Ci::JobArtifact do
|
||||||
describe '.erasable' do
|
describe '.erasable' do
|
||||||
subject { described_class.erasable }
|
subject { described_class.erasable }
|
||||||
|
|
||||||
context 'when there is am erasable artifact' do
|
context 'when there is an erasable artifact' do
|
||||||
let!(:artifact) { create(:ci_job_artifact, :junit) }
|
let!(:artifact) { create(:ci_job_artifact, :junit) }
|
||||||
|
|
||||||
it { is_expected.to eq([artifact]) }
|
it { is_expected.to eq([artifact]) }
|
||||||
|
|
|
@ -26,7 +26,8 @@ describe Ci::RetryBuildService do
|
||||||
erased_at auto_canceled_by job_artifacts job_artifacts_archive
|
erased_at auto_canceled_by job_artifacts job_artifacts_archive
|
||||||
job_artifacts_metadata job_artifacts_trace job_artifacts_junit
|
job_artifacts_metadata job_artifacts_trace job_artifacts_junit
|
||||||
job_artifacts_sast job_artifacts_dependency_scanning
|
job_artifacts_sast job_artifacts_dependency_scanning
|
||||||
job_artifacts_container_scanning job_artifacts_dast].freeze
|
job_artifacts_container_scanning job_artifacts_dast
|
||||||
|
job_artifacts_codequality].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
|
||||||
|
|
Loading…
Reference in a new issue