Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'db/fixtures')
-rw-r--r--db/fixtures/development/14_pipelines.rb137
-rw-r--r--db/fixtures/development/38_ci_cd_analytics.rb103
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