From 688c5a98799b2aeeee780cbfa30e9df5723fa424 Mon Sep 17 00:00:00 2001 From: Karlis Sergijevskis Date: Thu, 27 May 2021 12:00:42 +0300 Subject: [PATCH 1/6] Add create merge request level rule api --- lib/gitlab/client/merge_request_approvals.rb | 28 ++++++++++ spec/fixtures/merge_request_level_rule.json | 55 +++++++++++++++++++ .../client/merge_request_approvals_spec.rb | 20 +++++++ 3 files changed, 103 insertions(+) create mode 100644 spec/fixtures/merge_request_level_rule.json diff --git a/lib/gitlab/client/merge_request_approvals.rb b/lib/gitlab/client/merge_request_approvals.rb index 949aefca6..75b458101 100644 --- a/lib/gitlab/client/merge_request_approvals.rb +++ b/lib/gitlab/client/merge_request_approvals.rb @@ -126,6 +126,8 @@ def edit_merge_request_approvals(project, merge_request, options = {}) end # Change allowed approvers and approver groups for a merge request + # @deprecated Since Gitlab 13.12 /approvers endpoints are removed!!! + # See Gitlab.create_merge_request_level_rule # # @example # Gitlab.edit_merge_request_approvers(1, 5, {approver_ids: [5], approver_groups: [1]}) @@ -139,6 +141,32 @@ def edit_merge_request_approvers(project, merge_request, options = {}) put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approvers", body: options) end + # Create merge request level rule + # + # @example + # Gitlab.create_merge_request_level_rule(1, 2, { + # name: "devs", + # approvals_required: 2, + # approval_project_rule_id: 99, + # user_ids: [3, 4], + # group_ids: [5, 6], + # }) + # + # Important: When approval_project_rule_id is set, the name, users and groups of project-level rule are copied. + # The approvals_required specified is used. + # + # @param [Integer] project(required) The ID of a project. + # @param [Integer] merge_request(required) The IID of a merge request. + # @option options [String] :name(required) The name of the approval rule + # @option options [Integer] :approvals_required(required) The number of required approvals for this rule + # @option options [Integer] :approval_project_rule_id(optional) The ID of a project-level approval rule + # @option options [Array] :user_ids(optional) The ids of users as approvers + # @option options [Array] :group_ids(optional) The ids of groups as approvers + # @return [Gitlab::ObjectifiedHash] New MR level approval rule + def create_merge_request_level_rule(project, merge_request, options = {}) + post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules", body: options) + end + # Approve a merge request # # @example diff --git a/spec/fixtures/merge_request_level_rule.json b/spec/fixtures/merge_request_level_rule.json new file mode 100644 index 000000000..a56c04c9e --- /dev/null +++ b/spec/fixtures/merge_request_level_rule.json @@ -0,0 +1,55 @@ +{ + "id": 1, + "name": "security", + "rule_type": "regular", + "eligible_approvers": [ + { + "id": 2, + "name": "John Doe", + "username": "jdoe", + "state": "active", + "avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon", + "web_url": "http://localhost/jdoe" + }, + { + "id": 50, + "name": "Group Member 1", + "username": "group_member_1", + "state": "active", + "avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon", + "web_url": "http://localhost/group_member_1" + } + ], + "approvals_required": 1, + "source_rule": null, + "users": [ + { + "id": 2, + "name": "John Doe", + "username": "jdoe", + "state": "active", + "avatar_url": "https://www.gravatar.com/avatar/0?s=80&d=identicon", + "web_url": "http://localhost/jdoe" + } + ], + "groups": [ + { + "id": 5, + "name": "group1", + "path": "group1", + "description": "", + "visibility": "public", + "lfs_enabled": false, + "avatar_url": null, + "web_url": "http://localhost/groups/group1", + "request_access_enabled": false, + "full_name": "group1", + "full_path": "group1", + "parent_id": null, + "ldap_cn": null, + "ldap_access": null + } + ], + "contains_hidden_groups": false, + "overridden": false +} \ No newline at end of file diff --git a/spec/gitlab/client/merge_request_approvals_spec.rb b/spec/gitlab/client/merge_request_approvals_spec.rb index d266e9288..e9d9b1520 100644 --- a/spec/gitlab/client/merge_request_approvals_spec.rb +++ b/spec/gitlab/client/merge_request_approvals_spec.rb @@ -176,6 +176,26 @@ end end + describe '.create_merge_request_level_rule' do + before do + body = { name: "security", approvals_required: 1, approval_project_rule_id: 99, user_ids: [3, 4], group_ids: [5, 6] } + stub_post('/projects/1/merge_requests/5/approval_rules', 'merge_request_level_rule').with(body: body) + @merge_request_lvl_rule = Gitlab.create_merge_request_level_rule(1, 5, body) + end + + it 'gets the correct resource' do + body = { name: "security", approvals_required: 1, approval_project_rule_id: 99, user_ids: [3, 4], group_ids: [5, 6] } + expect(a_post('/projects/1/merge_requests/5/approval_rules') + .with(body: body)).to have_been_made + end + + it 'returns the correct updated configuration' do + expect(@merge_request_lvl_rule).to be_a Gitlab::ObjectifiedHash + expect(@merge_request_lvl_rule.name).to eq "security" + expect(@merge_request_lvl_rule.approvals_required).to eq 1 + end + end + describe '.approve_merge_request' do before do stub_post('/projects/1/merge_requests/5/approve', 'merge_request_approvals') From fcbc40ff47be118df9c52ae2ab4e8ed845ba36a2 Mon Sep 17 00:00:00 2001 From: Karlis Sergijevskis Date: Thu, 27 May 2021 12:14:45 +0300 Subject: [PATCH 2/6] Add support for update merge request level rule endpoint --- lib/gitlab/client/merge_request_approvals.rb | 22 +++++++++++++++++++ .../client/merge_request_approvals_spec.rb | 20 +++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/lib/gitlab/client/merge_request_approvals.rb b/lib/gitlab/client/merge_request_approvals.rb index 75b458101..5a1dc1291 100644 --- a/lib/gitlab/client/merge_request_approvals.rb +++ b/lib/gitlab/client/merge_request_approvals.rb @@ -167,6 +167,28 @@ def create_merge_request_level_rule(project, merge_request, options = {}) post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules", body: options) end + # Update merge request level rule + # + # @example + # Gitlab.update_merge_request_level_rule(1, 2, 69, { + # name: "devs", + # approvals_required: 2, + # user_ids: [3, 4], + # group_ids: [5, 6], + # }) + # + # @param [Integer] project(required) The ID of a project. + # @param [Integer] merge_request(required) The IID of a merge request. + # @param [Integer] appr_rule_id(required) The ID of a approval rule + # @option options [String] :name(required) The name of the approval rule + # @option options [Integer] :approvals_required(required) The number of required approvals for this rule + # @option options [Array] :user_ids(optional) The ids of users as approvers + # @option options [Array] :group_ids(optional) The ids of groups as approvers + # @return [Gitlab::ObjectifiedHash] Updated MR level approval rule + def update_merge_request_level_rule(project, merge_request, appr_rule_id, options = {}) + put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}", body: options) + end + # Approve a merge request # # @example diff --git a/spec/gitlab/client/merge_request_approvals_spec.rb b/spec/gitlab/client/merge_request_approvals_spec.rb index e9d9b1520..c2140dbe4 100644 --- a/spec/gitlab/client/merge_request_approvals_spec.rb +++ b/spec/gitlab/client/merge_request_approvals_spec.rb @@ -196,6 +196,26 @@ end end + describe '.update_merge_request_level_rule' do + before do + body = { name: 'security', approvals_required: 1, user_ids: [3, 4], group_ids: [5, 6] } + stub_put('/projects/1/merge_requests/5/approval_rules/69', 'merge_request_level_rule').with(body: body) + @merge_request_lvl_rule = Gitlab.update_merge_request_level_rule(1, 5, 69, body) + end + + it 'gets the correct resource' do + body = { name: "security", approvals_required: 1, user_ids: [3, 4], group_ids: [5, 6] } + expect(a_put('/projects/1/merge_requests/5/approval_rules/69') + .with(body: body)).to have_been_made + end + + it 'returns the correct updated configuration' do + expect(@merge_request_lvl_rule).to be_a Gitlab::ObjectifiedHash + expect(@merge_request_lvl_rule.name).to eq "security" + expect(@merge_request_lvl_rule.approvals_required).to eq 1 + end + end + describe '.approve_merge_request' do before do stub_post('/projects/1/merge_requests/5/approve', 'merge_request_approvals') From 32a785266fa7c67092433c527ecffbe1685c0f4a Mon Sep 17 00:00:00 2001 From: Karlis Sergijevskis Date: Thu, 27 May 2021 12:23:20 +0300 Subject: [PATCH 3/6] Delete merge request level rule --- lib/gitlab/client/merge_request_approvals.rb | 20 +++++++++++++++++++ .../client/merge_request_approvals_spec.rb | 11 ++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/gitlab/client/merge_request_approvals.rb b/lib/gitlab/client/merge_request_approvals.rb index 5a1dc1291..04daa003b 100644 --- a/lib/gitlab/client/merge_request_approvals.rb +++ b/lib/gitlab/client/merge_request_approvals.rb @@ -177,6 +177,10 @@ def create_merge_request_level_rule(project, merge_request, options = {}) # group_ids: [5, 6], # }) # + # Important: Approvers and groups not in the users/groups parameters are removed + # Important: Updating a report_approver or code_owner rule is not allowed. + # These are system generated rules. + # # @param [Integer] project(required) The ID of a project. # @param [Integer] merge_request(required) The IID of a merge request. # @param [Integer] appr_rule_id(required) The ID of a approval rule @@ -189,6 +193,22 @@ def update_merge_request_level_rule(project, merge_request, appr_rule_id, option put("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}", body: options) end + # Delete merge request level rule + # + # @example + # Gitlab.delete_merge_request_level_rule(1, 2, 69) + # + # Important: Deleting a report_approver or code_owner rule is not allowed. + # These are system generated rules. + # + # @param [Integer] project(required) The ID of a project. + # @param [Integer] merge_request(required) The IID of a merge request. + # @param [Integer] appr_rule_id(required) The ID of a approval rule + # @return [void] This API call returns an empty response body + def delete_merge_request_level_rule(project, merge_request, appr_rule_id) + delete("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules/#{appr_rule_id}") + end + # Approve a merge request # # @example diff --git a/spec/gitlab/client/merge_request_approvals_spec.rb b/spec/gitlab/client/merge_request_approvals_spec.rb index c2140dbe4..bdfd95297 100644 --- a/spec/gitlab/client/merge_request_approvals_spec.rb +++ b/spec/gitlab/client/merge_request_approvals_spec.rb @@ -216,6 +216,17 @@ end end + describe '.delete_merge_request_level_rule' do + before do + stub_delete('/projects/1/merge_requests/5/approval_rules/69', 'empty') + Gitlab.delete_merge_request_level_rule(1, 5, 69) + end + + it 'deletes the correct resource' do + expect(a_delete('/projects/1/merge_requests/5/approval_rules/69')).to have_been_made + end + end + describe '.approve_merge_request' do before do stub_post('/projects/1/merge_requests/5/approve', 'merge_request_approvals') From 868c3150939e7aa3d1b825ce782c7b22989771cd Mon Sep 17 00:00:00 2001 From: Karlis Sergijevskis Date: Fri, 28 May 2021 10:23:54 +0300 Subject: [PATCH 4/6] Add merge request level approval rule get endpoint --- lib/gitlab/client/merge_request_approvals.rb | 14 ++++++++++++++ .../client/merge_request_approvals_spec.rb | 16 ++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/lib/gitlab/client/merge_request_approvals.rb b/lib/gitlab/client/merge_request_approvals.rb index 04daa003b..706549cad 100644 --- a/lib/gitlab/client/merge_request_approvals.rb +++ b/lib/gitlab/client/merge_request_approvals.rb @@ -88,6 +88,8 @@ def delete_project_merge_request_approval_rule(project, approval_rule_id) end # Change allowed approvers and approver groups for a project + # @deprecated Since Gitlab 13.12 /approvers endpoints are removed!!! + # See Gitlab.create_project_merge_request_approval_rule # # @example # Gitlab.edit_project_approvers(1, {approver_ids: [5], approver_groups: [1]}) @@ -167,6 +169,18 @@ def create_merge_request_level_rule(project, merge_request, options = {}) post("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules", body: options) end + # Get merge request level rule + # + # @example + # Gitlab.merge_request_level_rule(1, 2) + # + # @param [Integer] project(required) The ID of a project. + # @param [Integer] merge_request(required) The IID of a merge request. + # @return [Gitlab::ObjectifiedHash] New MR level approval rule + def merge_request_level_rule(project, merge_request) + get("/projects/#{url_encode project}/merge_requests/#{merge_request}/approval_rules") + end + # Update merge request level rule # # @example diff --git a/spec/gitlab/client/merge_request_approvals_spec.rb b/spec/gitlab/client/merge_request_approvals_spec.rb index bdfd95297..3d6bad0b5 100644 --- a/spec/gitlab/client/merge_request_approvals_spec.rb +++ b/spec/gitlab/client/merge_request_approvals_spec.rb @@ -196,6 +196,22 @@ end end + describe '.merge_request_level_rule' do + before do + stub_get('/projects/3/merge_requests/1/approval_rules', 'merge_request_level_rule') + @approval_state = Gitlab.merge_request_level_rule(3, 1) + end + + it 'gets the correct resource' do + expect(a_get('/projects/3/merge_requests/1/approval_rules')).to have_been_made + end + + it 'returns information about all merge request level approval rules' do + expect(@approval_state.approvals_required).to eq(1) + expect(@approval_state.id).to eq(1) + end + end + describe '.update_merge_request_level_rule' do before do body = { name: 'security', approvals_required: 1, user_ids: [3, 4], group_ids: [5, 6] } From 29f3242fc6ad157ecf7485d0a79882c6ba42f31e Mon Sep 17 00:00:00 2001 From: Karlis Sergijevskis Date: Fri, 28 May 2021 10:24:38 +0300 Subject: [PATCH 5/6] Rubocopping :alarm: --- spec/gitlab/client/merge_request_approvals_spec.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spec/gitlab/client/merge_request_approvals_spec.rb b/spec/gitlab/client/merge_request_approvals_spec.rb index 3d6bad0b5..5baaacdad 100644 --- a/spec/gitlab/client/merge_request_approvals_spec.rb +++ b/spec/gitlab/client/merge_request_approvals_spec.rb @@ -178,20 +178,20 @@ describe '.create_merge_request_level_rule' do before do - body = { name: "security", approvals_required: 1, approval_project_rule_id: 99, user_ids: [3, 4], group_ids: [5, 6] } + body = { name: 'security', approvals_required: 1, approval_project_rule_id: 99, user_ids: [3, 4], group_ids: [5, 6] } stub_post('/projects/1/merge_requests/5/approval_rules', 'merge_request_level_rule').with(body: body) @merge_request_lvl_rule = Gitlab.create_merge_request_level_rule(1, 5, body) end it 'gets the correct resource' do - body = { name: "security", approvals_required: 1, approval_project_rule_id: 99, user_ids: [3, 4], group_ids: [5, 6] } + body = { name: 'security', approvals_required: 1, approval_project_rule_id: 99, user_ids: [3, 4], group_ids: [5, 6] } expect(a_post('/projects/1/merge_requests/5/approval_rules') .with(body: body)).to have_been_made end it 'returns the correct updated configuration' do expect(@merge_request_lvl_rule).to be_a Gitlab::ObjectifiedHash - expect(@merge_request_lvl_rule.name).to eq "security" + expect(@merge_request_lvl_rule.name).to eq 'security' expect(@merge_request_lvl_rule.approvals_required).to eq 1 end end @@ -220,14 +220,14 @@ end it 'gets the correct resource' do - body = { name: "security", approvals_required: 1, user_ids: [3, 4], group_ids: [5, 6] } + body = { name: 'security', approvals_required: 1, user_ids: [3, 4], group_ids: [5, 6] } expect(a_put('/projects/1/merge_requests/5/approval_rules/69') .with(body: body)).to have_been_made end it 'returns the correct updated configuration' do expect(@merge_request_lvl_rule).to be_a Gitlab::ObjectifiedHash - expect(@merge_request_lvl_rule.name).to eq "security" + expect(@merge_request_lvl_rule.name).to eq 'security' expect(@merge_request_lvl_rule.approvals_required).to eq 1 end end From cc13e16e942831bc951f29b21879b79117222b27 Mon Sep 17 00:00:00 2001 From: Karlis Sergijevskis Date: Tue, 24 Aug 2021 15:17:11 +0300 Subject: [PATCH 6/6] Add create merge request pipeline endpoint --- lib/gitlab/client/merge_requests.rb | 19 +++++++++++++++++++ spec/gitlab/client/merge_requests_spec.rb | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/lib/gitlab/client/merge_requests.rb b/lib/gitlab/client/merge_requests.rb index 4d01019d9..d2bd5f3f9 100644 --- a/lib/gitlab/client/merge_requests.rb +++ b/lib/gitlab/client/merge_requests.rb @@ -59,6 +59,25 @@ def merge_request_pipelines(project, id) get("/projects/#{url_encode project}/merge_requests/#{id}/pipelines") end + # Create a new pipeline for a merge request. + # A pipeline created via this endpoint doesnt run a regular branch/tag pipeline. + # It requires .gitlab-ci.yml to be configured with only: [merge_requests] to create jobs. + # + # The new pipeline can be: + # + # A detached merge request pipeline. + # A pipeline for merged results if the project setting is enabled. + # + # @example + # Gitlab.create_merge_request_pipeline(5, 36) + # + # @param [Integer, String] project The ID or name of a project. + # @param [Integer] iid The internal ID of a merge request. + # @return [Gitlab::ObjectifiedHash] + def create_merge_request_pipeline(project, iid) + post("/projects/#{url_encode project}/merge_requests/#{iid}/pipelines") + end + # Get a list of merge request participants. # # @example diff --git a/spec/gitlab/client/merge_requests_spec.rb b/spec/gitlab/client/merge_requests_spec.rb index dcb738157..b05bf4364 100644 --- a/spec/gitlab/client/merge_requests_spec.rb +++ b/spec/gitlab/client/merge_requests_spec.rb @@ -77,6 +77,18 @@ end end + describe '.create_merge_request_pipeline' do + before do + stub_post('/projects/3/merge_requests/2/pipelines', 'pipeline_create') + end + + it 'returns information about created merge request pipeline' do + @pipeline = Gitlab.create_merge_request_pipeline(3, 2) + expect(@pipeline.yaml_errors).to be_nil + expect(@pipeline.status).to eq('pending') + end + end + describe '.create_merge_request' do before do stub_post('/projects/3/merge_requests', 'merge_request')