diff options
author | Krasimir Angelov <kangelov@gitlab.com> | 2019-05-30 09:40:53 +0300 |
---|---|---|
committer | Fabio Pitino <fpitino@gitlab.com> | 2019-06-06 11:21:18 +0300 |
commit | ad9ae16d8a44dd2523bd6e6109db9fe2da45d3a5 (patch) | |
tree | ee8445389c89b4c7f5cc71c3d35f469345a5016f /spec | |
parent | 3fd99b4e7a58843943ade87a3658d477278aa412 (diff) |
Add project level git depth setting
Introduce default_git_depth in project's CI/CD settings and set it to
50. Use it if there is no GIT_DEPTH variable specified. Apply this
default only to newly created projects and keep it nil for old ones
in order to not break pipelines that rely on non-shallow clones.
default_git_depth can be updated from CI/CD Settings in the UI, must be
either nil or integer between 0 and 1000 (incl).
Inherit default_git_depth from the origin project when forking projects.
MR pipelines are run on a MR ref (refs/merge-requests/:iid/merge) and it
contains unique commit (i.e. merge commit) which doesn't exist in the
other branch/tags refs. We need to add it cause otherwise it may break
pipelines for old projects that have already enabled Pipelines for merge
results and have git depth 0.
Document new default_git_depth project CI/CD setting
Diffstat (limited to 'spec')
8 files changed, 104 insertions, 26 deletions
diff --git a/spec/controllers/projects/settings/ci_cd_controller_spec.rb b/spec/controllers/projects/settings/ci_cd_controller_spec.rb index b91a4df40a5..117b9cf7915 100644 --- a/spec/controllers/projects/settings/ci_cd_controller_spec.rb +++ b/spec/controllers/projects/settings/ci_cd_controller_spec.rb @@ -200,6 +200,21 @@ describe Projects::Settings::CiCdController do expect(response).to redirect_to(namespace_project_settings_ci_cd_path) end end + + context 'when default_git_depth is not specified' do + let(:params) { { ci_cd_settings_attributes: { default_git_depth: 10 } } } + + before do + project.ci_cd_settings.update!(default_git_depth: nil) + end + + it 'set specified git depth' do + subject + + project.reload + expect(project.default_git_depth).to eq(10) + end + end end end end diff --git a/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb b/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb index 27281333348..22ec09d44ac 100644 --- a/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb +++ b/spec/lib/gitlab/background_migration/delete_diff_files_spec.rb @@ -3,6 +3,12 @@ require 'spec_helper' # rubocop:disable RSpec/FactoriesInMigrationSpecs describe Gitlab::BackgroundMigration::DeleteDiffFiles, :migration, :sidekiq, schema: 20180619121030 do describe '#perform' do + before do + # This migration was created before we introduced ProjectCiCdSetting#default_git_depth + allow_any_instance_of(ProjectCiCdSetting).to receive(:default_git_depth?).and_return(true) + allow_any_instance_of(ProjectCiCdSetting).to receive(:default_git_depth).and_return(nil) + end + context 'when diff files can be deleted' do let(:merge_request) { create(:merge_request, :merged) } let!(:merge_request_diff) do diff --git a/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb b/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb index 3e009fed0f1..317745bcf83 100644 --- a/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb +++ b/spec/lib/gitlab/background_migration/populate_external_pipeline_source_spec.rb @@ -9,6 +9,9 @@ describe Gitlab::BackgroundMigration::PopulateExternalPipelineSource, :migration before do # This migration was created before we introduced metadata configs stub_feature_flags(ci_build_metadata_config: false) + # This migration was created before we introduced ProjectCiCdSetting#default_git_depth + allow_any_instance_of(ProjectCiCdSetting).to receive(:default_git_depth?).and_return(true) + allow_any_instance_of(ProjectCiCdSetting).to receive(:default_git_depth).and_return(nil) end let!(:internal_pipeline) { create(:ci_pipeline, source: :web) } diff --git a/spec/migrations/remove_orphaned_label_links_spec.rb b/spec/migrations/remove_orphaned_label_links_spec.rb index 13b8919343e..4c8135cd08c 100644 --- a/spec/migrations/remove_orphaned_label_links_spec.rb +++ b/spec/migrations/remove_orphaned_label_links_spec.rb @@ -10,6 +10,12 @@ describe RemoveOrphanedLabelLinks, :migration do let(:project) { create(:project) } # rubocop:disable RSpec/FactoriesInMigrationSpecs let(:label) { create_label } + before do + # This migration was created before we introduced ProjectCiCdSetting#default_git_depth + allow_any_instance_of(ProjectCiCdSetting).to receive(:default_git_depth?).and_return(true) + allow_any_instance_of(ProjectCiCdSetting).to receive(:default_git_depth).and_return(nil) + end + context 'add foreign key on label_id' do let!(:label_link_with_label) { create_label_link(label_id: label.id) } let!(:label_link_without_label) { create_label_link(label_id: nil) } diff --git a/spec/models/project_ci_cd_setting_spec.rb b/spec/models/project_ci_cd_setting_spec.rb index 4aa62028169..80f75f45e43 100644 --- a/spec/models/project_ci_cd_setting_spec.rb +++ b/spec/models/project_ci_cd_setting_spec.rb @@ -21,4 +21,26 @@ describe ProjectCiCdSetting do 2.times { described_class.available? } end end + + describe 'validations' do + it { is_expected.to validate_numericality_of(:default_git_depth).only_integer.is_greater_than_or_equal_to(0).is_less_than_or_equal_to(1000).allow_nil } + end + + describe '#default_git_depth' do + let(:default_value) { described_class::DEFAULT_GIT_DEPTH } + + it 'sets default value for new records' do + project = create(:project) + + expect(project.ci_cd_settings.default_git_depth).to eq(default_value) + end + + it 'does not set default value if present' do + project = build(:project) + project.build_ci_cd_settings(default_git_depth: 42) + project.save! + + expect(project.reload.ci_cd_settings.default_git_depth).to eq(42) + end + end end diff --git a/spec/presenters/ci/build_runner_presenter_spec.rb b/spec/presenters/ci/build_runner_presenter_spec.rb index 3430111ca9e..9ed8e3a4e0a 100644 --- a/spec/presenters/ci/build_runner_presenter_spec.rb +++ b/spec/presenters/ci/build_runner_presenter_spec.rb @@ -119,23 +119,23 @@ describe Ci::BuildRunnerPresenter do end describe '#git_depth' do - subject { presenter.git_depth } - let(:build) { create(:ci_build) } - it 'returns the correct git depth' do - is_expected.to eq(0) - end + subject(:git_depth) { presenter.git_depth } context 'when GIT_DEPTH variable is specified' do before do create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 1, pipeline: build.pipeline) end - it 'returns the correct git depth' do - is_expected.to eq(1) + it 'returns its value' do + expect(git_depth).to eq(1) end end + + it 'defaults to git depth setting for the project' do + expect(git_depth).to eq(build.project.default_git_depth) + end end describe '#refspecs' do @@ -144,24 +144,24 @@ describe Ci::BuildRunnerPresenter do let(:build) { create(:ci_build) } it 'returns the correct refspecs' do - is_expected.to contain_exactly('+refs/tags/*:refs/tags/*', - '+refs/heads/*:refs/remotes/origin/*') + is_expected.to contain_exactly("+refs/heads/#{build.ref}:refs/remotes/origin/#{build.ref}") end - context 'when GIT_DEPTH variable is specified' do - before do - create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 1, pipeline: build.pipeline) - end + context 'when ref is tag' do + let(:build) { create(:ci_build, :tag) } it 'returns the correct refspecs' do - is_expected.to contain_exactly("+refs/heads/#{build.ref}:refs/remotes/origin/#{build.ref}") + is_expected.to contain_exactly("+refs/tags/#{build.ref}:refs/tags/#{build.ref}") end - context 'when ref is tag' do - let(:build) { create(:ci_build, :tag) } + context 'when GIT_DEPTH is zero' do + before do + create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 0, pipeline: build.pipeline) + end it 'returns the correct refspecs' do - is_expected.to contain_exactly("+refs/tags/#{build.ref}:refs/tags/#{build.ref}") + is_expected.to contain_exactly('+refs/tags/*:refs/tags/*', + '+refs/heads/*:refs/remotes/origin/*') end end end @@ -173,17 +173,27 @@ describe Ci::BuildRunnerPresenter do it 'returns the correct refspecs' do is_expected - .to contain_exactly('+refs/heads/*:refs/remotes/origin/*', - '+refs/tags/*:refs/tags/*', - '+refs/merge-requests/1/head:refs/merge-requests/1/head') + .to contain_exactly('+refs/merge-requests/1/head:refs/merge-requests/1/head') + end + + context 'when GIT_DEPTH is zero' do + before do + create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 0, pipeline: build.pipeline) + end + + it 'returns the correct refspecs' do + is_expected + .to contain_exactly('+refs/merge-requests/1/head:refs/merge-requests/1/head', + '+refs/heads/*:refs/remotes/origin/*', + '+refs/tags/*:refs/tags/*') + end end context 'when pipeline is legacy detached merge request pipeline' do let(:merge_request) { create(:merge_request, :with_legacy_detached_merge_request_pipeline) } it 'returns the correct refspecs' do - is_expected.to contain_exactly('+refs/tags/*:refs/tags/*', - '+refs/heads/*:refs/remotes/origin/*') + is_expected.to contain_exactly("+refs/heads/#{build.ref}:refs/remotes/origin/#{build.ref}") end end end diff --git a/spec/requests/api/runner_spec.rb b/spec/requests/api/runner_spec.rb index 3202050ac20..038c958b5cc 100644 --- a/spec/requests/api/runner_spec.rb +++ b/spec/requests/api/runner_spec.rb @@ -444,8 +444,8 @@ describe API::Runner, :clean_gitlab_redis_shared_state do 'sha' => job.sha, 'before_sha' => job.before_sha, 'ref_type' => 'branch', - 'refspecs' => %w[+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*], - 'depth' => 0 } + 'refspecs' => ["+refs/heads/#{job.ref}:refs/remotes/origin/#{job.ref}"], + 'depth' => project.default_git_depth } end let(:expected_steps) do @@ -531,7 +531,11 @@ describe API::Runner, :clean_gitlab_redis_shared_state do end end - context 'when GIT_DEPTH is not specified' do + context 'when GIT_DEPTH is not specified and there is no default git depth for the project' do + before do + project.update!(default_git_depth: nil) + end + it 'specifies refspecs' do request_job @@ -587,7 +591,11 @@ describe API::Runner, :clean_gitlab_redis_shared_state do end end - context 'when GIT_DEPTH is not specified' do + context 'when GIT_DEPTH is not specified and there is no default git depth for the project' do + before do + project.update!(default_git_depth: nil) + end + it 'specifies refspecs' do request_job diff --git a/spec/services/projects/fork_service_spec.rb b/spec/services/projects/fork_service_spec.rb index ec3f1782e8f..e8a38287a63 100644 --- a/spec/services/projects/fork_service_spec.rb +++ b/spec/services/projects/fork_service_spec.rb @@ -145,6 +145,14 @@ describe Projects::ForkService do end end + context "CI/CD settings" do + it "inherits default_git_depth from the origin project" do + @from_project.update(default_git_depth: 42) + @to_project = fork_project(@from_project, @to_user) + expect(@to_project.default_git_depth).to eq(42) + end + end + context "when project has restricted visibility level" do context "and only one visibility level is restricted" do before do |