diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-12-05 12:42:24 +0100 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2018-01-06 14:09:59 +0100 |
commit | cd6d0dbd5fe9548ab7c0cd7b09e640a7b425daf1 (patch) | |
tree | 839568b145dd96c7437cef4713ca542c678b5efc /lib | |
parent | 2ab69f0d0c825f8546f189a61189246d6c90b7ff (diff) | |
download | gitlab-ce-cd6d0dbd5fe9548ab7c0cd7b09e640a7b425daf1.tar.gz |
Migrate a build stage completely in a background migration
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/background_migration/migrate_build_stage.rb | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/gitlab/background_migration/migrate_build_stage.rb b/lib/gitlab/background_migration/migrate_build_stage.rb new file mode 100644 index 00000000000..05edaab29d2 --- /dev/null +++ b/lib/gitlab/background_migration/migrate_build_stage.rb @@ -0,0 +1,67 @@ +# frozen_string_literal: true +# rubocop:disable Metrics/AbcSize +# rubocop:disable Style/Documentation + +module Gitlab + module BackgroundMigration + class MigrateBuildStage + def perform(id) + Ci::Build.find_by(id: id).try do |build| + Stage.new(build).tap do |stage| + return if stage.exists? + + stage.ensure! + stage.migrate_reference! + stage.migrate_status! + end + end + end + + private + + class Ci::Stage < ActiveRecord::Base + self.table_name = 'ci_stages' + end + + class Ci::Build < ActiveRecord::Base + self.table_name = 'ci_builds' + end + + class Stage + def initialize(build) + @build = build + end + + def exists? + @build.reload.stage_id.present? + end + + def ensure! + find || create! + end + + def find + Ci::Stage.find_by(name: @build.stage, + pipeline_id: @build.commit_id, + project_id: @build.project_id) + end + + def create! + Ci::Stage.create!(name: @build.stage, + pipeline_id: @build.commit_id, + project_id: @build.project_id) + end + + def migrate_reference! + MigrateBuildStageIdReference.new.perform(@build.id, @build.id) + end + + def migrate_status! + raise ArgumentError unless exists? + + MigrateStageStatus.new.perform(@build.stage_id, @build.stage_id) + end + end + end + end +end |