Welcome to mirror list, hosted at ThFree Co, Russian Federation.

create_job_artifacts_service.rb « ci « services « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: e633dc7f6338022c7e50e018bf56f8f1f938439d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# frozen_string_literal: true

module Ci
  class CreateJobArtifactsService
    ArtifactsExistError = Class.new(StandardError)

    def execute(job, artifacts_file, params, metadata_file: nil)
      expire_in = params['expire_in'] ||
        Gitlab::CurrentSettings.current_application_settings.default_artifacts_expire_in

      job.job_artifacts.build(
        project: job.project,
        file: artifacts_file,
        file_type: params['artifact_type'],
        file_format: params['artifact_format'],
        file_sha256: artifacts_file.sha256,
        expire_in: expire_in)

      if metadata_file
        job.job_artifacts.build(
          project: job.project,
          file: metadata_file,
          file_type: :metadata,
          file_format: :gzip,
          file_sha256: metadata_file.sha256,
          expire_in: expire_in)
      end

      job.update(artifacts_expire_in: expire_in)
    rescue ActiveRecord::RecordNotUnique => error
      return true if sha256_matches_existing_artifact?(job, params['artifact_type'], artifacts_file)

      Gitlab::ErrorTracking.track_exception(error,
        job_id: job.id,
        project_id: job.project_id,
        uploading_type: params['artifact_type']
      )

      job.errors.add(:base, 'another artifact of the same type already exists')
      false
    end

    private

    def sha256_matches_existing_artifact?(job, artifact_type, artifacts_file)
      existing_artifact = job.job_artifacts.find_by_file_type(artifact_type)
      return false unless existing_artifact

      existing_artifact.file_sha256 == artifacts_file.sha256
    end
  end
end