summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2018-06-03 14:21:50 +0900
committerShinya Maeda <shinya@gitlab.com>2018-06-04 14:14:20 +0900
commit0d00d02e842a0c4b22d213e00143a08d97597000 (patch)
tree2d05a270fc7493be0afcd5374af0153624df0e6a /lib
parentb626fcc045dda7ac25b1b7d01229589d8fd00521 (diff)
downloadgitlab-ce-0d00d02e842a0c4b22d213e00143a08d97597000.tar.gz
Directly refer application code from migration code
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/background_migration/archive_legacy_traces.rb77
-rw-r--r--lib/tasks/gitlab/traces.rake4
2 files changed, 12 insertions, 69 deletions
diff --git a/lib/gitlab/background_migration/archive_legacy_traces.rb b/lib/gitlab/background_migration/archive_legacy_traces.rb
index 9741a7c181e..0999ea95e56 100644
--- a/lib/gitlab/background_migration/archive_legacy_traces.rb
+++ b/lib/gitlab/background_migration/archive_legacy_traces.rb
@@ -5,73 +5,18 @@
module Gitlab
module BackgroundMigration
class ArchiveLegacyTraces
- class Build < ActiveRecord::Base
- include ::HasStatus
-
- self.table_name = 'ci_builds'
- self.inheritance_column = :_type_disabled # Disable STI
-
- belongs_to :project, foreign_key: :project_id, class_name: 'ArchiveLegacyTraces::Project'
- has_one :job_artifacts_trace, -> () { where(file_type: ArchiveLegacyTraces::JobArtifact.file_types[:trace]) }, class_name: 'ArchiveLegacyTraces::JobArtifact', foreign_key: :job_id
- has_many :trace_chunks, foreign_key: :build_id, class_name: 'ArchiveLegacyTraces::BuildTraceChunk'
-
- scope :finished, -> { where(status: [:success, :failed, :canceled]) }
-
- scope :without_new_traces, ->() do
- finished.where('NOT EXISTS (?)',
- BackgroundMigration::ArchiveLegacyTraces::JobArtifact.select(1).trace.where('ci_builds.id = ci_job_artifacts.job_id'))
- end
-
- def trace
- ::Gitlab::Ci::Trace.new(self)
- end
-
- def trace=(data)
- raise NotImplementedError
- end
-
- def old_trace
- read_attribute(:trace)
- end
-
- def erase_old_trace!
- update_column(:trace, nil)
- end
- end
-
- class JobArtifact < ActiveRecord::Base
- self.table_name = 'ci_job_artifacts'
-
- belongs_to :build
- belongs_to :project
-
- mount_uploader :file, JobArtifactUploader
-
- enum file_type: {
- archive: 1,
- metadata: 2,
- trace: 3
- }
- end
-
- class BuildTraceChunk < ActiveRecord::Base
- self.table_name = 'ci_build_trace_chunks'
-
- belongs_to :build
- end
-
- class Project < ActiveRecord::Base
- self.table_name = 'projects'
-
- has_many :builds, foreign_key: :project_id, class_name: 'ArchiveLegacyTraces::Build'
- end
-
def perform(start_id, stop_id)
- BackgroundMigration::ArchiveLegacyTraces::Build
- .finished
- .without_new_traces
- .where(id: (start_id..stop_id)).find_each do |build|
- build.trace.archive!
+ # This background migrations directly refer ::Ci::Build model which is defined in application code.
+ # In general, migration code should be isolated as much as possible in order to be idempotent.
+ # However, `archive!` logic is too complicated to be replicated. So we chose a way to refer ::Ci::Build directly
+ # and we don't change the `archive!` logic until 11.1
+ ::Ci::Build.finished.without_archived_trace
+ .where(id: start_id..stop_id).find_each do |build|
+ begin
+ build.trace.archive!
+ rescue => e
+ Rails.logger.error "Failed to archive live trace. id: #{build.id} message: #{e.message}"
+ end
end
end
end
diff --git a/lib/tasks/gitlab/traces.rake b/lib/tasks/gitlab/traces.rake
index fd2a4f2d11a..ddcca69711f 100644
--- a/lib/tasks/gitlab/traces.rake
+++ b/lib/tasks/gitlab/traces.rake
@@ -8,9 +8,7 @@ namespace :gitlab do
logger = Logger.new(STDOUT)
logger.info('Archiving legacy traces')
- Ci::Build.finished
- .where('NOT EXISTS (?)',
- Ci::JobArtifact.select(1).trace.where('ci_builds.id = ci_job_artifacts.job_id'))
+ Ci::Build.finished.without_archived_trace
.order(id: :asc)
.find_in_batches(batch_size: 1000) do |jobs|
job_ids = jobs.map { |job| [job.id] }