summaryrefslogtreecommitdiff
path: root/db/migrate/20210218040814_add_environment_scope_to_group_variables.rb
blob: 5cc41f570aa61e6957ffe94166a2cd451c933be6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# frozen_string_literal: true

class AddEnvironmentScopeToGroupVariables < ActiveRecord::Migration[6.0]
  include Gitlab::Database::MigrationHelpers

  DOWNTIME = false
  OLD_INDEX = 'index_ci_group_variables_on_group_id_and_key'
  NEW_INDEX = 'index_ci_group_variables_on_group_id_and_key_and_environment'

  disable_ddl_transaction!

  def up
    unless column_exists?(:ci_group_variables, :environment_scope)
      # rubocop:disable Migration/AddLimitToTextColumns
      # Added in 20210305013509_add_text_limit_to_group_ci_variables_environment_scope
      add_column :ci_group_variables, :environment_scope, :text, null: false, default: '*'
      # rubocop:enable Migration/AddLimitToTextColumns
    end

    add_concurrent_index :ci_group_variables, [:group_id, :key, :environment_scope], unique: true, name: NEW_INDEX
    remove_concurrent_index_by_name :ci_group_variables, OLD_INDEX
  end

  def down
    remove_duplicates!

    add_concurrent_index :ci_group_variables, [:group_id, :key], unique: true, name: OLD_INDEX
    remove_concurrent_index_by_name :ci_group_variables, NEW_INDEX

    remove_column :ci_group_variables, :environment_scope
  end

  private

  def remove_duplicates!
    execute <<-SQL
      DELETE FROM ci_group_variables
      WHERE id NOT IN (
        SELECT MIN(id)
        FROM ci_group_variables
        GROUP BY group_id, key
      )
    SQL
  end
end