diff --git a/app/assets/stylesheets/pages/commits.scss b/app/assets/stylesheets/pages/commits.scss
index 61fbd7425b75589627c7465f7d41185ea7c8f8eb..83ffa0e1d396bee451e2d28e747b5f535d61d112 100644
--- a/app/assets/stylesheets/pages/commits.scss
+++ b/app/assets/stylesheets/pages/commits.scss
@@ -84,7 +84,8 @@
   font-weight: 600;
 }
 
-.commit {
+.commit,
+.generic_commit_status {
   padding: 10px 0;
   position: relative;
 
@@ -102,7 +103,6 @@
     vertical-align: baseline;
   }
 
-
   .avatar {
     margin-left: -46px;
   }
diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss
index bf3cb6e7ad9defb03b10e41a5ee6d803ca414153..881621a2655e6b42146b4b048f3809de77aa2f55 100644
--- a/app/assets/stylesheets/pages/pipelines.scss
+++ b/app/assets/stylesheets/pages/pipelines.scss
@@ -109,10 +109,6 @@
     float: none;
   }
 
-  .api {
-    color: $code-color;
-  }
-
   .branch-commit {
 
     .branch-name {
diff --git a/app/helpers/gitlab_routing_helper.rb b/app/helpers/gitlab_routing_helper.rb
index bccf64d1aac3154d6c3eaeb57ce5afa3817ec76e..af9087d8326aa4b9b580a0f05e30cae8c6eaac7e 100644
--- a/app/helpers/gitlab_routing_helper.rb
+++ b/app/helpers/gitlab_routing_helper.rb
@@ -82,6 +82,10 @@ module GitlabRoutingHelper
     namespace_project_merge_request_path(entity.project.namespace, entity.project, entity, *args)
   end
 
+  def pipeline_path(pipeline, *args)
+    namespace_project_pipeline_path(pipeline.project.namespace, pipeline.project, pipeline.id, *args)
+  end
+
   def milestone_path(entity, *args)
     namespace_project_milestone_path(entity.project.namespace, entity.project, entity, *args)
   end
diff --git a/app/views/projects/builds/_header.html.haml b/app/views/projects/builds/_header.html.haml
index 3f2ce7377fdee1b3786159dc71e438f7e8faf0df..9f69bd64f71492bef73d91b832754bc75d99412c 100644
--- a/app/views/projects/builds/_header.html.haml
+++ b/app/views/projects/builds/_header.html.haml
@@ -3,6 +3,9 @@
     = ci_status_with_icon(@build.status)
     Build
     %strong ##{@build.id}
+    in pipeline
+    = link_to pipeline_path(@build.pipeline) do
+      %strong ##{@build.pipeline.id}
     for commit
     = link_to ci_status_path(@build.pipeline) do
       %strong= @build.pipeline.short_sha
diff --git a/app/views/projects/builds/_table.html.haml b/app/views/projects/builds/_table.html.haml
index 36294c89fa807976f75cbe9f20b1b6e5749c9af5..028664f5bbaccd86de1c72fd41009f2075592578 100644
--- a/app/views/projects/builds/_table.html.haml
+++ b/app/views/projects/builds/_table.html.haml
@@ -10,6 +10,7 @@
         %tr
           %th Status
           %th Build
+          %th Pipeline
           - if admin
             %th Project
             %th Runner
@@ -19,6 +20,6 @@
           %th Coverage
           %th
 
-      = render partial: "projects/ci/builds/build", collection: builds, as: :build, locals: { commit_sha: true, ref: true, stage: true, allow_retry: true, coverage: admin || project.build_coverage_enabled?, admin: admin }
+      = render partial: "projects/ci/builds/build", collection: builds, as: :build, locals: { commit_sha: true, ref: true, pipeline_link: true, stage: true, allow_retry: true, coverage: admin || project.build_coverage_enabled?, admin: admin }
 
   = paginate builds, theme: 'gitlab'
diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml
index 94632056b154fb1524df200a9ac894c7ae6ddcf6..8d9c15d0dc6a1622a07fc6cea15ff3dd2a732d57 100644
--- a/app/views/projects/ci/builds/_build.html.haml
+++ b/app/views/projects/ci/builds/_build.html.haml
@@ -2,6 +2,7 @@
 - ref = local_assigns.fetch(:ref, nil)
 - commit_sha = local_assigns.fetch(:commit_sha, nil)
 - retried = local_assigns.fetch(:retried, false)
+- pipeline_link = local_assigns.fetch(:pipeline_link, false)
 - stage = local_assigns.fetch(:stage, false)
 - coverage = local_assigns.fetch(:coverage, false)
 - allow_retry = local_assigns.fetch(:allow_retry, false)
@@ -51,6 +52,16 @@
       - if build.manual?
         %span.label.label-info manual
 
+  - if pipeline_link
+    %td
+      = link_to pipeline_path(build.pipeline) do
+        %span.pipeline-id ##{build.pipeline.id}
+      %span by
+      - if build.pipeline.user
+        = user_avatar(user: build.pipeline.user, size: 20)
+      - else
+        %span.monospace API
+
   - if admin
     %td
       - if build.project
diff --git a/app/views/projects/commit/_ci_stage.html.haml b/app/views/projects/commit/_ci_stage.html.haml
index 6bb900e3fc1f34f2b77cfb4ccfc6d47308bb4825..3a3d750439f7f5e2a36ba2a73ff3fed8f755da40 100644
--- a/app/views/projects/commit/_ci_stage.html.haml
+++ b/app/views/projects/commit/_ci_stage.html.haml
@@ -8,8 +8,8 @@
       - if stage
          
         = stage.titleize
-  = render statuses.latest_ci_stages, coverage: @project.build_coverage_enabled?, stage: false, ref: false, allow_retry: true
-  = render statuses.retried_ci_stages, coverage: @project.build_coverage_enabled?, stage: false, ref: false, retried: true
-  %tr
-    %td{colspan: 10}
-       
+  = render statuses.latest_ci_stages, coverage: @project.build_coverage_enabled?, stage: false, ref: false, pipeline_link: false, allow_retry: true
+  = render statuses.retried_ci_stages, coverage: @project.build_coverage_enabled?, stage: false, ref: false, pipeline_link: false, retried: true
+%tr
+  %td{colspan: 10}
+     
diff --git a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml
index 80fe6be49b0989b7592c5f3b1cd58092b46fd4b9..0b99e9f8756789325a1d4bebb442ed952878f9ff 100644
--- a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml
+++ b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml
@@ -15,6 +15,16 @@
     - if defined?(retried) && retried
       = icon('warning', class: 'text-warning has-tooltip', title: 'Status was retried.')
 
+  - if defined?(pipeline_link) && pipeline_link
+    %td
+      = link_to pipeline_path(generic_commit_status.pipeline) do
+        %span.pipeline-id ##{generic_commit_status.pipeline.id}
+      %span by
+      - if generic_commit_status.pipeline.user
+        = user_avatar(user: generic_commit_status.pipeline.user, size: 20)
+      - else
+        %span.monospace API
+
   - if defined?(commit_sha) && commit_sha
     %td
       = link_to generic_commit_status.short_sha, namespace_project_commit_path(generic_commit_status.project.namespace, generic_commit_status.project, generic_commit_status.sha), class: "monospace"
diff --git a/changelogs/unreleased/22307-pipeline-link-in-builds-view.yml b/changelogs/unreleased/22307-pipeline-link-in-builds-view.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3af746cd92adc9cc5b3a5800791576506a63df3e
--- /dev/null
+++ b/changelogs/unreleased/22307-pipeline-link-in-builds-view.yml
@@ -0,0 +1,4 @@
+---
+title: Add link to build pipeline within individual build pages
+merge_request: 7082
+author:
diff --git a/spec/views/projects/builds/_build.html.haml_spec.rb b/spec/views/projects/builds/_build.html.haml_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..e141a1177319ee2a3ac5f716f1bcb48e32d87351
--- /dev/null
+++ b/spec/views/projects/builds/_build.html.haml_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe 'projects/ci/builds/_build' do
+  include Devise::Test::ControllerHelpers
+
+  let(:project) { create(:project) }
+  let(:pipeline) { create(:ci_empty_pipeline, id: 1337, project: project, sha: project.commit.id) }
+  let(:build) { create(:ci_build, pipeline: pipeline, stage: 'test', stage_idx: 1, name: 'rspec 0:2', status: :pending) }
+
+  before do
+    controller.prepend_view_path('app/views/projects')
+    allow(view).to receive(:can?).and_return(true)
+  end
+
+  it 'won\'t include a column with a link to its pipeline by default' do
+    render partial: 'projects/ci/builds/build', locals: { build: build }
+
+    expect(rendered).not_to have_link('#1337')
+    expect(rendered).not_to have_text('#1337 by API')
+  end
+
+  it 'can include a column with a link to its pipeline' do
+    render partial: 'projects/ci/builds/build', locals: { build: build, pipeline_link: true }
+
+    expect(rendered).to have_link('#1337')
+    expect(rendered).to have_text('#1337 by API')
+  end
+end
diff --git a/spec/views/projects/builds/_generic_commit_status.html.haml_spec.rb b/spec/views/projects/builds/_generic_commit_status.html.haml_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..49b20e5b36b2402d57f88c9915ef4044bc4e7ddb
--- /dev/null
+++ b/spec/views/projects/builds/_generic_commit_status.html.haml_spec.rb
@@ -0,0 +1,28 @@
+require 'spec_helper'
+
+describe 'projects/generic_commit_statuses/_generic_commit_status.html.haml' do
+  include Devise::Test::ControllerHelpers
+
+  let(:project) { create(:project) }
+  let(:pipeline) { create(:ci_empty_pipeline, id: 1337, project: project, sha: project.commit.id) }
+  let(:generic_commit_status) { create(:generic_commit_status, pipeline: pipeline, stage: 'external', name: 'jenkins', stage_idx: 3) }
+
+  before do
+    controller.prepend_view_path('app/views/projects')
+    allow(view).to receive(:can?).and_return(true)
+  end
+
+  it 'won\'t include a column with a link to its pipeline by default' do
+    render partial: 'projects/generic_commit_statuses/generic_commit_status', locals: { generic_commit_status: generic_commit_status }
+
+    expect(rendered).not_to have_link('#1337')
+    expect(rendered).not_to have_text('#1337 by API')
+  end
+
+  it 'can include a column with a link to its pipeline' do
+    render partial: 'projects/generic_commit_statuses/generic_commit_status', locals: { generic_commit_status: generic_commit_status, pipeline_link: true }
+
+    expect(rendered).to have_link('#1337')
+    expect(rendered).to have_text('#1337 by API')
+  end
+end