diff --git a/db/fixtures/development/17_cycle_analytics.rb b/db/fixtures/development/17_cycle_analytics.rb index 50155668dcabd42d0291e95e2da7adff4c454c41..0175647e71e2b9904f06710efb9faac70e5d1c37 100644 --- a/db/fixtures/development/17_cycle_analytics.rb +++ b/db/fixtures/development/17_cycle_analytics.rb @@ -3,6 +3,8 @@ require './spec/support/sidekiq_middleware' require './spec/support/helpers/test_env' require 'active_support/testing/time_helpers' +require './spec/support/helpers/cycle_analytics_helpers.rb' +require './ee/db/seeds/shared/dora_metrics.rb' if Gitlab.ee? # Usage: # @@ -21,6 +23,7 @@ # rubocop:disable Rails/Output class Gitlab::Seeder::CycleAnalytics # rubocop:disable Style/ClassAndModuleChildren include ActiveSupport::Testing::TimeHelpers + include CycleAnalyticsHelpers attr_reader :project, :issues, :merge_requests, :developers @@ -78,12 +81,30 @@ def seed! seed_review_stage! seed_staging_stage! + if Gitlab.ee? + seed_dora_metrics! + create_custom_value_stream! + create_value_stream_aggregation(project.group) + end + puts "Successfully seeded '#{project.full_path}' for Value Stream Management!" puts "URL: #{Rails.application.routes.url_helpers.project_url(project)}" end private + def create_custom_value_stream! + Analytics::CycleAnalytics::ValueStreams::CreateService.new( + current_user: admin, + namespace: project.group, + params: { name: "vs #{suffix}", stages: Gitlab::Analytics::CycleAnalytics::DefaultStages.all } + ).execute + end + + def seed_dora_metrics! + Gitlab::Seeder::DoraMetrics.new(project: project).execute + end + def seed_issue_stage! issues.each do |issue| time = within_end_time(issue.created_at + rand(MAX_DURATIONS[:issue]).hours) diff --git a/ee/db/fixtures/development/92_dora_metrics.rb b/ee/db/fixtures/development/92_dora_metrics.rb new file mode 100644 index 0000000000000000000000000000000000000000..e903384637f2096a7d472cfe7722123365b71aac --- /dev/null +++ b/ee/db/fixtures/development/92_dora_metrics.rb @@ -0,0 +1,32 @@ +# frozen_string_literal: true + +# Usage: +# +# Simple invocation always creates a new project: +# +# SEED_DORA=1 FILTER=dora_metrics bundle exec rake db:seed_fu +# +# +# Run for an existing project +# +# SEED_DORA=1 PROJECT_ID=10 FILTER=dora_metrics bundle exec rake db:seed_fu + +require './ee/db/seeds/shared/dora_metrics' + +# rubocop:disable Rails/Output +Gitlab::Seeder.quiet do + flag = ENV['SEED_DORA'] + + unless flag + puts "Skipped. Use the SEED_DORA=1 environment variable to enable." + next + end + + project_id = ENV['PROJECT_ID'] + project = Project.find(project_id) if project_id + + seeder = Gitlab::Seeder::DoraMetrics.new(project: project) + + seeder.execute +end +# rubocop:enable Rails/Output diff --git a/ee/db/seeds/shared/dora_metrics.rb b/ee/db/seeds/shared/dora_metrics.rb new file mode 100644 index 0000000000000000000000000000000000000000..bb49a684b18a090e287eedc6f9c34aa2569b0e37 --- /dev/null +++ b/ee/db/seeds/shared/dora_metrics.rb @@ -0,0 +1,55 @@ +# frozen_string_literal: true + +class Gitlab::Seeder::DoraMetrics # rubocop:disable Style/ClassAndModuleChildren + def initialize(project: nil) + @project = project || create_new_project + @environment = @project.environments.find_by_name('production') + @environment ||= FactoryBot.create(:environment, name: 'production', project: @project) + end + + def execute + create_dora_metrics + + puts "Successfully seeded DORA metrics for '#{@project.full_path}'!" + puts "URL: #{Rails.application.routes.url_helpers.project_url(@project)}" + end + + private + + def create_new_project + namespace = FactoryBot.create( + :group, + name: "Value Stream Management Group DORA #{suffix}", + path: "vsmg-#{suffix}" + ) + + FactoryBot.create( + :project, + :repository, + name: "Value Stream Management Project DORA #{suffix}", + path: "vsmp-#{suffix}", + creator: admin, + namespace: namespace + ) + end + + def create_dora_metrics + 100.times do |i| + Dora::DailyMetrics.create( + environment_id: @environment.id, + date: (i + 1).days.ago, + deployment_frequency: rand(50), + incidents_count: rand(5), + lead_time_for_changes_in_seconds: rand(50000), + time_to_restore_service_in_seconds: rand(100000)) + end + end + + def suffix + @suffix ||= Time.now.to_i + end + + def admin + @admin ||= User.admins.first + end +end