diff --git a/app/serializers/build_details_entity.rb b/app/serializers/build_details_entity.rb
index 20f9938f038333d38e63c33055e3e5dd199f15f2..743a08acefee2e97aacdb8c779b8306c788aea71 100644
--- a/app/serializers/build_details_entity.rb
+++ b/app/serializers/build_details_entity.rb
@@ -16,7 +16,8 @@ class BuildDetailsEntity < JobEntity
     end
 
     expose :path do |build|
-      project_merge_request_path(project, build.merge_request)
+      project_merge_request_path(build.merge_request.project,
+                                 build.merge_request)
     end
   end
 
diff --git a/changelogs/unreleased/fix-gb-fix-build-merge-request-link-to-fork-project.yml b/changelogs/unreleased/fix-gb-fix-build-merge-request-link-to-fork-project.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7a68e91c6d3babd1883c41609c61002fbd2c4390
--- /dev/null
+++ b/changelogs/unreleased/fix-gb-fix-build-merge-request-link-to-fork-project.yml
@@ -0,0 +1,4 @@
+---
+title: Fix job merge request link to a forked source project
+merge_request: 12965
+author:
diff --git a/spec/serializers/build_details_entity_spec.rb b/spec/serializers/build_details_entity_spec.rb
index b92c1c28ba871f29abede4ab6886b3c3835ac3ac..1332572fffc8a6b3ceb3f7b6ac9dd39d9f377f1a 100644
--- a/spec/serializers/build_details_entity_spec.rb
+++ b/spec/serializers/build_details_entity_spec.rb
@@ -9,47 +9,96 @@ describe BuildDetailsEntity do
 
   describe '#as_json' do
     let(:project) { create(:project, :repository) }
-    let!(:build) { create(:ci_build, :failed, project: project) }
+    let(:pipeline) { create(:ci_pipeline, project: project) }
+    let(:build) { create(:ci_build, :failed, pipeline: pipeline) }
     let(:request) { double('request') }
-    let(:entity) { described_class.new(build, request: request, current_user: user, project: project) }
+
+    let(:entity) do
+      described_class.new(build, request: request,
+                                 current_user: user,
+                                 project: project)
+    end
+
     subject { entity.as_json }
 
     before do
       allow(request).to receive(:current_user).and_return(user)
     end
 
+    it 'contains the needed key value pairs' do
+      expect(subject).to include(:coverage, :erased_at, :duration)
+      expect(subject).to include(:runner, :pipeline)
+      expect(subject).to include(:raw_path, :new_issue_path)
+    end
+
     context 'when the user has access to issues and merge requests' do
-      let!(:merge_request) do
-        create(:merge_request, source_project: project, source_branch: build.ref)
-      end
+      context 'when merge request orginates from the same project' do
+        let(:merge_request) do
+          create(:merge_request, source_project: project, source_branch: build.ref)
+        end
 
-      before do
-        allow(build).to receive(:merge_request).and_return(merge_request)
-      end
+        before do
+          allow(build).to receive(:merge_request).and_return(merge_request)
+        end
+
+        it 'contains the needed key value pairs' do
+          expect(subject).to include(:merge_request)
+          expect(subject).to include(:new_issue_path)
+        end
 
-      it 'contains the needed key value pairs' do
-        expect(subject).to include(:coverage, :erased_at, :duration)
-        expect(subject).to include(:runner, :pipeline)
-        expect(subject).to include(:raw_path, :merge_request)
-        expect(subject).to include(:new_issue_path)
+        it 'exposes correct details of the merge request' do
+          expect(subject[:merge_request][:iid]).to eq merge_request.iid
+        end
+
+        it 'has a correct merge request path' do
+          expect(subject[:merge_request][:path]).to include project.full_path
+        end
       end
 
-      it 'exposes details of the merge request' do
-        expect(subject[:merge_request]).to include(:iid, :path)
+      context 'when merge request is from a fork' do
+        let(:fork_project) do
+          create(:empty_project, forked_from_project: project)
+        end
+
+        let(:pipeline) { create(:ci_pipeline, project: fork_project) }
+
+        before do
+          allow(build).to receive(:merge_request).and_return(merge_request)
+        end
+
+        let(:merge_request) do
+          create(:merge_request, source_project: fork_project,
+                                 target_project: project,
+                                 source_branch: build.ref)
+        end
+
+        it 'contains the needed key value pairs' do
+          expect(subject).to include(:merge_request)
+          expect(subject).to include(:new_issue_path)
+        end
+
+        it 'exposes details of the merge request' do
+          expect(subject[:merge_request][:iid]).to eq merge_request.iid
+        end
+
+        it 'has a merge request path to a target project' do
+          expect(subject[:merge_request][:path])
+            .to include project.full_path
+        end
       end
 
-      context 'when the build has been erased' do
-        let!(:build) { create(:ci_build, :erasable, project: project) }
+      context 'when the build has not been erased' do
+        let(:build) { create(:ci_build, :erasable, project: project) }
 
-        it 'exposes the user whom erased the build' do
+        it 'exposes a build erase path' do
           expect(subject).to include(:erase_path)
         end
       end
 
       context 'when the build has been erased' do
-        let!(:build) { create(:ci_build, erased_at: Time.now, project: project, erased_by: user) }
+        let(:build) { create(:ci_build, :erased, project: project) }
 
-        it 'exposes the user whom erased the build' do
+        it 'exposes the user who erased the build' do
           expect(subject).to include(:erased_by)
         end
       end