diff options
Diffstat (limited to 'db/fixtures/development/33_triage_ops.rb')
-rw-r--r-- | db/fixtures/development/33_triage_ops.rb | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/db/fixtures/development/33_triage_ops.rb b/db/fixtures/development/33_triage_ops.rb new file mode 100644 index 00000000000..f4d74af15ca --- /dev/null +++ b/db/fixtures/development/33_triage_ops.rb @@ -0,0 +1,139 @@ +# 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::Testing.inline! do + puts "Ensuring required groups" + ensure_group('gitlab-com') + 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') + 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_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 |