Skip to content

Configure more feature flags

Kamil Trzciński requested to merge update-ffs-milestones-2 into master

What does this MR do?

Next iteration after: !47190 (merged).

This iterates all YAMLs, and fetches milestone associated with the MR or Issue.

Result

$ grep -hr "^milestone:" config/feature_flags ee/config/feature_flags| sort | uniq -c | sort -n -r                                             
     83 milestone: 
     58 milestone: '13.4'
     43 milestone: '13.5'
     34 milestone: '13.6'
     21 milestone: '13.2'
     20 milestone: '13.0'
     18 milestone: '13.3'
     15 milestone: '12.10'
      9 milestone: '12.4'
      8 milestone: '13.1'
      8 milestone: '12.8'
      4 milestone: '12.6'
      4 milestone: '12.5'
      4 milestone: '12.0'
      3 milestone: '12.9'
      3 milestone: '11.10'
      2 milestone: '13.7'
      2 milestone: '12.2'
      2 milestone: '11.6'
      2 milestone: '11.11'
      1 milestone: '12.7'
      1 milestone: '12.3'
      1 milestone: '12.1'
      1 milestone: '11.9'
      1 milestone: '11.8'
      1 milestone: '11.7'
      1 milestone: '10.8'
      1 milestone: '10.6'
      1 milestone: '10.3'

Script

#!/usr/bin/env ruby

require 'yaml'

paths = [
  'config/feature_flags/**/*.yml',
  'ee/config/feature_flags/**/*.yml'
]

@cached = {}

def get_json(url)
  resp = HTTP.get(url + ".json")
  return unless resp.status == 200

  JSON.parse(resp.body)
end

def get_project(url)
  if url.to_s.include?("/gitlab-org/gitlab/")
    "gitlab-org%2Fgitlab"
  elsif url.to_s.include?("/gitlab-org/gitlab-foss/")
    "gitlab-org%2Fgitlab-foss"
  end
end

def get_mr_json(url)
  return unless url.to_s.include?("/merge_requests/")

  project = get_project(url)
  return unless project

  id = url.to_s.split('/').last
  @cached[url] ||= get_json("https://gitlab.com/api/v4/projects/#{project}/merge_requests/#{id}")
end

def get_issue_json(url)
  return unless url.to_s.include?("/issues/")

  project = get_project(url)
  return unless project

  id = url.to_s.split('/').last
  @cached[url] ||= get_json("https://gitlab.com/api/v4/projects/#{project}/issues/#{id}")
end

def get_milestone(config)
  get_mr_json(config['introduced_by_url'])&.dig("milestone", "title") ||
    get_issue_milestone(config['rollout_issue_url'])&.dig("milestone", "title")
end

def find_group(labels)
  return unless labels

  labels.find { |label| label.start_with?('group::') }
end

def get_group(config)
  find_group(get_mr_json(config['introduced_by_url'])&.dig("labels")) ||
    find_group(get_mr_json(config['rollout_issue_url'])&.dig("labels")) ||
    config['group']
end

def process_flag(path)
  config = YAML.load_file(path)

  unless config['milestone']
    config['milestone'] = get_milestone(config)
    puts "#{config['name']}... MILESTONE: #{config['milestone']}... #{config['introduced_by_url']}... #{config['rollout_issue_url']}"
  end

  #unless config['group']
    config['group'] = get_group(config)
    puts "#{config['name']}... GROUP: #{config['group']}..."
  #end

  config_yaml = config.slice(
    *::Feature::Shared::PARAMS.map(&:to_s)
  ).to_yaml

  File.write(path, config_yaml)
end

paths.each do |path|
  Dir.glob(path).each do |flag_path|
    process_flag(flag_path)
  end
end

Does this MR meet the acceptance criteria?

Conformity

Edited by Kamil Trzciński

Merge request reports