Skip to content

Commit fd88b0c

Browse files
committed
Add pipelines endpoint to merge requests API
1 parent 627a968 commit fd88b0c

File tree

5 files changed

+87
-0
lines changed

5 files changed

+87
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
title: Add `pipelines` endpoint to merge requests API
3+
merge_request: 15454
4+
author: Tony Rom <[email protected]>
5+
type: added

doc/api/merge_requests.md

+26
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,32 @@ Parameters:
431431
}
432432
```
433433

434+
## List MR pipelines
435+
436+
Get a list of merge request pipelines.
437+
438+
```
439+
GET /projects/:id/merge_requests/:merge_request_iid/pipelines
440+
```
441+
442+
Parameters:
443+
444+
- `id` (required) - The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
445+
- `merge_request_iid` (required) - The internal ID of the merge request
446+
447+
Example of response
448+
449+
```json
450+
[
451+
{
452+
"id": 77,
453+
"sha": "959e04d7c7a30600c894bd3c0cd0e1ce7f42c11d",
454+
"ref": "master",
455+
"status": "success"
456+
}
457+
]
458+
```
459+
434460
## Create MR
435461

436462
Creates a new merge request.

lib/api/merge_requests.rb

+15
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ def find_merge_requests(args = {})
2424
.preload(:notes, :author, :assignee, :milestone, :latest_merge_request_diff, :labels, :timelogs)
2525
end
2626

27+
def merge_request_pipelines_with_access(access_level = :read_pipeline)
28+
authorize! access_level, user_project
29+
mr = find_merge_request_with_access(params[:merge_request_iid])
30+
mr.all_pipelines
31+
end
32+
2733
params :merge_requests_params do
2834
optional :state, type: String, values: %w[opened closed merged all], default: 'all',
2935
desc: 'Return opened, closed, merged, or all merge requests'
@@ -203,6 +209,15 @@ def handle_merge_request_errors!(errors)
203209
present merge_request, with: Entities::MergeRequestChanges, current_user: current_user
204210
end
205211

212+
desc 'Get the merge request pipelines' do
213+
success Entities::PipelineBasic
214+
end
215+
get ':id/merge_requests/:merge_request_iid/pipelines' do
216+
pipelines = merge_request_pipelines_with_access
217+
218+
present paginate(pipelines), with: Entities::PipelineBasic
219+
end
220+
206221
desc 'Update a merge request' do
207222
success Entities::MergeRequest
208223
end
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"type": "array",
3+
"items": { "$ref": "pipeline/basic.json" }
4+
}

spec/requests/api/merge_requests_spec.rb

+37
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,43 @@
525525
end
526526
end
527527

528+
describe 'GET /projects/:id/merge_requests/:merge_request_iid/pipelines' do
529+
context 'when authorized' do
530+
let!(:pipeline) { create(:ci_empty_pipeline, project: project, user: user, ref: merge_request.source_branch, sha: merge_request.diff_head_sha) }
531+
let!(:pipeline2) { create(:ci_empty_pipeline, project: project) }
532+
533+
it 'returns a paginated array of corresponding pipelines' do
534+
get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/pipelines")
535+
536+
expect(response).to have_gitlab_http_status(200)
537+
expect(response).to include_pagination_headers
538+
expect(json_response).to be_an Array
539+
expect(json_response.count).to eq(1)
540+
expect(json_response.first['id']).to eq(pipeline.id)
541+
end
542+
543+
it 'exposes basic attributes' do
544+
get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/pipelines")
545+
546+
expect(response).to have_gitlab_http_status(200)
547+
expect(response).to match_response_schema('public_api/v4/pipelines')
548+
end
549+
end
550+
551+
context 'when unauthorized' do
552+
it 'returns 403' do
553+
project = create(:project, public_builds: false)
554+
merge_request = create(:merge_request, :simple, source_project: project)
555+
guest = create(:user)
556+
project.team << [guest, :guest]
557+
558+
get api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/pipelines", guest)
559+
560+
expect(response).to have_gitlab_http_status(403)
561+
end
562+
end
563+
end
564+
528565
describe "POST /projects/:id/merge_requests" do
529566
context 'between branches projects' do
530567
it "returns merge_request" do

0 commit comments

Comments
 (0)