From 2ebc2bfa5eb0d19d079002cb88ac815dfea9fef3 Mon Sep 17 00:00:00 2001 From: Zamir Martins <zfilho@gitlab.com> Date: Mon, 19 Feb 2024 15:04:37 +0000 Subject: [PATCH] Add seed for group level dependencies --- doc/development/rake_tasks.md | 6 ++ ee/lib/quality/seeders/dependencies.rb | 101 ++++++++++++++++++ .../lib/quality/seeders/dependencies_spec.rb | 21 ++++ lib/tasks/gitlab/seed.rake | 8 ++ 4 files changed, 136 insertions(+) create mode 100644 ee/lib/quality/seeders/dependencies.rb create mode 100644 ee/spec/lib/quality/seeders/dependencies_spec.rb diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md index 44893ef9a6d4c..816a918f34e92 100644 --- a/doc/development/rake_tasks.md +++ b/doc/development/rake_tasks.md @@ -166,6 +166,12 @@ bundle exec rake "gitlab:seed:project_environments[flightjs/Flight]" bundle exec rake "gitlab:seed:project_environments[flightjs/Flight, 25, FLIGHT_ENV_]" ``` +#### Seed a group with dependencies + +```shell +bundle exec rake gitlab:seed:dependencies +``` + #### Seed CI variables You can seed a project, group, or instance with [CI variables](../ci/variables/index.md). diff --git a/ee/lib/quality/seeders/dependencies.rb b/ee/lib/quality/seeders/dependencies.rb new file mode 100644 index 0000000000000..34841a0fc41a5 --- /dev/null +++ b/ee/lib/quality/seeders/dependencies.rb @@ -0,0 +1,101 @@ +# frozen_string_literal: true + +module Quality + module Seeders + class Dependencies + UNIQUE_COMPONENT_COUNT = 3 + PROJECT_COUNT = 2 + + def initialize + create_new_group + end + + def seed! + seed_data! + end + + private + + attr_reader :group + + def seed_data! + PROJECT_COUNT.times do + project = create_new_project + pipeline = create_pipeline(project) + create_sbom_records(pipeline) + end + puts "Successfully seeded '#{group.full_path}' for Dependency list!" + puts "URL: #{Rails.application.routes.url_helpers.group_url(group)}" + end + + def create_new_group + suffix = generate_suffix + + @group = FactoryBot.create( + :group, + name: "Group level dependencies #{suffix}", + path: "group-level-dependencies-#{suffix}" + ) + group.add_owner(admin) + end + + def create_new_project + suffix = generate_suffix + + FactoryBot.create( + :project, + :repository, + name: "Project level dependencies #{suffix}", + path: "project-level-dependencies-#{suffix}", + creator: admin, + namespace: group + ) + end + + def create_pipeline(project) + default_branch = project.default_branch + + FactoryBot.create( + :ci_pipeline, + :success, + project: project, + ref: default_branch + ) + end + + def create_sbom_records(pipeline) + component_versions.each do |component_version| + create_occurrences(component_version, pipeline) + create_occurrences(component_version, pipeline) + end + end + + def create_occurrences(component_version, pipeline) + project = pipeline.project + + source = FactoryBot.create(:sbom_source, input_file_path: "qa-#{generate_suffix}/package-lock.json") + FactoryBot.create( + :sbom_occurrence, + component_version: component_version, + source: source, + project: project, + pipeline: pipeline) + end + + def component_versions + @component_versions ||= Array.new(UNIQUE_COMPONENT_COUNT) do |i| + component = FactoryBot.create(:sbom_component, name: "component-#{generate_suffix}-#{i}") + FactoryBot.create(:sbom_component_version, component: component) + end + end + + def admin + @admin ||= User.admins.first + end + + def generate_suffix + Time.now.to_i + end + end + end +end diff --git a/ee/spec/lib/quality/seeders/dependencies_spec.rb b/ee/spec/lib/quality/seeders/dependencies_spec.rb new file mode 100644 index 0000000000000..de91fa58701ed --- /dev/null +++ b/ee/spec/lib/quality/seeders/dependencies_spec.rb @@ -0,0 +1,21 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Quality::Seeders::Dependencies, feature_category: :dependency_management do + let_it_be(:admin) { create(:admin) } + + subject(:seed) { described_class.new } + + it 'creates a new group' do + expect { seed }.to change { Group.count }.by(1) + end + + describe '#seed!' do + it 'creates expected number of dependencies' do + expected_value = described_class::UNIQUE_COMPONENT_COUNT * described_class::PROJECT_COUNT * 2 + + expect { seed.seed! }.to change { Sbom::Occurrence.count }.by(expected_value) + end + end +end diff --git a/lib/tasks/gitlab/seed.rake b/lib/tasks/gitlab/seed.rake index 8437ae0a31ea9..41830065044ed 100644 --- a/lib/tasks/gitlab/seed.rake +++ b/lib/tasks/gitlab/seed.rake @@ -88,5 +88,13 @@ namespace :gitlab do puts "\nDone." end end + + desc "GitLab | Seed | Seed a new group with dependencies" + task :dependencies, [] => :environment do |t, args| + puts "\nSeeding a new group with dependencies" + seeder = Quality::Seeders::Dependencies.new + seeder.seed! + puts "\nDone." + end end end -- GitLab