Implement initial working stages statuses migration

This commit is contained in:
Grzegorz Bizon 2017-07-04 13:43:26 +02:00
parent 7103c4a707
commit d60ce6e9f4
2 changed files with 30 additions and 37 deletions

View File

@ -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

View File

@ -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