Configure more feature flags
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