16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

はじめに

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

やったこと

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

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

これは、Qiitaに上がっているほかの方のものを参考にしました。
ユル~く使うGitLab(ギットラボ)<Issue,MRテンプレート化計画編>

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

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

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

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

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

このように設置すると
MR3.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

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

どうなったか

MRのテンプレートを作って必要事項を記入

そのメッセージとともに担当者に通知

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

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

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

16
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?