spec/lib/tasks/internal_rake_spec.rb (272 lines of code) (raw):

# frozen_string_literal: true require 'rake_helper' describe 'internal tasks', :rake do describe 'issue', task: 'internal:issue' do let(:issue) { instance_double(ReleaseTools::InternalRelease::Issue) } let(:version) { ReleaseTools::Version.new('15.2.6') } let(:coordinator) { instance_double(ReleaseTools::InternalRelease::Coordinator) } let(:notifier) { instance_double(ReleaseTools::Slack::InternalRelease::UnsupportedVersionNotifier) } let(:supported_versions) { ['15.2', '15.1'] } before do allow(issue).to receive_messages(title: 'title', description: 'description') allow(coordinator).to receive(:supported_minor_versions) .and_return(supported_versions) end context 'when no arguments are provided' do it 'calls the InternalRelease::Issue class with nil values' do expect(ReleaseTools::InternalRelease::Issue).to receive(:new) .with(iteration: nil) .and_return(issue) task.invoke end end context 'when only iteration is provided' do it 'calls the InternalRelease::Issue class with the iteration value' do expect(ReleaseTools::InternalRelease::Issue).to receive(:new) .with(iteration: '1') .and_return(issue) task.invoke('1') end end context 'when both iteration and a supported version are provided' do it 'checks for unsupported versions and creates an issue' do expect(ReleaseTools::GitlabReleasesGemClient) .to receive(:latest_patch_for_version) .with('15.2').and_return('15.2.6') expect(ReleaseTools::InternalRelease::Issue).to receive(:new) .with(iteration: '1', version: version) .and_return(issue) expect(ReleaseTools::Slack::InternalRelease::UnsupportedVersionNotifier) .to receive(:new).with('15.2').and_return(notifier) expect(notifier).to receive(:execute) task.invoke('1', '15.2') end end context 'when only version is provided' do it 'checks for unsupported versions and creates an issue with nil iteration' do expect(ReleaseTools::GitlabReleasesGemClient).to receive(:latest_patch_for_version) .with('15.2').and_return('15.2.6') expect(ReleaseTools::InternalRelease::Issue).to receive(:new) .with(iteration: nil, version: version) .and_return(issue) expect(ReleaseTools::Slack::InternalRelease::UnsupportedVersionNotifier) .to receive(:new).with('15.2').and_return(notifier) expect(notifier).to receive(:execute) task.invoke(nil, '15.2') end end end describe 'prepare:start', task: 'internal:prepare:start' do it 'starts the prepare stage' do expect(ReleaseTools::Slack::ReleasePipelineStartNotifier).to receive(:new) .with(release_type: :internal, stage: :start) .and_return(instance_double(ReleaseTools::Slack::ReleasePipelineStartNotifier, execute: true)) task.invoke end end describe 'prepare:create_dedicated_issue', task: 'internal:prepare:create_dedicated_issue' do let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal4'), ReleaseTools::Version.new('15.1.2-internal4') ] end let(:issue) { instance_double(ReleaseTools::InternalRelease::DedicatedIssue) } before do allow(issue).to receive_messages(title: 'title', description: 'description') end it 'creates an internal release issue in the dedicated tracker' do versions_string = '15.2.1-internal4 15.1.2-internal4' ClimateControl.modify INTERNAL_VERSIONS: versions_string do expect(ReleaseTools::InternalRelease::DedicatedIssue).to receive(:new) .with(versions: versions) .and_return(issue) task.invoke end end end describe 'prepare:notify_dedicated', task: 'internal:prepare:notify_dedicated' do let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal4'), ReleaseTools::Version.new('15.1.2-internal4') ] end let(:issue) { instance_double(ReleaseTools::InternalRelease::DedicatedIssue) } it 'notifies dedicated slack channels that the internal release has started' do versions_string = '15.2.1-internal4 15.1.2-internal4' ClimateControl.modify INTERNAL_VERSIONS: versions_string do expect(ReleaseTools::Slack::InternalRelease::DedicatedStartNotifier).to receive(:new) .with(versions) .and_return( instance_double( ReleaseTools::Slack::InternalRelease::DedicatedStartNotifier, execute: true ) ) task.invoke end end end describe 'prepare:check_component_branch_pipeline_status', task: 'internal:prepare:check_component_branch_pipeline_status' do let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal4'), ReleaseTools::Version.new('15.1.2-internal4') ] end it 'ensures stable branches are green with the versions from VERSIONS env var' do versions_string = '15.2.1-internal4 15.1.2-internal4' ClimateControl.modify INTERNAL_VERSIONS: versions_string do expect(ReleaseTools::InternalRelease::Prepare::ComponentBranchVerifier).to receive(:new) .with(versions) .and_return( instance_double( ReleaseTools::InternalRelease::Prepare::ComponentBranchVerifier, execute: true ) ) task.invoke end end end describe 'release:start', task: 'internal:release:start' do it 'starts the release stage' do expect(ReleaseTools::Slack::ReleasePipelineStartNotifier).to receive(:new).with(release_type: :internal, stage: :release) .and_return(instance_double(ReleaseTools::Slack::ReleasePipelineStartNotifier, execute: true)) task.invoke end end describe 'release:build_package', task: 'internal:release:build_package' do let(:iteration) { 5 } let(:version) { ReleaseTools::Version.new('15.2.1-internal5') } it 'performs the steps required to build a private package' do release = instance_double(ReleaseTools::InternalRelease::Release) allow(ReleaseTools::InternalRelease::Release).to receive(:new).and_return(release) expect(release).to receive(:execute) expect(ReleaseTools::InternalRelease::Release).to receive(:new) .with(version: version).and_return(release) task.invoke('15.2.1-internal5') end end describe 'release:generate_dynamic_pipeline', task: 'internal:release:generate_dynamic_pipeline' do let(:release_jobs) { instance_double(ReleaseTools::InternalRelease::ReleaseDynamicPipeline) } let(:generated_jobs) { "dummy:output" } before do allow(ReleaseTools::InternalRelease::ReleaseDynamicPipeline) .to receive(:new).with(versions).and_return(release_jobs) end context 'when INTERNAL_VERSIONS is set with multiple versions' do let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal8'), ReleaseTools::Version.new('15.1.2-internal8') ] end let(:versions_string) { '15.2.1-internal8 15.1.2-internal8' } it 'correctly processes multiple versions' do ClimateControl.modify INTERNAL_VERSIONS: versions_string do expect(ReleaseTools::InternalRelease::ReleaseDynamicPipeline) .to receive(:new).with(versions).and_return(release_jobs) expect(release_jobs).to receive(:generate).and_return(generated_jobs) expect(File).to receive(:write).with('dynamic-gitlab-ci.yml', generated_jobs) task.invoke end end end context 'when INTERNAL_VERSIONS is set with a single version' do let(:versions) { [ReleaseTools::Version.new('15.2.1-internal3')] } let(:version_string) { '15.2.1-internal3' } it 'correctly processes a single version' do ClimateControl.modify INTERNAL_VERSIONS: version_string do expect(ReleaseTools::InternalRelease::ReleaseDynamicPipeline) .to receive(:new).with(versions).and_return(release_jobs) expect(release_jobs).to receive(:generate).and_return(generated_jobs) expect(File).to receive(:write).with('dynamic-gitlab-ci.yml', generated_jobs) task.invoke end end end context 'when INTERNAL_VERSIONS is not set' do let(:versions) { nil } let(:version_string) { nil } it 'raises a NoMethodError' do ClimateControl.modify INTERNAL_VERSIONS: nil do expect { task.invoke }.to raise_error( NoMethodError ) end end end end describe 'verify:start', task: 'internal:verify:start' do it 'starts the verify stage' do expect(ReleaseTools::Slack::ReleasePipelineStartNotifier).to receive(:new).with(release_type: :internal, stage: :verify) .and_return(instance_double(ReleaseTools::Slack::ReleasePipelineStartNotifier, execute: true)) task.invoke end end describe 'verify:package_availability', task: 'internal:verify:package_availability' do let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal0'), ReleaseTools::Version.new('15.1.2-internal0') ] end let(:versions_string) { '15.2.1-internal0 15.1.2-internal0' } it 'checks if the package has been built and available on the pre-release channel' do check = instance_double(ReleaseTools::Services::OmnibusPackages::Tagging) allow(ReleaseTools::Services::OmnibusPackages::Tagging) .to receive(:new).and_return(check) expect(check).to receive(:execute).twice expect(ReleaseTools::Services::OmnibusPackages::Tagging).to receive(:new) .with(version: versions[0], package_type: :internal) .and_return(check) expect(ReleaseTools::Services::OmnibusPackages::Tagging).to receive(:new) .with(version: versions[1], package_type: :internal) .and_return(check) ClimateControl.modify INTERNAL_VERSIONS: versions_string do task.invoke end end end describe 'finalize:start', task: 'internal:finalize:start' do it 'starts the finalize stage' do expect(ReleaseTools::Slack::ReleasePipelineStartNotifier).to receive(:new).with(release_type: :internal, stage: :finalize) .and_return(instance_double(ReleaseTools::Slack::ReleasePipelineStartNotifier, execute: true)) task.invoke end end describe 'finalize:notify_releases', task: 'internal:finalize:notify_releases' do let(:versions) do [ ReleaseTools::Version.new('15.2.1-internal1'), ReleaseTools::Version.new('15.1.2-internal1') ] end let(:versions_string) { '15.2.1-internal1 15.1.2-internal1' } it 'Notify release managers that the internal packages are now available' do ClimateControl.modify INTERNAL_VERSIONS: versions_string do expect(ReleaseTools::InternalRelease::Finalize::ReleaseManagersNotifier) .to receive(:new) .with(versions) .and_return( instance_double( ReleaseTools::InternalRelease::Finalize::ReleaseManagersNotifier, execute: true ) ) task.invoke end end end describe 'finalize:notify_dedicated', task: 'internal:finalize:notify_dedicated' do it 'Notify Dedicated that the internal packages are now available' do expect(ReleaseTools::InternalRelease::Finalize::DedicatedNotifier) .to receive(:new) .and_return( instance_double( ReleaseTools::InternalRelease::Finalize::DedicatedNotifier, execute: true ) ) task.invoke end end end