Commit 952c501f authored by Douwe Maan's avatar Douwe Maan

Merge branch 'api_only_allow_merge_if_build_succeeds' into 'master'

expose 'only_allow_merge_if_build_succeeds' project setting in the API

## What does this MR do?
Adds the 'only_allow_merge_if_build_succeeds' project setting in the API.

## Are there points in the code the reviewer needs to double check?
No, but maybe this code is not enough for ACLs or the like.

## Why was this MR needed?
Because that's a very useful setting to change via automation (through the API)

## What are the relevant issue numbers?

Closes #21085, closes https://gitlab.com/gitlab-org/gitlab-ce/issues/20088.

## Screenshots (if relevant)

## Does this MR meet the acceptance criteria?

- [X] [CHANGELOG](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CHANGELOG) entry added
- [X] [Documentation created/updated](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/development/doc_styleguide.md)
- [X] API support added
- Tests
  - [X] Added for this feature/bug
  - [X] All builds are passing
- [X] Conform by the [style guides](https://gitlab.com/gitlab-org/gitlab-ce/blob/master/CONTRIBUTING.md#style-guides)
- [X] Branch has no merge conflicts with `master` (if you do - rebase it please)
- [X] [Squashed related commits together](https://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits)

See merge request !5930
parents 90441e85 31b2c1ef
...@@ -6,6 +6,7 @@ v 8.12.0 (unreleased) ...@@ -6,6 +6,7 @@ v 8.12.0 (unreleased)
- Optimistic locking for Issues and Merge Requests (title and description overriding prevention) - Optimistic locking for Issues and Merge Requests (title and description overriding prevention)
- Add `wiki_page_events` to project hook APIs (Ben Boeckel) - Add `wiki_page_events` to project hook APIs (Ben Boeckel)
- Added tests for diff notes - Added tests for diff notes
- Added 'only_allow_merge_if_build_succeeds' project setting in the API. !5930 (Duck)
v 8.11.2 (unreleased) v 8.11.2 (unreleased)
- Show "Create Merge Request" widget for push events to fork projects on the source project - Show "Create Merge Request" widget for push events to fork projects on the source project
......
...@@ -84,7 +84,8 @@ Parameters: ...@@ -84,7 +84,8 @@ Parameters:
"star_count": 0, "star_count": 0,
"runners_token": "b8547b1dc37721d05889db52fa2f02", "runners_token": "b8547b1dc37721d05889db52fa2f02",
"public_builds": true, "public_builds": true,
"shared_with_groups": [] "shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
}, },
{ {
"id": 6, "id": 6,
...@@ -144,7 +145,8 @@ Parameters: ...@@ -144,7 +145,8 @@ Parameters:
"star_count": 0, "star_count": 0,
"runners_token": "b8547b1dc37721d05889db52fa2f02", "runners_token": "b8547b1dc37721d05889db52fa2f02",
"public_builds": true, "public_builds": true,
"shared_with_groups": [] "shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
} }
] ]
``` ```
...@@ -280,7 +282,8 @@ Parameters: ...@@ -280,7 +282,8 @@ Parameters:
"group_name": "Gitlab Org", "group_name": "Gitlab Org",
"group_access_level": 10 "group_access_level": 10
} }
] ],
"only_allow_merge_if_build_succeeds": false
} }
``` ```
...@@ -448,6 +451,7 @@ Parameters: ...@@ -448,6 +451,7 @@ Parameters:
- `visibility_level` (optional) - `visibility_level` (optional)
- `import_url` (optional) - `import_url` (optional)
- `public_builds` (optional) - `public_builds` (optional)
- `only_allow_merge_if_build_succeeds` (optional)
### Create project for user ### Create project for user
...@@ -473,6 +477,7 @@ Parameters: ...@@ -473,6 +477,7 @@ Parameters:
- `visibility_level` (optional) - `visibility_level` (optional)
- `import_url` (optional) - `import_url` (optional)
- `public_builds` (optional) - `public_builds` (optional)
- `only_allow_merge_if_build_succeeds` (optional)
### Edit project ### Edit project
...@@ -499,6 +504,7 @@ Parameters: ...@@ -499,6 +504,7 @@ Parameters:
- `public` (optional) - if `true` same as setting visibility_level = 20 - `public` (optional) - if `true` same as setting visibility_level = 20
- `visibility_level` (optional) - `visibility_level` (optional)
- `public_builds` (optional) - `public_builds` (optional)
- `only_allow_merge_if_build_succeeds` (optional)
On success, method returns 200 with the updated project. If parameters are On success, method returns 200 with the updated project. If parameters are
invalid, 400 is returned. invalid, 400 is returned.
...@@ -577,7 +583,8 @@ Example response: ...@@ -577,7 +583,8 @@ Example response:
"forks_count": 0, "forks_count": 0,
"star_count": 1, "star_count": 1,
"public_builds": true, "public_builds": true,
"shared_with_groups": [] "shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
} }
``` ```
...@@ -643,7 +650,8 @@ Example response: ...@@ -643,7 +650,8 @@ Example response:
"forks_count": 0, "forks_count": 0,
"star_count": 0, "star_count": 0,
"public_builds": true, "public_builds": true,
"shared_with_groups": [] "shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
} }
``` ```
...@@ -729,7 +737,8 @@ Example response: ...@@ -729,7 +737,8 @@ Example response:
"star_count": 0, "star_count": 0,
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b", "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"public_builds": true, "public_builds": true,
"shared_with_groups": [] "shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
} }
``` ```
...@@ -815,7 +824,8 @@ Example response: ...@@ -815,7 +824,8 @@ Example response:
"star_count": 0, "star_count": 0,
"runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b", "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
"public_builds": true, "public_builds": true,
"shared_with_groups": [] "shared_with_groups": [],
"only_allow_merge_if_build_succeeds": false
} }
``` ```
......
...@@ -90,6 +90,7 @@ module API ...@@ -90,6 +90,7 @@ module API
expose :shared_with_groups do |project, options| expose :shared_with_groups do |project, options|
SharedGroup.represent(project.project_group_links.all, options) SharedGroup.represent(project.project_group_links.all, options)
end end
expose :only_allow_merge_if_build_succeeds
end end
class Member < UserBasic class Member < UserBasic
......
...@@ -123,7 +123,8 @@ module API ...@@ -123,7 +123,8 @@ module API
:public, :public,
:visibility_level, :visibility_level,
:import_url, :import_url,
:public_builds] :public_builds,
:only_allow_merge_if_build_succeeds]
attrs = map_public_to_visibility_level(attrs) attrs = map_public_to_visibility_level(attrs)
@project = ::Projects::CreateService.new(current_user, attrs).execute @project = ::Projects::CreateService.new(current_user, attrs).execute
if @project.saved? if @project.saved?
...@@ -172,7 +173,8 @@ module API ...@@ -172,7 +173,8 @@ module API
:public, :public,
:visibility_level, :visibility_level,
:import_url, :import_url,
:public_builds] :public_builds,
:only_allow_merge_if_build_succeeds]
attrs = map_public_to_visibility_level(attrs) attrs = map_public_to_visibility_level(attrs)
@project = ::Projects::CreateService.new(user, attrs).execute @project = ::Projects::CreateService.new(user, attrs).execute
if @project.saved? if @project.saved?
...@@ -234,7 +236,8 @@ module API ...@@ -234,7 +236,8 @@ module API
:shared_runners_enabled, :shared_runners_enabled,
:public, :public,
:visibility_level, :visibility_level,
:public_builds] :public_builds,
:only_allow_merge_if_build_succeeds]
attrs = map_public_to_visibility_level(attrs) attrs = map_public_to_visibility_level(attrs)
authorize_admin_project authorize_admin_project
authorize! :rename_project, user_project if attrs[:name].present? authorize! :rename_project, user_project if attrs[:name].present?
......
This diff is collapsed.
...@@ -224,7 +224,8 @@ describe API::API, api: true do ...@@ -224,7 +224,8 @@ describe API::API, api: true do
description: FFaker::Lorem.sentence, description: FFaker::Lorem.sentence,
issues_enabled: false, issues_enabled: false,
merge_requests_enabled: false, merge_requests_enabled: false,
wiki_enabled: false wiki_enabled: false,
only_allow_merge_if_build_succeeds: false
}) })
post api('/projects', user), project post api('/projects', user), project
...@@ -276,6 +277,18 @@ describe API::API, api: true do ...@@ -276,6 +277,18 @@ describe API::API, api: true do
expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE) expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
end end
it 'sets a project as allowing merge even if build fails' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: false })
post api('/projects', user), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_falsey
end
it 'sets a project as allowing merge only if build succeeds' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: true })
post api('/projects', user), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_truthy
end
context 'when a visibility level is restricted' do context 'when a visibility level is restricted' do
before do before do
@project = attributes_for(:project, { public: true }) @project = attributes_for(:project, { public: true })
...@@ -384,6 +397,18 @@ describe API::API, api: true do ...@@ -384,6 +397,18 @@ describe API::API, api: true do
expect(json_response['public']).to be_falsey expect(json_response['public']).to be_falsey
expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE) expect(json_response['visibility_level']).to eq(Gitlab::VisibilityLevel::PRIVATE)
end end
it 'sets a project as allowing merge even if build fails' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: false })
post api("/projects/user/#{user.id}", admin), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_falsey
end
it 'sets a project as allowing merge only if build succeeds' do
project = attributes_for(:project, { only_allow_merge_if_build_succeeds: true })
post api("/projects/user/#{user.id}", admin), project
expect(json_response['only_allow_merge_if_build_succeeds']).to be_truthy
end
end end
describe "POST /projects/:id/uploads" do describe "POST /projects/:id/uploads" do
...@@ -444,6 +469,7 @@ describe API::API, api: true do ...@@ -444,6 +469,7 @@ describe API::API, api: true do
expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id) expect(json_response['shared_with_groups'][0]['group_id']).to eq(group.id)
expect(json_response['shared_with_groups'][0]['group_name']).to eq(group.name) expect(json_response['shared_with_groups'][0]['group_name']).to eq(group.name)
expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access) expect(json_response['shared_with_groups'][0]['group_access_level']).to eq(link.group_access)
expect(json_response['only_allow_merge_if_build_succeeds']).to eq(project.only_allow_merge_if_build_succeeds)
end end
it 'returns a project by path name' do it 'returns a project by path name' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment