spec/lib/gitlab/build/info/git_spec.rb (404 lines of code) (raw):

require 'spec_helper' require 'gitlab/build/info/git' RSpec.describe Build::Info::Git do before do stub_default_package_version ce_tags = "16.1.1+ce.0\n16.0.0+rc42.ce.0\n15.11.1+ce.0\n15.11.0+ce.0\n15.10.0+ce.0\n15.10.0+rc42.ce.0\n15.1.0+ce.0\n" ee_tags = "16.1.1+ee.0\n16.0.0+rc42.ee.0\n15.11.1+ee.0\n15.11.0+ee.0\n15.10.0+ee.0\n15.10.0+rc42.ee.0\n15.1.0+ee.0\n" allow(Gitlab::Util).to receive(:shellout_stdout).with(/git -c versionsort.*ce/).and_return(ce_tags) allow(Gitlab::Util).to receive(:shellout_stdout).with(/git -c versionsort.*ee/).and_return(ee_tags) end describe '.branch_name' do context 'in tags' do context 'in CI' do before do stub_tag('16.1.1+ee.0') end it 'returns nil' do expect(described_class.branch_name).to be_nil end end context 'not in CI' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '') allow(Gitlab::Util).to receive(:shellout_stdout).with('git rev-parse --abbrev-ref HEAD').and_return('HEAD') end it 'returns nil' do expect(described_class.branch_name).to be_nil end end end context 'in branches' do context 'in CI' do context 'in MR pipelines' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') end it 'returns branch name from CI variable' do expect(described_class.branch_name).to eq('my-feature-branch') end end context 'in regular branch pipelines' do before do stub_env_var('CI_COMMIT_BRANCH', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '') end it 'returns branch name from CI variable' do expect(described_class.branch_name).to eq('my-feature-branch') end end end context 'not in CI' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_COMMIT_TAG', '') stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '') allow(Gitlab::Util).to receive(:shellout_stdout).with('git rev-parse --abbrev-ref HEAD').and_return('my-feature-branch') end it 'computes branch name from git' do expect(described_class.branch_name).to eq('my-feature-branch') end end end end describe '.tag_name' do context 'in tags' do context 'in CI' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_COMMIT_TAG', '16.1.1+ee.0') end it 'returns tag name from CI variables' do expect(described_class.tag_name).to eq('16.1.1+ee.0') end context 'not in CI' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_COMMIT_TAG', '') allow(Gitlab::Util).to receive(:shellout_stdout).with('git describe --tags --exact-match').and_return('16.1.1+ee.0') end it 'computes tag name from git' do expect(described_class.tag_name).to eq('16.1.1+ee.0') end end end end context 'in branches' do before do stub_branch('my-feature-branch') end it 'returns nil' do expect(described_class.tag_name).to be_nil end end context 'if some other error is raised' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_COMMIT_TAG', '') allow(Gitlab::Util).to receive(:shellout_stdout).with('git describe --tags --exact-match').and_raise(Gitlab::Util::ShellOutExecutionError.new("", 100, "", "Some Other Error")) end it 'raises the error' do expect { described_class.tag_name }.to raise_error(/Some Other Error/) end end end describe '.commit_sha' do context 'from CI' do before do stub_env_var('CI_COMMIT_SHA', '3cd8e712ccd3c3f356108ec1a5cbeecbf3d3be88') allow(Gitlab::Util).to receive(:shellout_stdout).with('git rev-parse HEAD').and_return('some-other-sha') end it 'returns truncated commit sha from CI variable' do expect(described_class.commit_sha).to eq('3cd8e712') end end context 'not from CI' do before do stub_env_var('CI_COMMIT_SHA', '') allow(Gitlab::Util).to receive(:shellout_stdout).with('git rev-parse HEAD').and_return('3cd8e712ccd3c3f356108ec1a5cbeecbf3d3be88') end it 'returns truncated commit sha from CI variable' do expect(described_class.commit_sha).to eq('3cd8e712') end end end describe '.latest_tag' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '') stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '') end context 'on CE edition' do before do stub_is_ee(false) end context 'on stable branch' do context 'when tags already exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_tag).to eq('15.10.0+ce.0') end end context 'when tags does not exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '16-5-stable') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ce.0') end end context 'when latest tag in the series is an RC tag' do before do stub_env_var('CI_COMMIT_BRANCH', '16-0-stable') end it 'returns the RC tag' do expect(described_class.latest_tag).to eq('16.0.0+rc42.ce.0') end end end context 'on feature branch' do before do stub_env_var('CI_COMMIT_BRANCH', 'my-feature-branch') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ce.0') end end context 'on merge requests' do context 'when they target a feature branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', 'master') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ce.0') end end context 'when they target a stable branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_tag).to eq('15.10.0+ce.0') end end context 'when they target 15-1-stable' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '15-1-stable') end it 'returns the latest tag in the 15.1 series' do expect(described_class.latest_tag).to eq('15.1.0+ce.0') end end end end context 'on EE edition' do before do stub_is_ee(true) end context 'on stable branch' do context 'when tags already exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_tag).to eq('15.10.0+ee.0') end end context 'when tags does not exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '16-5-stable') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ee.0') end end context 'when latest tag in the series is an RC tag' do before do stub_env_var('CI_COMMIT_BRANCH', '16-0-stable') end it 'returns the RC tag' do expect(described_class.latest_tag).to eq('16.0.0+rc42.ee.0') end end end context 'on feature branch' do before do stub_env_var('CI_COMMIT_BRANCH', 'my-feature-branch') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ee.0') end end context 'on merge requests' do context 'when they target a feature branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', 'master') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ee.0') end end context 'when they target a stable branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_tag).to eq('15.10.0+ee.0') end end end end end describe '.latest_stable_tag' do before do stub_env_var('CI_COMMIT_BRANCH', '') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '') stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', '') end context 'on CE edition' do before do stub_is_ee(false) end context 'on stable branch' do context 'when tags already exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_stable_tag).to eq('15.10.0+ce.0') end end context 'when tags does not exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '16-5-stable') end it 'returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ce.0') end end context 'when latest tag in the series is an RC tag' do before do stub_env_var('CI_COMMIT_BRANCH', '16-0-stable') end it 'skips the RC tag and returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ce.0') end end end context 'on feature branch' do before do stub_env_var('CI_COMMIT_BRANCH', 'my-feature-branch') end it 'returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ce.0') end end context 'on merge requests' do context 'when they target a feature branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', 'master') end it 'returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ce.0') end end context 'when they target a stable branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_stable_tag).to eq('15.10.0+ce.0') end end context 'when they target 15-1-stable' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '15-1-stable') end it 'returns the latest tag in the 15.1 series' do expect(described_class.latest_stable_tag).to eq('15.1.0+ce.0') end end end end context 'on EE edition' do before do stub_is_ee(true) end context 'on stable branch' do context 'when tags already exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_stable_tag).to eq('15.10.0+ee.0') end end context 'when tags does not exist in the stable version series' do before do stub_env_var('CI_COMMIT_BRANCH', '16-5-stable') end it 'returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ee.0') end end context 'when latest tag in the series is an RC tag' do before do stub_env_var('CI_COMMIT_BRANCH', '16-0-stable') end it 'skips the RC tag and returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ee.0') end end end context 'on feature branch' do before do stub_env_var('CI_COMMIT_BRANCH', 'my-feature-branch') end it 'returns the latest available tag' do expect(described_class.latest_stable_tag).to eq('16.1.1+ee.0') end end context 'on merge requests' do context 'when they target a feature branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', 'master') end it 'returns the latest available tag' do expect(described_class.latest_tag).to eq('16.1.1+ee.0') end end context 'when they target a stable branch' do before do stub_env_var('CI_MERGE_REQUEST_SOURCE_BRANCH_NAME', 'my-feature-branch') stub_env_var('CI_MERGE_REQUEST_TARGET_BRANCH_NAME', '15-10-stable') end it 'returns the latest tag in the stable version series' do expect(described_class.latest_tag).to eq('15.10.0+ee.0') end end end end context 'when a level is specified' do before do stub_is_ee(true) stub_env_var('CI_COMMIT_BRANCH', 'my-feature-branch') end it 'returns recent tag at specified position' do expect(described_class.latest_stable_tag(level: 2)).to eq('15.11.1+ee.0') end end end end