diff --git a/app/services/ci/expire_pipeline_cache_service.rb b/app/services/ci/expire_pipeline_cache_service.rb index 15597eb7209f93e9e1681ee939b19a398e7c569c..e0c98e17e8f77245e7bb34d196fdd5c77139c857 100644 --- a/app/services/ci/expire_pipeline_cache_service.rb +++ b/app/services/ci/expire_pipeline_cache_service.rb @@ -50,6 +50,10 @@ def each_pipelines_merge_request_path(pipeline) yield(pipelines_project_merge_request_path(merge_request)) yield(merge_request_widget_path(merge_request)) end + + pipeline.project.merge_requests.by_merged_or_merge_or_squash_commit_sha(pipeline.sha).each do |merge_request| + yield(merge_request_widget_path(merge_request)) + end end def graphql_pipeline_path(pipeline) diff --git a/spec/services/ci/expire_pipeline_cache_service_spec.rb b/spec/services/ci/expire_pipeline_cache_service_spec.rb index a74b820de0969b373e951f0dc4a44a9cc320f866..758f923ce92a7c45fd0541724ed4b581198d4146 100644 --- a/spec/services/ci/expire_pipeline_cache_service_spec.rb +++ b/spec/services/ci/expire_pipeline_cache_service_spec.rb @@ -6,6 +6,7 @@ let_it_be(:user) { create(:user) } let_it_be(:project) { create(:project) } let_it_be(:pipeline) { create(:ci_pipeline, project: project) } + let_it_be(:merge_pipeline) { create(:ci_pipeline, :detached_merge_request_pipeline, project: project) } subject { described_class.new } @@ -45,6 +46,17 @@ subject.execute(merge_request.all_pipelines.last) end + it 'invalidates Etag caching for merge request that pipeline runs on its merged commit' do + merge_request = create(:merge_request, merge_commit_sha: pipeline.sha, source_project: pipeline.project) + project = merge_request.target_project + + merge_request_widget_path = "/#{project.full_path}/-/merge_requests/#{merge_request.iid}/cached_widget.json" + + expect_touched_etag_caching_paths(merge_request_widget_path) + + subject.execute(pipeline) + end + it 'updates the cached status for a project' do expect(Gitlab::Cache::Ci::ProjectPipelineStatus).to receive(:update_for_pipeline).with(pipeline)