summaryrefslogtreecommitdiff
path: root/lib/gitlab/background_migration/migrate_legacy_artifacts.rb
blob: c2cd60bf730ebd0f72a6b00541c908dcb98a9bbe (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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# frozen_string_literal: true
# rubocop:disable Metrics/AbcSize
# rubocop:disable Style/Documentation

module Gitlab
  module BackgroundMigration
    class MigrateLegacyArtifacts
      FILE_LOCAL_STORE = 1 # equal to ObjectStorage::Store::LOCAL
      ARCHIVE_FILE_TYPE = 1 # equal to Ci::JobArtifact.file_types['archive']
      METADATA_FILE_TYPE = 2 # equal to Ci::JobArtifact.file_types['metadata']
      LEGACY_PATH_FILE_LOCATION = 1 # equal to Ci::JobArtifact.file_location['legacy_path']

      def perform(id_list)
        ActiveRecord::Base.transaction do
          insert_archives(id_list)
          insert_metadatas(id_list)
          delete_legacy_artifacts(id_list)
        end
      end

      private

      def insert_archives(id_list)
        ActiveRecord::Base.connection.execute <<-EOF.strip_heredoc
          INSERT INTO ci_job_artifacts (
                project_id,
                job_id,
                expire_at,
                file_location,
                created_at,
                updated_at,
                file,
                size,
                file_store,
                file_type)
          SELECT project_id,
                id,
                artifacts_expire_at,
                #{LEGACY_PATH_FILE_LOCATION},
                created_at,
                created_at,
                artifacts_file,
                artifacts_size,
                COALESCE(artifacts_file_store, #{FILE_LOCAL_STORE}),
                #{ARCHIVE_FILE_TYPE}
            FROM ci_builds
          WHERE id IN (#{id_list.join(',')})
                  AND artifacts_file <> ''
                  AND NOT EXISTS (
                    SELECT 1 FROM ci_job_artifacts
                    WHERE (ci_builds.id = ci_job_artifacts.job_id)
                      AND ci_job_artifacts.file_type = #{ARCHIVE_FILE_TYPE})
        EOF
      end

      def insert_metadatas(id_list)
        ActiveRecord::Base.connection.execute <<-EOF.strip_heredoc
          INSERT INTO ci_job_artifacts (
                project_id,
                job_id,
                expire_at,
                file_location,
                created_at,
                updated_at,
                file,
                size,
                file_store,
                file_type)
          SELECT project_id,
                id,
                artifacts_expire_at,
                #{LEGACY_PATH_FILE_LOCATION},
                created_at,
                created_at,
                artifacts_metadata,
                NULL,
                COALESCE(artifacts_metadata_store, #{FILE_LOCAL_STORE}),
                #{METADATA_FILE_TYPE}
            FROM ci_builds
          WHERE id IN (#{id_list.join(',')})
                  AND artifacts_file <> '' AND artifacts_metadata <> ''
                  AND NOT EXISTS (
                    SELECT 1 FROM ci_job_artifacts
                    WHERE (ci_builds.id = ci_job_artifacts.job_id)
                      AND ci_job_artifacts.file_type = #{METADATA_FILE_TYPE})
        EOF
      end

      def delete_legacy_artifacts(id_list)
        ActiveRecord::Base.connection.execute <<-EOF.strip_heredoc
          UPDATE ci_builds
             SET artifacts_file = NULL,
                 artifacts_file_store = NULL,
                 artifacts_size = NULL,
                 artifacts_metadata = NULL,
                 artifacts_metadata_store = NULL
           WHERE id IN (#{id_list.join(',')})
                  AND (artifacts_file <> '' OR artifacts_metadata <> '')
        EOF
      end
    end
  end
end