87 lines
2.9 KiB
Ruby
87 lines
2.9 KiB
Ruby
class MigrateBuildEventsToPipelineEvents < ActiveRecord::Migration
|
|
include Gitlab::Database::MigrationHelpers
|
|
|
|
DOWNTIME = false
|
|
|
|
def up
|
|
Gitlab::Database.with_connection_pool(2) do |pool|
|
|
threads = []
|
|
|
|
threads << Thread.new do
|
|
pool.with_connection do |connection|
|
|
Thread.current[:foreign_key_connection] = connection
|
|
|
|
execute(<<-SQL.strip_heredoc)
|
|
UPDATE services
|
|
SET properties = replace(properties,
|
|
'notify_only_broken_builds',
|
|
'notify_only_broken_pipelines')
|
|
, pipeline_events = #{true_value}
|
|
, build_events = #{false_value}
|
|
WHERE type IN
|
|
('SlackService', 'MattermostService', 'HipchatService')
|
|
AND build_events = #{true_value};
|
|
SQL
|
|
end
|
|
end
|
|
|
|
threads << Thread.new do
|
|
pool.with_connection do |connection|
|
|
Thread.current[:foreign_key_connection] = connection
|
|
|
|
execute(update_pipeline_services_sql)
|
|
end
|
|
end
|
|
|
|
threads.each(&:join)
|
|
end
|
|
end
|
|
|
|
def down
|
|
# Don't bother to migrate the data back
|
|
end
|
|
|
|
def connection
|
|
# Rails memoizes connection objects, but this causes them to be shared
|
|
# amongst threads; we don't want that.
|
|
Thread.current[:foreign_key_connection] || ActiveRecord::Base.connection
|
|
end
|
|
|
|
private
|
|
|
|
def update_pipeline_services_sql
|
|
if Gitlab::Database.postgresql?
|
|
<<-SQL
|
|
UPDATE services
|
|
SET type = 'PipelinesEmailService'
|
|
, properties = replace(properties,
|
|
'notify_only_broken_builds',
|
|
'notify_only_broken_pipelines')
|
|
, pipeline_events = #{true_value}
|
|
, build_events = #{false_value}
|
|
WHERE type = 'BuildsEmailService'
|
|
AND
|
|
(SELECT 1 FROM services pipeline_services
|
|
WHERE pipeline_services.project_id = services.project_id
|
|
AND pipeline_services.type = 'PipelinesEmailService' LIMIT 1)
|
|
IS NULL;
|
|
SQL
|
|
else
|
|
<<-SQL
|
|
UPDATE services build_services
|
|
LEFT OUTER JOIN services pipeline_services
|
|
ON build_services.project_id = pipeline_services.project_id
|
|
AND pipeline_services.type = 'PipelinesEmailService'
|
|
SET build_services.type = 'PipelinesEmailService'
|
|
, build_services.properties = replace(build_services.properties,
|
|
'notify_only_broken_builds',
|
|
'notify_only_broken_pipelines')
|
|
, build_services.pipeline_events = #{true_value}
|
|
, build_services.build_events = #{false_value}
|
|
WHERE build_services.type = 'BuildsEmailService'
|
|
AND pipeline_services.id IS NULL;
|
|
SQL
|
|
end.strip_heredoc
|
|
end
|
|
end
|