From d60ce6e9f44eba769a6ad595014ae96095169dd2 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 4 Jul 2017 13:43:26 +0200 Subject: [PATCH] Implement initial working stages statuses migration --- .../20170630111158_migrate_stages_statuses.rb | 46 ++++++++----------- .../migrate_stages_statuses_spec.rb | 21 ++++----- 2 files changed, 30 insertions(+), 37 deletions(-) diff --git a/db/post_migrate/20170630111158_migrate_stages_statuses.rb b/db/post_migrate/20170630111158_migrate_stages_statuses.rb index 8c6de84adf5..62542ed0001 100644 --- a/db/post_migrate/20170630111158_migrate_stages_statuses.rb +++ b/db/post_migrate/20170630111158_migrate_stages_statuses.rb @@ -48,34 +48,31 @@ class MigrateStagesStatuses < ActiveRecord::Migration canceled = scope_relevant.canceled.select('count(*)').to_sql warnings = scope_warnings.select('count(*) > 0').to_sql - "(CASE - WHEN (#{builds})=(#{skipped}) AND (#{warnings}) THEN #{STATUSES[:success]} - WHEN (#{builds})=(#{skipped}) THEN #{STATUSES[:skipped]} - WHEN (#{builds})=(#{success}) THEN #{STATUSES[:success]} - WHEN (#{builds})=(#{created}) THEN #{STATUSES[:created]} - WHEN (#{builds})=(#{success})+(#{skipped}) THEN #{STATUSES[:success]} - WHEN (#{builds})=(#{success})+(#{skipped})+(#{canceled}) THEN #{STATUSES[:canceled]} - WHEN (#{builds})=(#{created})+(#{skipped})+(#{pending}) THEN #{STATUSES[:pending]} - WHEN (#{running})+(#{pending})>0 THEN '#{STATUSES[:running]} - WHEN (#{manual})>0 THEN #{STATUSES[:manual]} - WHEN (#{created})>0 THEN #{STATUSES[:running]} - ELSE #{STATUSES[:failed]} - END)" + <<-SQL.strip_heredoc + (CASE + WHEN (#{builds}) = (#{skipped}) AND (#{warnings}) THEN #{STATUSES[:success]} + WHEN (#{builds}) = (#{skipped}) THEN #{STATUSES[:skipped]} + WHEN (#{builds}) = (#{success}) THEN #{STATUSES[:success]} + WHEN (#{builds}) = (#{created}) THEN #{STATUSES[:created]} + WHEN (#{builds}) = (#{success}) + (#{skipped}) THEN #{STATUSES[:success]} + WHEN (#{builds}) = (#{success}) + (#{skipped}) + (#{canceled}) THEN #{STATUSES[:canceled]} + WHEN (#{builds}) = (#{created}) + (#{skipped}) + (#{pending}) THEN #{STATUSES[:pending]} + WHEN (#{running}) + (#{pending}) > 0 THEN #{STATUSES[:running]} + WHEN (#{manual}) > 0 THEN #{STATUSES[:manual]} + WHEN (#{created}) > 0 THEN #{STATUSES[:running]} + ELSE #{STATUSES[:failed]} + END) + SQL end end def up - Stage.all.in_batches(of: 10000) do |relation| - status_sql = Build - .where('ci_builds.commit_id = ci_stages.pipeline_id') - .where('ci_builds.stage = ci_stages.name') - .status_sql + status_sql = Build + .where('ci_builds.commit_id = ci_stages.pipeline_id') + .where('ci_builds.stage = ci_stages.name') + .status_sql - execute <<-SQL.strip_heredoc - UPDATE ci_stages SET status = #{status_sql} - WHERE id = (#{relation.select(:id).to_sql}) - SQL - end + update_column_in_batches(:ci_stages, :status, Arel.sql("(#{status_sql})")) end def down @@ -83,7 +80,4 @@ class MigrateStagesStatuses < ActiveRecord::Migration UPDATE ci_stages SET status = null SQL end - - private - end diff --git a/spec/migrations/migrate_stages_statuses_spec.rb b/spec/migrations/migrate_stages_statuses_spec.rb index dc54f4acbf4..95fa2977b31 100644 --- a/spec/migrations/migrate_stages_statuses_spec.rb +++ b/spec/migrations/migrate_stages_statuses_spec.rb @@ -15,36 +15,35 @@ describe MigrateStagesStatuses, :migration do projects.create!(id: 1, name: 'gitlab1', path: 'gitlab1') projects.create!(id: 2, name: 'gitlab2', path: 'gitlab2') - pipelines.create!(id: 1, project_id: 123, ref: 'master', sha: 'adf43c3a') - pipelines.create!(id: 2, project_id: 456, ref: 'feature', sha: '21a3deb') + pipelines.create!(id: 1, project_id: 1, ref: 'master', sha: 'adf43c3a') + pipelines.create!(id: 2, project_id: 2, ref: 'feature', sha: '21a3deb') create_job(project: 1, pipeline: 1, stage: 'test', status: 'success') create_job(project: 1, pipeline: 1, stage: 'test', status: 'running') create_job(project: 1, pipeline: 1, stage: 'build', status: 'success') create_job(project: 1, pipeline: 1, stage: 'build', status: 'failed') create_job(project: 2, pipeline: 2, stage: 'test', status: 'success') - create_job(project: 2, pipeline: 2, stage: 'test', status: 'succcss') + create_job(project: 2, pipeline: 2, stage: 'test', status: 'success') - stages.create!(id: 1, pipeline_id: 1, project_id: 1, status: nil) - stages.create!(id: 2, pipeline_id: 1, project_id: 1, status: nil) - stages.create!(id: 3, pipeline_id: 2, project_id: 2, status: nil) + stages.create!(id: 1, pipeline_id: 1, project_id: 1, name: 'test', status: nil) + stages.create!(id: 2, pipeline_id: 1, project_id: 1, name: 'build', status: nil) + stages.create!(id: 3, pipeline_id: 2, project_id: 2, name: 'test', status: nil) end - pending 'correctly migrates stages statuses' do + it 'correctly migrates stages statuses' do expect(stages.where(status: nil).count).to eq 3 migrate! expect(stages.where(status: nil)).to be_empty - expect(stages.all.order(:id, :asc).pluck(:stage)) - .to eq %w[running success failed] + expect(stages.all.order('id ASC').pluck(:status)) + .to eq [STATUSES[:running], STATUSES[:failed], STATUSES[:success]] end def create_job(project:, pipeline:, stage:, status:) stage_idx = STAGES[stage.to_sym] - status_id = STATUSES[status.to_sym] jobs.create!(project_id: project, commit_id: pipeline, - stage_idx: stage_idx, stage: stage, status: status_id) + stage_idx: stage_idx, stage: stage, status: status) end end