spec/gitlab/qa/release_spec.rb (599 lines of code) (raw):

# frozen_string_literal: true describe Gitlab::QA::Release do let(:specific_ce_tag) { '10.8.4-ce.0' } let(:specific_ce_qa_tag) { '10.8.4-ce' } let(:specific_ee_tag) { '11.0.0-rc5.ee.1' } let(:specific_ee_qa_tag) { '11.0.0-rc5-ee' } let(:specific_version_timestamp_refs_tag) { '12.4.201910071518-933febe7c6d.aae3944cae6' } let(:gitlab_ref) { '933febe7c6d' } let(:full_ce_address) { 'registry.gitlab.com:5000/foo/gitlab/gitlab-ce' } let(:full_ce_address_with_simple_tag) { "#{full_ce_address}:latest" } let(:full_ce_address_with_complex_tag) { "#{full_ce_address}:#{specific_ce_tag}" } let(:full_ee_address) { 'registry.gitlab.com:5000/foo/gitlab/gitlab-ee' } let(:full_ee_address_with_simple_tag) { "#{full_ee_address}:latest" } let(:full_ee_address_with_complex_tag) { "#{full_ee_address}:#{specific_ee_tag}" } let(:dev_address) { 'dev.gitlab.org:5005/gitlab/omnibus-gitlab/gitlab-ee' } let(:full_dev_address) { "#{dev_address}:latest" } let(:full_dev_address_with_version_timestamp_refs_tag) { "#{dev_address}:#{specific_version_timestamp_refs_tag}" } let(:ce_image) { 'gitlab/gitlab-ce' } let(:ee_image) { 'gitlab/gitlab-ee' } let(:ce_qa_image) { "#{ce_image}-qa" } let(:full_ce_qa_image) { "#{full_ce_address}-qa" } let(:full_ee_qa_image) { "#{full_ee_address}-qa" } let(:dev_qa_address) { "dev.gitlab.org:5005/gitlab/gitlab-ee/gitlab-ee-qa" } let(:omnibus_mirror_image) do "registry.gitlab.com/gitlab-org/build/omnibus-gitlab-mirror/gitlab-ee:db5d4783b4689cb78c32f613b8888e06684097e5" end describe '#initialize' do context 'when release is valid' do subject(:release) { described_class.new('ce') } it 'does not raise an error' do expect { release }.not_to raise_error described_class::InvalidImageNameError end end context 'when release is invalid' do subject(:release) { described_class.new('--') } it 'raises an error' do expect { release }.to raise_error described_class::InvalidImageNameError end end end describe '#to_s' do context 'when release is ce' do subject(:release) { described_class.new('ce') } it { expect(release.to_s).to eq 'gitlab/gitlab-ce:nightly' } end context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.to_s).to eq 'gitlab/gitlab-ce:nightly' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.to_s).to eq 'gitlab/gitlab-ee:nightly' } end context 'when release is EDITION:tag' do subject(:release) { described_class.new("CE:#{specific_ce_tag}") } it { expect(release.to_s).to eq "gitlab/gitlab-ce:#{specific_ce_tag}" } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.to_s).to eq "gitlab/gitlab-ce:#{specific_ce_tag}" } end context 'when release is a full CE address' do context 'without a tag' do subject(:release) { described_class.new(full_ce_address) } it { expect(release.to_s).to eq full_ce_address_with_simple_tag } end context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.to_s).to eq full_ce_address_with_simple_tag } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.to_s).to eq full_ce_address_with_complex_tag } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.to_s).to eq full_ee_address_with_simple_tag } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.to_s).to eq full_ee_address_with_complex_tag } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.to_s).to eq "#{ce_image}:latest" } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.to_s).to eq "#{full_ce_address}:latest" } end end describe '#previous_stable' do context 'when release is CE' do subject(:release) { described_class.new('CE').previous_stable } it { expect(release.image).to eq 'gitlab/gitlab-ce' } it { expect(release.tag).to eq 'latest' } end context 'when release is EE' do subject(:release) { described_class.new('EE').previous_stable } it { expect(release.image).to eq 'gitlab/gitlab-ee' } it { expect(release.tag).to eq 'latest' } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.image).to eq 'gitlab/gitlab-ce' } it { expect(release.tag).to eq specific_ce_tag } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) do described_class.new(full_ce_address_with_simple_tag).previous_stable end it { expect(release.image).to eq 'gitlab/gitlab-ce' } it { expect(release.tag).to eq 'latest' } end context 'with a complex tag' do subject(:release) do described_class.new(full_ce_address_with_complex_tag).previous_stable end it { expect(release.image).to eq 'gitlab/gitlab-ce' } it { expect(release.tag).to eq 'latest' } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) do described_class.new(full_ee_address_with_simple_tag).previous_stable end it { expect(release.image).to eq 'gitlab/gitlab-ee' } it { expect(release.tag).to eq 'latest' } end context 'with a complex tag' do subject(:release) do described_class.new(full_ee_address_with_complex_tag).previous_stable end it { expect(release.image).to eq 'gitlab/gitlab-ee' } it { expect(release.tag).to eq 'latest' } end end context 'when release is a QA image' do subject(:release) do described_class.new("#{ce_qa_image}:nightly").previous_stable end it { expect(release.image).to eq ce_image } it { expect(release.tag).to eq 'latest' } end context 'when release is a full QA image' do subject(:release) do described_class.new("#{full_ce_qa_image}:nightly").previous_stable end it { expect(release.image).to eq ce_image } it { expect(release.tag).to eq 'latest' } end end describe '#edition' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.edition).to eq :ce } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.edition).to eq :ee } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.edition).to eq :ce } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.edition).to eq :ce } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.edition).to eq :ce } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.edition).to eq :ee } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.edition).to eq :ee } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.edition).to eq :ce } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.edition).to eq :ce } end end describe '#ee?' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release).not_to be_ee } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release).to be_ee } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release).not_to be_ee } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release).not_to be_ee } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release).not_to be_ee } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release).to be_ee } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release).to be_ee } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release).not_to be_ee } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release).not_to be_ee } end end describe '#to_ee' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.to_ee.to_s).to eq 'gitlab/gitlab-ee:nightly' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.to_ee.to_s).to eq release.to_s } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.to_ee.to_s).to eq "gitlab/gitlab-ee:#{specific_ce_tag}" } end context 'when tag includes `ce`' do subject(:release) { described_class.new('CE:abcdcef') } it { expect(release.to_ee.to_s).to eq 'gitlab/gitlab-ee:abcdcef' } end context 'when tag includes `ee`' do subject(:release) { described_class.new('CE:abcdeef') } it { expect(release.to_ee.to_s).to eq 'gitlab/gitlab-ee:abcdeef' } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.to_ee.to_s).to eq full_ee_address_with_simple_tag } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.to_ee.to_s).to eq "#{full_ee_address}:#{specific_ce_tag}" } end context 'with `ce` in the address outside of the image' do let(:ce_image) { 'registry.gitlab.com/cef/gitlab/gitlab-ce:latest' } let(:ee_image) { 'registry.gitlab.com/cef/gitlab/gitlab-ee:latest' } subject(:release) { described_class.new(ce_image) } it { expect(release.to_ee.to_s).to eq ee_image } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.to_ee.to_s).to eq release.to_s } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.to_ee.to_s).to eq release.to_s } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.to_ee.to_s).to eq "#{ee_image}:latest" } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.to_ee.to_s).to eq "#{full_ee_address}:latest" } end end describe '#image' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.image).to eq 'gitlab/gitlab-ce' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.image).to eq 'gitlab/gitlab-ee' } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.image).to eq 'gitlab/gitlab-ce' } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.image).to eq full_ce_address } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.image).to eq full_ce_address } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.image).to eq full_ee_address } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.image).to eq full_ee_address } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.image).to eq ce_image } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.image).to eq full_ce_address } end end describe '#qa_image' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.qa_image).to eq 'gitlab/gitlab-ce-qa' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.qa_image).to eq 'gitlab/gitlab-ee-qa' } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.qa_image).to eq "#{full_ce_address}-qa" } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.qa_image).to eq "#{full_ce_address}-qa" } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.qa_image).to eq full_ee_qa_image } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.qa_image).to eq full_ee_qa_image } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.qa_image).to eq ce_qa_image } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.qa_image).to eq full_ce_qa_image } end context 'when release is a dev image with gitlab ref in tag' do subject(:release) { described_class.new(full_dev_address_with_version_timestamp_refs_tag) } it { expect(release.qa_image).to eq dev_qa_address } end end describe '#project_name' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.project_name).to eq 'gitlab-ce' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.project_name).to eq 'gitlab-ee' } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.project_name).to eq 'gitlab-ce' } end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.project_name).to eq 'gitlab-ce' } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.project_name).to eq 'gitlab-ce' } end end describe '#tag' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.tag).to eq 'nightly' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.tag).to eq 'nightly' } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.tag).to eq specific_ce_tag } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.tag).to eq 'latest' } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.tag).to eq specific_ce_tag } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.tag).to eq 'latest' } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.tag).to eq specific_ee_tag } end end context 'when release is a QA image without a tag' do subject(:release) { described_class.new(ce_qa_image) } it { expect(release.tag).to eq 'latest' } end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:nightly") } it { expect(release.tag).to eq 'nightly' } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:nightly") } it { expect(release.tag).to eq 'nightly' } end end describe '#qa_tag' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.qa_tag).to eq 'nightly' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.qa_tag).to eq 'nightly' } end context 'when release is a full CE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.qa_tag).to eq 'latest' } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.qa_tag).to eq specific_ce_qa_tag } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.qa_tag).to eq 'latest' } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.qa_tag).to eq specific_ee_qa_tag } end end context 'when tag is already in the good form' do context 'with a simple tag' do subject(:release) { described_class.new('ce:11.0.8-rc8-ee') } it { expect(release.qa_tag).to eq '11.0.8-rc8-ee' } end context 'with a QA image and a numeric tag' do subject(:release) { described_class.new('gitlab/gitlab-ce-qa:11.1.8') } it { expect(release.qa_tag).to eq '11.1.8' } end end context 'when release is a QA image without a tag' do subject(:release) { described_class.new(ce_qa_image) } it { expect(release.qa_tag).to eq 'latest' } end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:nightly") } it { expect(release.qa_tag).to eq 'nightly' } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:nightly") } it { expect(release.qa_tag).to eq 'nightly' } end context 'when release is a dev image with gitlab ref in tag' do subject(:release) { described_class.new(full_dev_address_with_version_timestamp_refs_tag) } it { expect(release.qa_tag).to eq gitlab_ref } end end describe '#dev_gitlab_org?' do context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release).not_to be_dev_gitlab_org } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release).not_to be_dev_gitlab_org } end context 'when release is a full address from non-dev' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release).not_to be_dev_gitlab_org } end context 'when release is a full address from dev' do subject(:release) { described_class.new(full_dev_address) } it { expect(release).to be_dev_gitlab_org } end end describe '#omnibus_mirror?' do before do allow(Gitlab::QA::Runtime::Env).to receive(:ci_project_path).and_return("gitlab-org/gitlab") end context 'when image is a full ce address' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.omnibus_mirror?).to be false } end context 'when image is a dev image' do subject(:release) { described_class.new(full_dev_address) } it { expect(release.omnibus_mirror?).to be false } end context 'when image is omnibus-mirror image' do subject(:release) { described_class.new(omnibus_mirror_image) } it { expect(release.omnibus_mirror?).to be true } it { expect(release.qa_image).to eq("registry.gitlab.com/gitlab-org/gitlab/gitlab-ee-qa") } end end describe '#api_project_name' do context 'when release is ce' do subject(:release) { described_class.new('ce') } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'when release is CE' do subject(:release) { described_class.new('CE') } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'when release is ee' do subject(:release) { described_class.new('ee') } it { expect(release.api_project_name).to eq 'gitlab' } end context 'when release is EE' do subject(:release) { described_class.new('EE') } it { expect(release.api_project_name).to eq 'gitlab' } end context 'when release is EDITION:tag' do subject(:release) { described_class.new("CE:#{specific_ce_tag}") } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'when release is edition:tag' do subject(:release) { described_class.new("ce:#{specific_ce_tag}") } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'when release is a full CE address' do context 'without a tag' do subject(:release) { described_class.new(full_ce_address) } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'with a simple tag' do subject(:release) { described_class.new(full_ce_address_with_simple_tag) } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'with a complex tag' do subject(:release) { described_class.new(full_ce_address_with_complex_tag) } it { expect(release.api_project_name).to eq 'gitlab-foss' } end end context 'when release is a full EE address' do context 'with a simple tag' do subject(:release) { described_class.new(full_ee_address_with_simple_tag) } it { expect(release.api_project_name).to eq 'gitlab' } end context 'with a complex tag' do subject(:release) { described_class.new(full_ee_address_with_complex_tag) } it { expect(release.api_project_name).to eq 'gitlab' } end end context 'when release is a QA image' do subject(:release) { described_class.new("#{ce_qa_image}:latest") } it { expect(release.api_project_name).to eq 'gitlab-foss' } end context 'when release is a full QA image' do subject(:release) { described_class.new("#{full_ce_qa_image}:latest") } it { expect(release.api_project_name).to eq 'gitlab-foss' } end end end