diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md index 44893ef9a6d4c55ea50d2e9b73e75201414c7b25..816a918f34e920baec960f93444cfa67c6b2dd76 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 0000000000000000000000000000000000000000..34841a0fc41a5f570e61ab7a5aeaa3291f5e83d0 --- /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 0000000000000000000000000000000000000000..de91fa58701ed4eef486066f41b1768ae8310889 --- /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 8437ae0a31ea99adf5fc591004303f391ac81ebc..41830065044edac6f6f752b77b8e9506c428113c 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