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