Commit 7ba89e4a authored by Shinya Maeda's avatar Shinya Maeda

Expose refspec and depth to runner

fix

fix and fix

Allow full ref specification for pipeline creation

Add spec

Support backward compatibility

Use ref path

Runner feature flag

Simplify the things

Support fork workflow (Public only)

Expose ref spec

Use refspec

Glooming

Decouple unrelated changes

Add changelog

Revert unrelated file

Decouple unnecessary

Add spec

Use refspecs

Fix changelog

Simplify

Fix coding offence

Fix

a

ok

ok

ok

ok

ok

a

a

Fix

Add workaround for ignore_column

Fix git depth

Fix coding offence

Fix spec

Simplify more

Do not set ignored column

Fix tests

Fix pipeline

Fix spec

fix fixture yes

Revert nonsense

fix

Revert more

ok

Decouple mr pipelines

fix spev

Remove unrelated changes
parent 9428db8e
...@@ -46,6 +46,7 @@ module Ci ...@@ -46,6 +46,7 @@ module Ci
delegate :terminal_specification, to: :runner_session, allow_nil: true delegate :terminal_specification, to: :runner_session, allow_nil: true
delegate :gitlab_deploy_token, to: :project delegate :gitlab_deploy_token, to: :project
delegate :trigger_short_token, to: :trigger_request, allow_nil: true delegate :trigger_short_token, to: :trigger_request, allow_nil: true
delegate :merge_request?, to: :pipeline
## ##
# Since Gitlab 11.5, deployments records started being created right after # Since Gitlab 11.5, deployments records started being created right after
...@@ -441,12 +442,14 @@ module Ci ...@@ -441,12 +442,14 @@ module Ci
# All variables, including persisted environment variables. # All variables, including persisted environment variables.
# #
def variables def variables
strong_memoize(:variables) do
Gitlab::Ci::Variables::Collection.new Gitlab::Ci::Variables::Collection.new
.concat(persisted_variables) .concat(persisted_variables)
.concat(scoped_variables) .concat(scoped_variables)
.concat(persisted_environment_variables) .concat(persisted_environment_variables)
.to_runner_variables .to_runner_variables
end end
end
## ##
# Regular Ruby hash of scoped variables, without duplicates that are # Regular Ruby hash of scoped variables, without duplicates that are
......
...@@ -2,6 +2,11 @@ ...@@ -2,6 +2,11 @@
module Ci module Ci
class BuildRunnerPresenter < SimpleDelegator class BuildRunnerPresenter < SimpleDelegator
include Gitlab::Utils::StrongMemoize
RUNNER_REMOTE_TAG_PREFIX = 'refs/tags/'.freeze
RUNNER_REMOTE_BRANCH_PREFIX = 'refs/remotes/origin/'.freeze
def artifacts def artifacts
return unless options[:artifacts] return unless options[:artifacts]
...@@ -11,6 +16,35 @@ module Ci ...@@ -11,6 +16,35 @@ module Ci
list.flatten.compact list.flatten.compact
end end
def ref_type
if tag
'tag'
else
'branch'
end
end
def git_depth
strong_memoize(:git_depth) do
git_depth = variables&.find { |variable| variable[:key] == 'GIT_DEPTH' }&.dig(:value)
git_depth.to_i
end
end
def refspecs
specs = []
if git_depth > 0
specs << refspec_for_branch(ref) if branch? || merge_request?
specs << refspec_for_tag(ref) if tag?
else
specs << refspec_for_branch
specs << refspec_for_tag
end
specs
end
private private
def create_archive(artifacts) def create_archive(artifacts)
...@@ -41,5 +75,13 @@ module Ci ...@@ -41,5 +75,13 @@ module Ci
} }
end end
end end
def refspec_for_branch(ref = '*')
"+#{Gitlab::Git::BRANCH_REF_PREFIX}#{ref}:#{RUNNER_REMOTE_BRANCH_PREFIX}#{ref}"
end
def refspec_for_tag(ref = '*')
"+#{Gitlab::Git::TAG_REF_PREFIX}#{ref}:#{RUNNER_REMOTE_TAG_PREFIX}#{ref}"
end
end end
end end
---
title: Expose refspecs and depth to runner
merge_request: 25233
author:
type: added
...@@ -1385,13 +1385,9 @@ module API ...@@ -1385,13 +1385,9 @@ module API
class GitInfo < Grape::Entity class GitInfo < Grape::Entity
expose :repo_url, :ref, :sha, :before_sha expose :repo_url, :ref, :sha, :before_sha
expose :ref_type do |model| expose :ref_type
if model.tag expose :refspecs
'tag' expose :git_depth, as: :depth
else
'branch'
end
end
end end
class RunnerInfo < Grape::Entity class RunnerInfo < Grape::Entity
......
...@@ -23,6 +23,7 @@ describe Ci::Build do ...@@ -23,6 +23,7 @@ describe Ci::Build do
it { is_expected.to validate_presence_of(:ref) } it { is_expected.to validate_presence_of(:ref) }
it { is_expected.to respond_to(:has_trace?) } it { is_expected.to respond_to(:has_trace?) }
it { is_expected.to respond_to(:trace) } it { is_expected.to respond_to(:trace) }
it { is_expected.to delegate_method(:merge_request?).to(:pipeline) }
it { is_expected.to be_a(ArtifactMigratable) } it { is_expected.to be_a(ArtifactMigratable) }
......
...@@ -98,4 +98,72 @@ describe Ci::BuildRunnerPresenter do ...@@ -98,4 +98,72 @@ describe Ci::BuildRunnerPresenter do
end end
end end
end end
describe '#ref_type' do
subject { presenter.ref_type }
let(:build) { create(:ci_build, tag: tag) }
let(:tag) { true }
it 'returns the correct ref type' do
is_expected.to eq('tag')
end
context 'when tag is false' do
let(:tag) { false }
it 'returns the correct ref type' do
is_expected.to eq('branch')
end
end
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
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)
end
end
end
describe '#refspecs' do
subject { presenter.refspecs }
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/*')
end
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 refspecs' do
is_expected.to contain_exactly("+refs/heads/#{build.ref}:refs/remotes/origin/#{build.ref}")
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/tags/#{build.ref}:refs/tags/#{build.ref}")
end
end
end
end
end end
...@@ -417,7 +417,9 @@ describe API::Runner, :clean_gitlab_redis_shared_state do ...@@ -417,7 +417,9 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
'ref' => job.ref, 'ref' => job.ref,
'sha' => job.sha, 'sha' => job.sha,
'before_sha' => job.before_sha, 'before_sha' => job.before_sha,
'ref_type' => 'branch' } 'ref_type' => 'branch',
'refspecs' => %w[+refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*],
'depth' => 0 }
end end
let(:expected_steps) do let(:expected_steps) do
...@@ -489,6 +491,29 @@ describe API::Runner, :clean_gitlab_redis_shared_state do ...@@ -489,6 +491,29 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
expect(response).to have_gitlab_http_status(201) expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['ref_type']).to eq('tag') expect(json_response['git_info']['ref_type']).to eq('tag')
end end
context 'when GIT_DEPTH is specified' do
before do
create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 1, pipeline: pipeline)
end
it 'specifies refspecs' do
request_job
expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['refspecs']).to include("+refs/tags/#{job.ref}:refs/tags/#{job.ref}")
end
end
context 'when GIT_DEPTH is not specified' do
it 'specifies refspecs' do
request_job
expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['refspecs'])
.to contain_exactly('+refs/tags/*:refs/tags/*', '+refs/heads/*:refs/remotes/origin/*')
end
end
end end
context 'when job is made for branch' do context 'when job is made for branch' do
...@@ -498,6 +523,55 @@ describe API::Runner, :clean_gitlab_redis_shared_state do ...@@ -498,6 +523,55 @@ describe API::Runner, :clean_gitlab_redis_shared_state do
expect(response).to have_gitlab_http_status(201) expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['ref_type']).to eq('branch') expect(json_response['git_info']['ref_type']).to eq('branch')
end end
context 'when GIT_DEPTH is specified' do
before do
create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 1, pipeline: pipeline)
end
it 'specifies refspecs' do
request_job
expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['refspecs']).to include("+refs/heads/#{job.ref}:refs/remotes/origin/#{job.ref}")
end
end
context 'when GIT_DEPTH is not specified' do
it 'specifies refspecs' do
request_job
expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['refspecs'])
.to contain_exactly('+refs/tags/*:refs/tags/*', '+refs/heads/*:refs/remotes/origin/*')
end
end
end
context 'when job is made for merge request' do
let(:pipeline) { create(:ci_pipeline_without_jobs, source: :merge_request, project: project, ref: 'feature', merge_request: merge_request) }
let!(:job) { create(:ci_build, pipeline: pipeline, name: 'spinach', ref: 'feature', stage: 'test', stage_idx: 0) }
let(:merge_request) { create(:merge_request) }
it 'sets branch as ref_type' do
request_job
expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['ref_type']).to eq('branch')
end
context 'when GIT_DEPTH is specified' do
before do
create(:ci_pipeline_variable, key: 'GIT_DEPTH', value: 1, pipeline: pipeline)
end
it 'returns the overwritten git depth for merge request refspecs' do
request_job
expect(response).to have_gitlab_http_status(201)
expect(json_response['git_info']['depth']).to eq(1)
end
end
end end
it 'updates runner info' do it 'updates runner info' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment