diff options
Diffstat (limited to 'db/fixtures')
-rw-r--r-- | db/fixtures/development/14_pipelines.rb | 137 | ||||
-rw-r--r-- | db/fixtures/development/38_ci_cd_analytics.rb | 103 |
2 files changed, 203 insertions, 37 deletions
diff --git a/db/fixtures/development/14_pipelines.rb b/db/fixtures/development/14_pipelines.rb index 67696828420..05916c688f3 100644 --- a/db/fixtures/development/14_pipelines.rb +++ b/db/fixtures/development/14_pipelines.rb @@ -1,15 +1,28 @@ +# frozen_string_literal: true + require './spec/support/sidekiq_middleware' -class Gitlab::Seeder::Pipelines +# Usage: +# +# Simple invocation seeds 5 random projects: +# +# FILTER=14_pipelines bundle exec rake db:seed_fu +# +# Create a new project with repository within a group +# +# FILTER=14_pipelines NEW_PROJECT=1 bundle exec rake db:seed_fu + +# rubocop:disable Rails/Output +class Gitlab::Seeder::Pipelines # rubocop:disable Style/ClassAndModuleChildren PIPELINE_STAGES = [ { name: 'build', position: 0, builds: [ { name: 'build:linux', status: :success, - queued_at: 10.hour.ago, started_at: 9.hour.ago, finished_at: 8.hour.ago }, + queued_at: 10.hours.ago, started_at: 9.hours.ago, finished_at: 8.hours.ago }, { name: 'build:osx', status: :success, - queued_at: 10.hour.ago, started_at: 10.hour.ago, finished_at: 9.hour.ago }, + queued_at: 10.hours.ago, started_at: 10.hours.ago, finished_at: 9.hours.ago } ] }, { @@ -17,25 +30,25 @@ class Gitlab::Seeder::Pipelines position: 1, builds: [ { name: 'rspec:linux 0 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:linux 1 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:linux 2 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:windows 0 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:windows 1 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:windows 2 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:windows 2 3', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'rspec:osx', status_event: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'spinach:linux', status: :success, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago }, + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago }, { name: 'spinach:osx', status: :failed, allow_failure: true, - queued_at: 8.hour.ago, started_at: 8.hour.ago, finished_at: 7.hour.ago } + queued_at: 8.hours.ago, started_at: 8.hours.ago, finished_at: 7.hours.ago } ] }, { @@ -44,16 +57,16 @@ class Gitlab::Seeder::Pipelines builds: [ { name: 'staging', environment: 'staging', status_event: :success, options: { environment: { action: 'start', on_stop: 'stop staging' } }, - queued_at: 7.hour.ago, started_at: 6.hour.ago, finished_at: 4.hour.ago }, + queued_at: 7.hours.ago, started_at: 6.hours.ago, finished_at: 4.hours.ago }, { name: 'stop staging', environment: 'staging', when: 'manual', status: :skipped }, - { name: 'production', environment: 'production', when: 'manual', status: :skipped }, + { name: 'production', environment: 'production', when: 'manual', status: :skipped } ] }, { name: 'notify', position: 3, builds: [ - { name: 'slack', when: 'manual', status: :success }, + { name: 'slack', when: 'manual', status: :success } ] }, { @@ -61,16 +74,25 @@ class Gitlab::Seeder::Pipelines position: 4, builds: [ { name: 'jenkins', status: :success, - queued_at: 7.hour.ago, started_at: 6.hour.ago, finished_at: 4.hour.ago } + queued_at: 7.hours.ago, started_at: 6.hours.ago, finished_at: 4.hours.ago } ] } - ] + ].freeze - def initialize(project) - @project = project + def initialize(project = nil) + @project = project || create_new_project end def seed! + if !@project.repository_exists? || @project.empty_repo? + puts + puts "==============WARNING==============" + puts "(#{@project.full_path}) doesn't have a repository. " \ + 'Try specifying a project with working repository or add NEW_PROJECT=1 parameter ' \ + 'so the seed script will automatically create one.' + return + end + pipelines.each do |pipeline| PIPELINE_STAGES.each do |stage_attrs| stage = stage_create!(pipeline, stage_attrs[:name], stage_attrs[:position]) @@ -90,21 +112,51 @@ class Gitlab::Seeder::Pipelines end ::Gitlab::Seeders::Ci::DailyBuildGroupReportResult.new(@project).seed if @project.last_pipeline + + puts "\nSuccessfully seeded '#{@project.full_path}'\n" + puts "URL: #{Rails.application.routes.url_helpers.project_url(@project)}" end private + def create_new_project + admin = User.admins.first + + namespace = FactoryBot.create( + :group, + :public, + name: "Repo Analytics Group #{suffix}", + path: "r-analytics-group-#{suffix}" + ) + project = FactoryBot.create( + :project, + :public, + :repository, + name: "Repo Analytics Project #{suffix}", + path: "r-analytics-project-#{suffix}", + creator: admin, + namespace: namespace + ) + + namespace.add_owner(admin) + project.create_repository + + project + end + def stage_create!(pipeline, name, position) Ci::Stage.create!(pipeline: pipeline, project: pipeline.project, name: name, position: position) end def pipelines - create_master_pipelines + create_merge_request_pipelines + create_main_pipelines + create_merge_request_pipelines end - def create_master_pipelines - @project.repository.commits('master', limit: 4).map do |commit| - create_pipeline!(@project, 'master', commit).tap do |pipeline| + def create_main_pipelines + branch_name = @project.default_branch + + @project.repository.commits(branch_name, limit: 4).map do |commit| + create_pipeline!(@project, branch_name, commit).tap do |pipeline| random_pipeline.tap do |triggered_by_pipeline| triggered_by_pipeline.try(:sourced_pipelines)&.create( source_job: triggered_by_pipeline.builds.all.sample, @@ -154,8 +206,8 @@ class Gitlab::Seeder::Pipelines setup_test_reports(build) setup_build_log(build) - build.project.environments. - find_or_create_by(name: build.expanded_environment_name) + build.project.environments + .find_or_create_by(name: build.expanded_environment_name) build.save! end @@ -188,9 +240,9 @@ class Gitlab::Seeder::Pipelines end def setup_build_log(build) - if %w(running success failed).include?(build.status) - build.trace.set(FFaker::Lorem.paragraphs(6).join("\n\n")) - end + return unless %w[running success failed].include?(build.status) + + build.trace.set(FFaker::Lorem.paragraphs(6).join("\n\n")) end def generic_commit_status_create!(pipeline, stage, opts = {}) @@ -207,7 +259,7 @@ class Gitlab::Seeder::Pipelines { name: 'test build', ci_stage: stage, stage_idx: stage.position, ref: pipeline.ref, tag: false, user: build_user, project: @project, pipeline: pipeline, - scheduling_type: :stage, created_at: Time.now, updated_at: Time.now, runner_id: runners.shuffle.first.id + scheduling_type: :stage, created_at: Time.now, updated_at: Time.now, runner_id: runners.sample.id }.merge(opts) end @@ -224,19 +276,19 @@ class Gitlab::Seeder::Pipelines end def artifacts_archive_path - Rails.root + 'spec/fixtures/ci_build_artifacts.zip' + "#{Rails.root}/spec/fixtures/ci_build_artifacts.zip" end def artifacts_metadata_path - Rails.root + 'spec/fixtures/ci_build_artifacts_metadata.gz' + "#{Rails.root}/spec/fixtures/ci_build_artifacts_metadata.gz" end def test_reports_pass_path - Rails.root + 'spec/fixtures/junit/junit_ant.xml.gz' + "#{Rails.root}/spec/fixtures/junit/junit_ant.xml.gz" end def test_reports_failed_path - Rails.root + 'spec/fixtures/junit/junit.xml.gz' + "#{Rails.root}/spec/fixtures/junit/junit.xml.gz" end def artifacts_cache_file(file_path) @@ -247,11 +299,22 @@ class Gitlab::Seeder::Pipelines yield(UploadedFile.new(file.path, filename: File.basename(file_path))) end + + def suffix + @suffix ||= Time.now.to_i + end end Gitlab::Seeder.quiet do - Project.not_mass_generated.sample(5).each do |project| - project_builds = Gitlab::Seeder::Pipelines.new(project) - project_builds.seed! + new_project = ENV['NEW_PROJECT'] + + if new_project.present? + Gitlab::Seeder::Pipelines.new.seed! + else + Project.not_mass_generated.sample(5).each do |project| + project_builds = Gitlab::Seeder::Pipelines.new(project) + project_builds.seed! + end end end +# rubocop:enable Rails/Output diff --git a/db/fixtures/development/38_ci_cd_analytics.rb b/db/fixtures/development/38_ci_cd_analytics.rb new file mode 100644 index 00000000000..12aab18c63b --- /dev/null +++ b/db/fixtures/development/38_ci_cd_analytics.rb @@ -0,0 +1,103 @@ +# frozen_string_literal: true + +require './ee/db/seeds/shared/dora_metrics' if Gitlab.ee? + +# Usage: +# +# Simple invocation always creates a new project within a group: +# +# FILTER=ci_cd_analytics SEED_CI_CD_ANALYTICS=1 bundle exec rake db:seed_fu + +# rubocop:disable Rails/Output +class Gitlab::Seeder::CiAnalytics # rubocop:disable Style/ClassAndModuleChildren + FLAG = 'SEED_CI_CD_ANALYTICS' + + def initialize + @project = create_new_project + end + + def seed! + seed_data! + end + + private + + attr_reader :project + + def seed_data! + Sidekiq::Worker.skipping_transaction_check do + create_dora_metrics! if Gitlab.ee? + create_pipelines! + create_releases! + + puts "Successfully seeded '#{project.full_path}' for CI/CD analytics!" + puts "URL: #{Rails.application.routes.url_helpers.project_url(project)}" + end + end + + def create_new_project + namespace = FactoryBot.create( + :group, + name: "CICD analytics Group #{suffix}", + path: "cicd-#{suffix}" + ) + project = FactoryBot.create( + :project, + :repository, + name: "CICD analytics Project #{suffix}", + path: "cicd-#{suffix}", + creator: admin, + namespace: namespace + ) + + namespace.add_owner(admin) + project.create_repository + project + end + + def create_dora_metrics! + Gitlab::Seeder::DoraMetrics.new(project: project).execute + end + + def create_pipelines! + branches = project.repository.branches.sample(15) + pipeline_statuses = [:success, :failed] + + branches.each do |branch| + FactoryBot.create( + :ci_pipeline, + pipeline_statuses.sample, + project: project, + ref: branch.name, + sha: branch.target, + created_at: random_past_date, + duration: rand(10).hours + ) + end + end + + def create_releases! + FactoryBot.create_list(:release, 3, project: project, author: admin) + end + + def admin + @admin ||= User.admins.first + end + + def suffix + @suffix ||= Time.now.to_i + end + + def random_past_date + rand(120).days.ago + end +end + +Gitlab::Seeder.quiet do + if ENV[Gitlab::Seeder::CiAnalytics::FLAG] + Gitlab::Seeder::CiAnalytics.new.seed! + else + puts "Skipped. Use the `#{Gitlab::Seeder::CiAnalytics::FLAG}` environment variable to enable." + end +end +# rubocop:enable Rails/Output |