GitLabで心地よいマージリクエスト生活を送るためにやったこと

# はじめに

最近弊社のGitリポジトリをBacklogからGitLabに移行することがありました
その時にマージリクエスト周りで整えてよかった2点の共有です
モチベーションとしては、マージリクエストを送った際になるべく追加でやり取りを発生させたくない！というもの


# やったこと

- マージリクエストのテンプレートの作成
- マージリクエスト内容をSlackに通知

# マージリクエストのテンプレートの作成

これは、Qiitaに上がっているほかの方のものを参考にしました。
[ユル～く使うGitLab(ギットラボ)\<Issue,MRテンプレート化計画編>](https://qiita.com/E_Schaf/items/1e2c68ccafa7013994d9)

- ルートディレクトリに`.gitlab`というディレクトリを作成
- その中に`merge_request_templates`というディレクトリを作成
- その中に`MRテンプレート.md`を作成

```MRテンプレート.md
## 概要

{課題番号}-ISSUE_NAME　//issueとの紐づけ

### 開発内容
- 内容を書く

### 見てほしい箇所
- 特に見てほしい箇所を書く

### その他
その他必要なメッセージを書く

```

このように設置すると
![MR3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/3c11690c-adb9-1912-5e7b-bfce74427fb7.png)

こんな風にテンプレートから選択することができる。

# マージリクエスト内容をSlackに通知

本来、GitLab＞設定＞インテグレーション＞Slack notificationsというSlack用の通知が用意されている。
しかし、担当者へのメンションをつけたかったので、web hookでcloud functionsを呼び出し、そこからslackに飛ばすようにした。

```slack.py
import slackweb
import os

def index(request):
    """Responds to any HTTP request.
    Args:
        request (flask.Request): HTTP request object.
    Returns:
        The response text or any set of values that can be turned into a
        Response object using
        `make_response <http://flask.pocoo.org/docs/1.0/api/#flask.Flask.make_response>`.
    """
    request_json = request.get_json()

    title = request_json['object_attributes']['title']
    user = request_json['user']['username']
    mention = return_mention(request_json['object_attributes']['assignee_id'])
    project_name = request_json['project']['name']
    branch = '{} => {}'.format(request_json['object_attributes']['source_branch'], request_json['object_attributes']['target_branch'])
    url = request_json['object_attributes']['url']
    repository = request_json['repository']['name']
    description = request_json['object_attributes']['description']
    author = return_mention(request_json['object_attributes']['author_id'])
    
    if request_json['object_kind'] != 'merge_request' or request_json['event_type'] != 'merge_request':
        return f'close'
    
    # マージリクエスト申請時
    if request_json['object_attributes']['merge_status'] == 'unchecked':
        message = 'マージリクエストが送られました\n'
        message = message + '\nプロジェクト名：' + project_name
        message = message + '\nリポジトリ名：' + repository
        message = message + '\nタイトル：' + title
        message = message + '\nユーザー：' + user
        message = message + '\nブランチ：' + branch
        message = message + '\n担当者：' + mention
        message = message + '\nurl：' + url
        message = message + '\n\nメッセージ：\n' + description

    # マージリクエスト承認時
    if request_json['object_attributes']['merge_status'] == 'can_be_merged':
        message = author + '\n\nリクエストがマージされました\n'
        message = message + '\nプロジェクト名：' + project_name
        message = message + '\nリポジトリ名：' + repository
        message = message + '\nタイトル：' + title
        message = message + '\nブランチ：' + branch
        message = message + '\nurl：' + url
    

    slack = slackweb.Slack(url=os.environ["SLACK_URL"])
    slack.notify(text=message)


    return f'success'


# ここは各自のslack user idとGitLabのuser idを紐づける
def return_mention(id):
    if id == 0000000:
        return '<@mention>'
    if id == 1111111:
        return '<@mention>'
    if id == 2222222:
        return '<@mention>'
    if id == 3333333:
        return '<@mention>'
    return 'なし'
```

こんな感じでサクッと実装。

![MRS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/251929/d855beaf-7cbf-7035-9715-2606c61381d7.png)

プライベートなところは隠してますが、__担当者__のところは@でメンションが入っています。

# どうなったか

MRのテンプレートを作って必要事項を記入
↓
そのメッセージとともに担当者に通知

というをGitLab上ですませることができたため、

Aさん 「Bさん、○○の件でマージリクエスト送ったので見ておいて下さい」
Bさん 「承知です！」
Aさん 「あ、ここを重点的に見てほしくて、まだマージもしないでください！」
Bさん 「（早くいってよ。。。）」

みたいなことを減らすことができたかなあと思います。
無駄なやり取りも減って、みんなが把握しやすくなってハッピーになりました。