gitlab-org--gitlab-foss/db/fixtures/development/33_triage_ops.rb

182 lines
4.9 KiB
Ruby

# frozen_string_literal: true
require './spec/support/sidekiq_middleware'
require './spec/support/helpers/test_env'
class Gitlab::Seeder::TriageOps
WEBHOOK_URL = 'http://0.0.0.0:$PORT$'
WEBHOOK_TOKEN = "triage-ops-webhook-token"
def seed!
puts "Updating settings to allow web hooks to localhost"
ApplicationSetting.current_without_cache.update!(allow_local_requests_from_web_hooks_and_services: true)
Sidekiq::Worker.skipping_transaction_check do
Sidekiq::Testing.inline! do
puts "Ensuring required groups"
ensure_group('gitlab-com')
ensure_group('gitlab-com/gl-security/appsec')
ensure_group('gitlab-jh/jh-team')
ensure_group('gitlab-org')
ensure_group('gitlab-org/gitlab-core-team/community-members')
ensure_group('gitlab-org/security')
puts "Ensuring required projects"
ensure_project('gitlab-org/gitlab')
ensure_project('gitlab-org/security/gitlab')
puts "Ensuring required bot user"
ensure_bot_user
puts "Setting up webhooks"
ensure_webhook_for('gitlab-com')
ensure_webhook_for('gitlab-org')
puts "Ensuring work type labels"
ensure_work_type_labels_for('gitlab-com')
ensure_work_type_labels_for('gitlab-org')
end
end
end
private
def ensure_bot_user
bot = User.find_by_username('triagebot')
bot ||= User.create!(
username: 'triagebot',
name: 'Triage Bot',
email: 'triagebot@example.com',
confirmed_at: DateTime.now,
password: SecureRandom.hex.slice(0, 16)
)
ensure_group('gitlab-org').add_maintainer(bot)
ensure_group('gitlab-com').add_maintainer(bot)
params = {
scopes: ['api'],
name: "API Token #{Time.zone.now}"
}
response = PersonalAccessTokens::CreateService.new(current_user: bot, target_user: bot, params: params).execute
unless response.success?
raise "Can't create Triage Bot access token: #{response.message}"
end
puts "Bot with API_TOKEN=#{response[:personal_access_token].token} is present now."
bot
end
def ensure_webhook_for(group_path)
group = Group.find_by_full_path(group_path)
hook_params = {
enable_ssl_verification: false,
token: WEBHOOK_TOKEN,
url: WEBHOOK_URL.gsub("$PORT$", ENV.fetch('TRIAGE_OPS_WEBHOOK_PORT', '8091'))
}
# Subscribe the hook to all possible events.
all_group_hook_events = GroupHook.triggers.values
all_group_hook_events.each { |value| hook_params[value] = true }
group.hooks.delete_all
hook = group.hooks.new(hook_params)
hook.save!
puts "Hook with url '#{hook.url}' and token '#{hook.token}' for '#{group_path}' is present now."
end
def ensure_work_type_labels_for(group_path)
label_titles = [
'bug::availability',
'bug::mobile',
'bug::performance',
'bug::vulnerability',
'feature::addition',
'feature::consolidation',
'feature::enhancement',
'feature::removal',
'maintenance::dependency',
'maintenance::pipelines',
'maintenance::refactor',
'maintenance::test-gap',
'maintenance::usability',
'maintenance::workflow',
'type::bug',
'type::feature',
'type::maintenance',
]
group = Group.find_by_full_path(group_path)
label_titles.each do |label_title|
color = ::Gitlab::Color.color_for(label_title[/[^:]+/])
Labels::CreateService
.new(title: label_title, color: "#{color}")
.execute(group: group)
end
end
def ensure_group(full_path)
group = Group.find_by_full_path(full_path)
return group if group
parent_path = full_path.split('/')[0..-2].join('/')
parent = ensure_group(parent_path) if parent_path.present?
group_path = full_path.split('/').last
group = Group.new(
name: group_path.titleize,
path: group_path,
parent_id: parent&.id
)
group.description = FFaker::Lorem.sentence
group.save!
group.add_owner(User.first)
group.create_namespace_settings
group
end
def ensure_project(project_fullpath)
project = Project.find_by_full_path(project_fullpath)
return project if project
group_path = project_fullpath.split('/')[0..-2].join('/')
project_path = project_fullpath.split('/').last
group = ensure_group(group_path)
params = {
namespace_id: group.id,
name: project_path.titleize,
path: project_path,
description: FFaker::Lorem.sentence,
visibility_level: Gitlab::VisibilityLevel::PRIVATE,
skip_disk_validation: true
}
project = ::Projects::CreateService.new(User.first, params).execute
raise "Can't create project '#{project_fullpath}' : #{project.errors.full_messages}" unless project.persisted?
project
end
end
if ENV['SEED_TRIAGE_OPS']
Gitlab::Seeder.quiet do
Gitlab::Seeder::TriageOps.new.seed!
end
else
puts "Skipped. Use the `SEED_TRIAGE_OPS` environment variable to enable seeding data for triage ops project."
end