diff --git a/app/models/ci/trigger.rb b/app/models/ci/trigger.rb index ca4ef4d8735de8f495c4bc47686e64d6e17be0a6..83fe1e4abb9264e9347d55bb627f9a58b9130f09 100644 --- a/app/models/ci/trigger.rb +++ b/app/models/ci/trigger.rb @@ -48,6 +48,7 @@ def last_used def short_token token.delete_prefix(TRIGGER_TOKEN_PREFIX)[0...4] if token.present? end + alias_method :trigger_short_token, :short_token def can_access_project? Ability.allowed?(self.owner, :create_build, project) diff --git a/ee/lib/ee/gitlab/ci/variables/builder.rb b/ee/lib/ee/gitlab/ci/variables/builder.rb index d280a3bd6877f29041f5f07c605e100ae9aeb775..17381cdd57083e71cb0e6955a7dfb2e7466a8a83 100644 --- a/ee/lib/ee/gitlab/ci/variables/builder.rb +++ b/ee/lib/ee/gitlab/ci/variables/builder.rb @@ -16,7 +16,9 @@ def initialize(pipeline) end override :scoped_variables_for_pipeline_seed - def scoped_variables_for_pipeline_seed(job_attr, environment:, kubernetes_namespace:, user:, trigger_request:) + def scoped_variables_for_pipeline_seed( + job_attr, environment:, kubernetes_namespace:, user:, + trigger_or_request:) variables = super.tap do |variables| variables.concat(scan_execution_policies_variables_builder.variables(job_attr[:name])) end diff --git a/ee/spec/lib/ee/gitlab/ci/variables/builder_spec.rb b/ee/spec/lib/ee/gitlab/ci/variables/builder_spec.rb index d16bf79867b3518bc5e267f6bf42c6066566e9d9..e6179d9f8855ec72827f6526a03739c67b5fcabc 100644 --- a/ee/spec/lib/ee/gitlab/ci/variables/builder_spec.rb +++ b/ee/spec/lib/ee/gitlab/ci/variables/builder_spec.rb @@ -186,7 +186,7 @@ environment: environment_name, kubernetes_namespace: kubernetes_namespace, user: job.user, - trigger_request: nil + trigger_or_request: nil ) end diff --git a/lib/gitlab/ci/build/context/build.rb b/lib/gitlab/ci/build/context/build.rb index 00a9bcf925997ff3b1db1dcc01517f33f212a989..0748928f47bbad7e6b31a4834412b213b6beca09 100644 --- a/lib/gitlab/ci/build/context/build.rb +++ b/lib/gitlab/ci/build/context/build.rb @@ -21,9 +21,9 @@ def variables .scoped_variables_for_pipeline_seed( attributes, user: pipeline.user, - trigger_request: pipeline.legacy_trigger, environment: seed_environment, - kubernetes_namespace: seed_kubernetes_namespace + kubernetes_namespace: seed_kubernetes_namespace, + trigger_or_request: trigger_or_request ) end strong_memoize_attr :variables @@ -57,10 +57,21 @@ def seed_kubernetes_namespace def simple_variables pipeline.variables_builder.scoped_variables_for_pipeline_seed( attributes, - environment: nil, kubernetes_namespace: nil, user: pipeline.user, trigger_request: pipeline.legacy_trigger + user: pipeline.user, + environment: nil, + kubernetes_namespace: nil, + trigger_or_request: trigger_or_request ) end strong_memoize_attr :simple_variables + + def trigger_or_request + if Feature.enabled?(:ci_read_trigger_from_ci_pipeline, pipeline.project) + pipeline.trigger + else + pipeline.legacy_trigger + end + end end end end diff --git a/lib/gitlab/ci/variables/builder.rb b/lib/gitlab/ci/variables/builder.rb index 76f99d955b8d720861cba73b8e99f46b8069a005..a3fd04eb07f051c8479108a48338977d9a9a4d95 100644 --- a/lib/gitlab/ci/variables/builder.rb +++ b/lib/gitlab/ci/variables/builder.rb @@ -76,7 +76,7 @@ def unprotected_scoped_variables(job, expose_project_variables:, expose_group_va end end - def scoped_variables_for_pipeline_seed(job_attr, environment:, kubernetes_namespace:, user:, trigger_request:) + def scoped_variables_for_pipeline_seed(job_attr, environment:, kubernetes_namespace:, user:, trigger_or_request:) Gitlab::Ci::Variables::Collection.new.tap do |variables| if pipeline.only_workload_variables? # predefined_project_variables includes things like $CI_PROJECT_PATH which are used by the runner to clone @@ -88,7 +88,7 @@ def scoped_variables_for_pipeline_seed(job_attr, environment:, kubernetes_namesp next end - variables.concat(predefined_variables_from_job_attr(job_attr, environment, trigger_request)) + variables.concat(predefined_variables_from_job_attr(job_attr, environment, trigger_or_request)) variables.concat(project.predefined_variables) variables.concat(pipeline_variables_builder.predefined_variables) # job.runner.predefined_variables: No need because it's not available in the Seed step. @@ -216,8 +216,13 @@ def predefined_variables(job, environment) variables.append(key: 'CI_JOB_GROUP_NAME', value: Gitlab::Utils::Job.group_name(job.name)) variables.append(key: 'CI_JOB_STAGE', value: job.stage_name) variables.append(key: 'CI_JOB_MANUAL', value: 'true') if job.action? - variables.append(key: 'CI_PIPELINE_TRIGGERED', value: 'true') if job.trigger_request - variables.append(key: 'CI_TRIGGER_SHORT_TOKEN', value: job.trigger_short_token) if job.trigger_request + + trigger_presence = Feature.enabled?(:ci_read_trigger_from_ci_pipeline, project) ? job.pipeline.trigger_id : job.trigger_request + + if trigger_presence + variables.append(key: 'CI_PIPELINE_TRIGGERED', value: 'true') + variables.append(key: 'CI_TRIGGER_SHORT_TOKEN', value: job.trigger_short_token) + end variables.append(key: 'CI_NODE_INDEX', value: job.options[:instance].to_s) if job.options&.include?(:instance) variables.append(key: 'CI_NODE_TOTAL', value: ci_node_total_value(job.options).to_s) @@ -231,15 +236,15 @@ def predefined_variables(job, environment) end end - def predefined_variables_from_job_attr(job_attr, environment, trigger_request) + def predefined_variables_from_job_attr(job_attr, environment, trigger_or_request) Gitlab::Ci::Variables::Collection.new.tap do |variables| variables.append(key: 'CI_JOB_NAME', value: job_attr[:name]) variables.append(key: 'CI_JOB_NAME_SLUG', value: job_name_slug(job_attr[:name])) variables.append(key: 'CI_JOB_GROUP_NAME', value: Gitlab::Utils::Job.group_name(job_attr[:name])) variables.append(key: 'CI_JOB_STAGE', value: job_attr[:stage]) variables.append(key: 'CI_JOB_MANUAL', value: 'true') if ::Ci::Processable::ACTIONABLE_WHEN.include?(job_attr[:when]) - variables.append(key: 'CI_PIPELINE_TRIGGERED', value: 'true') if trigger_request - variables.append(key: 'CI_TRIGGER_SHORT_TOKEN', value: trigger_request.trigger_short_token) if trigger_request + variables.append(key: 'CI_PIPELINE_TRIGGERED', value: 'true') if trigger_or_request + variables.append(key: 'CI_TRIGGER_SHORT_TOKEN', value: trigger_or_request.trigger_short_token) if trigger_or_request variables.append(key: 'CI_NODE_INDEX', value: job_attr[:options][:instance].to_s) if job_attr[:options]&.include?(:instance) variables.append(key: 'CI_NODE_TOTAL', value: ci_node_total_value(job_attr[:options]).to_s) diff --git a/spec/lib/gitlab/ci/build/context/build_spec.rb b/spec/lib/gitlab/ci/build/context/build_spec.rb index ec25a854ddfaeabc276b29278f8fe92f03d7151e..3dcb08aa69278c0ffd81116125096294171856e5 100644 --- a/spec/lib/gitlab/ci/build/context/build_spec.rb +++ b/spec/lib/gitlab/ci/build/context/build_spec.rb @@ -72,11 +72,25 @@ it_behaves_like 'variables collection' context 'when the pipeline has a trigger request' do - let!(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline) } + let!(:trigger) { create(:ci_trigger, project: project) } + let(:pipeline) { create(:ci_pipeline, trigger: trigger, project: project, user: user) } it 'includes trigger variables' do expect(variables).to include('CI_PIPELINE_TRIGGERED' => 'true') - expect(variables).to include('CI_TRIGGER_SHORT_TOKEN' => trigger_request.trigger_short_token) + expect(variables).to include('CI_TRIGGER_SHORT_TOKEN' => trigger.trigger_short_token) + end + + context 'when ff ci_read_trigger_from_ci_pipeline is disabled' do + before do + stub_feature_flags(ci_read_trigger_from_ci_pipeline: false) + end + + let!(:trigger_request) { create(:ci_trigger_request, trigger: trigger, pipeline: pipeline) } + + it 'includes trigger variables' do + expect(variables).to include('CI_PIPELINE_TRIGGERED' => 'true') + expect(variables).to include('CI_TRIGGER_SHORT_TOKEN' => trigger_request.trigger_short_token) + end end end diff --git a/spec/lib/gitlab/ci/variables/builder_spec.rb b/spec/lib/gitlab/ci/variables/builder_spec.rb index 822522e9da93982783a1bd687f91e7cd4feb6bd9..d3a16fdf56d848df52bf75cde989c94d7d29eb5c 100644 --- a/spec/lib/gitlab/ci/variables/builder_spec.rb +++ b/spec/lib/gitlab/ci/variables/builder_spec.rb @@ -366,6 +366,37 @@ def var(name, value) ) end end + + context 'when pipeline has trigger request' do + let_it_be(:trigger) { create(:ci_trigger, project: project) } + + before do + pipeline.update!(trigger: trigger) + end + + it 'includes CI_PIPELINE_TRIGGERED and CI_TRIGGER_SHORT_TOKEN' do + expect(subject.to_hash).to include( + 'CI_PIPELINE_TRIGGERED' => 'true', + 'CI_TRIGGER_SHORT_TOKEN' => trigger.trigger_short_token + ) + end + + context 'when ff ci_read_trigger_from_ci_pipeline is disabled' do + let!(:trigger_request) { create(:ci_trigger_request, trigger: trigger, pipeline: pipeline) } + + before do + stub_feature_flags(ci_read_trigger_from_ci_pipeline: false) + job.update!(trigger_request: trigger_request) + end + + it 'includes CI_PIPELINE_TRIGGERED and CI_TRIGGER_SHORT_TOKEN' do + expect(subject.to_hash).to include( + 'CI_PIPELINE_TRIGGERED' => 'true', + 'CI_TRIGGER_SHORT_TOKEN' => trigger_request.trigger_short_token + ) + end + end + end end describe '#unprotected_scoped_variables' do @@ -398,7 +429,7 @@ def var(name, value) let(:environment_name) { 'test/master' } let(:kubernetes_namespace) { nil } let(:extra_attributes) { {} } - let(:trigger_request) { nil } + let(:trigger_or_request) { nil } let(:yaml_variables) { [{ key: 'YAML_VARIABLE', value: 'value' }] } let(:predefined_variables) do @@ -486,7 +517,7 @@ def var(name, value) environment: environment_name, kubernetes_namespace: kubernetes_namespace, user: user, - trigger_request: trigger_request + trigger_or_request: trigger_or_request ) end @@ -627,13 +658,26 @@ def var(name, value) end context 'when pipeline has trigger request' do - let!(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline) } + context 'for trigger' do + let!(:trigger_or_request) { create(:ci_trigger, project: project) } + + it 'includes CI_PIPELINE_TRIGGERED and CI_TRIGGER_SHORT_TOKEN' do + expect(subject.to_hash).to include( + 'CI_PIPELINE_TRIGGERED' => 'true', + 'CI_TRIGGER_SHORT_TOKEN' => trigger_or_request.trigger_short_token + ) + end + end - it 'includes CI_PIPELINE_TRIGGERED and CI_TRIGGER_SHORT_TOKEN' do - expect(subject.to_hash).to include( - 'CI_PIPELINE_TRIGGERED' => 'true', - 'CI_TRIGGER_SHORT_TOKEN' => trigger_request.trigger_short_token - ) + context 'for trigger_request' do + let!(:trigger_or_request) { create(:ci_trigger_request, pipeline: pipeline) } + + it 'includes CI_PIPELINE_TRIGGERED and CI_TRIGGER_SHORT_TOKEN' do + expect(subject.to_hash).to include( + 'CI_PIPELINE_TRIGGERED' => 'true', + 'CI_TRIGGER_SHORT_TOKEN' => trigger_or_request.trigger_short_token + ) + end end end diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb index 64740113ff8cd8b514367fadff4d9ac6f0d95d0a..c940a0aaa1553039deaa7c89594467c12a80e371 100644 --- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb +++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb @@ -792,6 +792,7 @@ end let(:trigger) { create(:ci_trigger, project: project) } + let(:pipeline) { create(:ci_pipeline, trigger: trigger, project: project, ref: 'master') } let!(:trigger_request) { create(:ci_trigger_request, pipeline: pipeline, builds: [job], trigger: trigger) } before do