GitLabのMerge Requestの制御(Build Succeeds, Discussion Resolution, WIP)

# GitLabのMerge Requestを少し制御してみる
GitLabではMergeRequestの受入に幾つか設定があります。

今回は簡単に制御出来る３つの方法について確認します。
1. [Merge When Build Succeeds](https://gitlab.com/help/user/project/merge_requests/merge_when_build_succeeds.md)（ビルドが通らなければMergeを許可しない）
2. [Merge Request discussion resolution](https://gitlab.com/help/user/project/merge_requests/merge_request_discussion_resolution.md)（discussionが解決しなければMergeを許可しない）
3. ["Work In Progress" Merge Requests](https://gitlab.com/help/user/project/merge_requests/work_in_progress_merge_requests.md)（`WIP:`をタイトルから消さないかぎり許可しない）


## 1.Merge When Build Succeeds
名前の通りビルドが成功しない限りMergeの許可を出来ないようにする方法です。
プロジェクトの設定ページ(`Edit Project`)から`Only allow merge requests to be merged if the build succeeds`のチェックボックスを入れ、保存（`Save changes`）するだけです。

確認してみましょう。

Hello worldが書いていれば成功する`.gitlab-ci.yml`を書きます
<img width="548" alt="1.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/e219e659-a36d-2114-4e69-020a49c06d2c.png">

masterブランチにはHello world
<img width="321" alt="2.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/aa54a62a-fca5-cc3d-e685-b6c7c4af2583.png">

Hello worldがないdelworldというブランチを作成します。
<img width="328" alt="3.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/33dedd52-b2cb-3884-987b-f8cf2ea51aa5.png">

この状態のビルドの状態はdelworldというブランチは`failed`になっています。
<img width="569" alt="4.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/449c0a01-13a0-e442-3807-198c491774a8.png">

masterへの`Merge Request`を作ると赤くはなっていますが`Accept Merge Request`を押せますね。
<img width="822" alt="5.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/e7af190e-4b15-0d63-517c-465199c45abd.png">

ここで`Edit Project` -> `Only allow merge requests to be merged if the build succeeds`のチェックボックスを入れ、`Save changes`します。
<img width="518" alt="6.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/636625b5-b2c2-e531-84ad-e5edd139d432.png">

Merge Requestの画面に戻ると`The build for this merge request failed`になり、Mergeの許可を制御しています。
<img width="815" alt="7.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/966b2663-30a1-45de-e88c-1baa43764f83.png">


## 2.Merge Request discussion resolution
名前の通りディスカッションが解決しない限りMergeの許可を出来ないようにする方法です。
プロジェクトの設定ページ(`Edit Project`)から`Only allow merge requests to be merged if all discussions are resolved`のチェックボックスを入れ、保存（`Save changes`）するだけです。

デフォルトの状態だとコメントがあっても`Accept Merge Request`は押せます。
<img width="971" alt="11.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/661de89f-1f43-a23f-ab00-7a74530dc370.png">

ここでEdit Project -> `Only allow merge requests to be merged if all discussions are resolved`のチェックボックスを入れ、`Save changes`
<img width="513" alt="12.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/9d5c9c88-89bc-143a-749b-437bab10ce01.png">

すると`This merge request has unresolved discussions`になり、Mergeの許可を制御しています。
<img width="985" alt="13.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/afe50ea5-541d-b52e-13a0-04cd28d79b9d.png">

Mergeをできるようにするには各コメントにたいしてすべて丸チェックを押下します。
<img width="903" alt="14.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/7e98fb82-306a-bb4e-adee-f84995fbe27d.png">

すべてチェックを入れると`x/x discussion resoloved`のチェックがされます。
<img width="211" alt="15.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/ce2cdb39-902e-70e3-a214-86d18dc7a554.png">

そして画面をリロードすると`Merge Request`をすることができます。
<img width="981" alt="16.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/4bd0fb14-eaac-f12b-33fa-5b813b7156a3.png">


## 3."Work In Progress" Merge Requests
`[WIP]`または`WIP:`を`Merge Request`のタイトルに入力するだけです。

`Merge Request`のタイトルに`WIP:`または`[WIP]`を入れます。
<img width="1104" alt="21.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/6036a007-7952-b819-a9b3-15ae803e272a.png">
<img width="1097" alt="22.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/9977d9cc-c33c-4ed2-3cfd-c52d3e8ceabe.png">

`This merge request is currently a Work In Progress`というメッセージが表示されMergeを制御しています。
<img width="811" alt="23.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/eb4a57d8-3002-9bad-4740-a86b31e8f848.png">

<img width="811" alt="24.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/464ab28b-2366-d808-2099-f3124ebaa78f.png">

Mergeをさせるには先程のタイトルに先頭に入力した`WIP:`または`[WIP]`を削除します。
<img width="1100" alt="25.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/7b1359bd-f8e0-8c6d-7430-75441e345455.png">
<img width="1094" alt="26.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/e5e79a2d-06ad-474b-4dce-40492287219c.png">

タイトルを変更したら`Merge Request`をすることができます。
<img width="811" alt="27.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/412cca71-2af4-a34d-42fe-87d214cc6ed1.png">
<img width="813" alt="28.png" src="https://qiita-image-store.s3.amazonaws.com/0/151648/d4da254d-17d6-1e12-2e6c-cb3b1a5c0210.png">

## 最後
~~いかがだったでしょうか、これらの機能はGitLab上での話ですので、いくら制御してもローカルでMergeしてPushは可能です。確認はローカルで行い、Merge自体はGitLabのMerge Request上で行うと、ルール作りも楽になるのではないでしょうか？~~

非常に簡単な説明ですが以上です。

## 追記
[Protected Branches](https://docs.gitlab.com/ce/user/project/protected_branches.html)でbranchごとにMerge Requestの制御ができるみたいです。

hiroponzさんありがとうございます。