debian-mirror-gitlab/spec/services/ci/create_pipeline_service/partitioning_spec.rb
2023-03-04 22:38:38 +05:30

166 lines
4.3 KiB
Ruby

# frozen_string_literal: true
require 'spec_helper'
RSpec.describe Ci::CreatePipelineService, :yaml_processor_feature_flag_corectness, :aggregate_failures,
:ci_partitionable, feature_category: :continuous_integration do
let_it_be(:project) { create(:project, :repository) }
let_it_be(:user) { project.first_owner }
let(:service) { described_class.new(project, user, { ref: 'master' }) }
let(:config) do
<<-YAML
stages:
- build
- test
- deploy
needs:build:
stage: build
script: echo "needs..."
build:
stage: build
needs: ["needs:build"]
script: make build
test:
stage: test
trigger:
include: child.yml
deploy:
stage: deploy
script: make deploy
environment: review/$CI_JOB_NAME
YAML
end
let(:pipeline) { service.execute(:push).payload }
let(:current_partition_id) { ci_testing_partition_id }
before do
stub_ci_pipeline_yaml_file(config)
allow(Ci::Pipeline).to receive(:current_partition_value) { current_partition_id }
end
it 'assigns partition_id to pipeline' do
expect(pipeline).to be_created_successfully
expect(pipeline.partition_id).to eq(current_partition_id)
end
it 'assigns partition_id to stages' do
stage_partition_ids = pipeline.stages.map(&:partition_id).uniq
expect(stage_partition_ids).to eq([current_partition_id])
end
it 'assigns partition_id to processables' do
processables_partition_ids = pipeline.processables.map(&:partition_id).uniq
expect(processables_partition_ids).to eq([current_partition_id])
end
it 'assigns partition_id to metadata' do
metadata_partition_ids = pipeline.processables.map { |job| job.metadata.partition_id }.uniq
expect(metadata_partition_ids).to eq([current_partition_id])
end
it 'correctly assigns partition and environment' do
metadata = find_metadata('deploy')
expect(metadata.partition_id).to eq(current_partition_id)
expect(metadata.expanded_environment_name).to eq('review/deploy')
end
context 'with pipeline variables' do
let(:variables_attributes) do
[
{ key: 'SOME_VARIABLE', secret_value: 'SOME_VAL' },
{ key: 'OTHER_VARIABLE', secret_value: 'OTHER_VAL' }
]
end
let(:service) do
described_class.new(
project,
user,
{ ref: 'master', variables_attributes: variables_attributes })
end
it 'assigns partition_id to pipeline' do
expect(pipeline).to be_created_successfully
expect(pipeline.partition_id).to eq(current_partition_id)
end
it 'assigns partition_id to variables' do
variables_partition_ids = pipeline.variables.map(&:partition_id).uniq
expect(pipeline.variables.size).to eq(2)
expect(variables_partition_ids).to eq([current_partition_id])
end
it 'assigns partition_id to needs' do
needs = find_need('build')
expect(needs.partition_id).to eq(current_partition_id)
end
end
context 'with parent child pipelines' do
before do
allow(Ci::Pipeline)
.to receive(:current_partition_value)
.and_return(current_partition_id, 301, 302)
allow_next_found_instance_of(Ci::Bridge) do |bridge|
allow(bridge).to receive(:yaml_for_downstream).and_return(child_config)
end
end
let(:config) do
<<-YAML
test:
trigger:
include: child.yml
YAML
end
let(:child_config) do
<<-YAML
test:
script: make test
YAML
end
it 'assigns partition values to child pipelines', :aggregate_failures, :sidekiq_inline do
expect(pipeline).to be_created_successfully
expect(pipeline.child_pipelines).to all be_created_successfully
child_partition_ids = pipeline.child_pipelines.map(&:partition_id).uniq
child_jobs = CommitStatus.where(commit_id: pipeline.child_pipelines)
expect(pipeline.partition_id).to eq(current_partition_id)
expect(child_partition_ids).to eq([current_partition_id])
expect(child_jobs).to all be_a(Ci::Build)
expect(child_jobs.pluck(:partition_id).uniq).to eq([current_partition_id])
end
end
def find_metadata(name)
pipeline
.processables
.find { |job| job.name == name }
.metadata
end
def find_need(name)
pipeline
.processables
.find { |job| job.name == name }
.needs
.first
end
end