GitLabでリリースMRを作成する「gitlab_mr_release」

# gitlab_mr_release
git flowで開発してる時にマージ済のMergeRequestからいい感じにリリース用のMergeRequestを作るためのgemです

* https://github.com/sue445/gitlab_mr_release
* https://rubygems.org/gems/gitlab_mr_release

GitHubだと [git-pr-release]([motemen/git-pr-release: Release pull request generator](https://github.com/motemen/git-pr-release)) があるのですが、GitLabだとそういうのがなかったので作りました

git-pr-release については下記を参照

* [git-pr-releaseのすすめ - ninjinkun's diary](http://ninjinkun.hatenablog.com/entry/2014/06/03/175113)
* [はてなブログチームの開発フローとGitHub（後編）。GitHub Kaigi 2014 － Publickey](http://www.publickey1.jp/blog/14/githubgithub_kaigi_2014_1.html)

# 使い方
## 設定ファイルを作る
まず `gitlab_mr_release init` で設定ファイルを作成します

```shell-session
$ gitlab_mr_release init
      create  .env.gitlab
      create  gitlab_mr_release.md.erb
```

## リリースMergeRequestを作成
`gitlab_mr_release create` で `--source` と `--target` の間にあるアクセプトされたMergeRequestを元にリリース用のMergeRequestを作成します

```shell-session
$ gitlab_mr_release create --source=develop --target=master
```

![20151115222734.png](https://qiita-image-store.s3.amazonaws.com/0/8059/78ff52de-8347-761d-dd23-dfe2ba6e2428.png)

# 設定ファイルについて
## .env.gitlab
`.env.gitlab` では下記のような設定が使えます

```:.env.gitlab
GITLAB_API_ENDPOINT=http://example.com/api/v3
GITLAB_API_PRIVATE_TOKEN=XXXXXXXXXXXXXXXXXXX
GITLAB_PROJECT_NAME=group/name
TEMPLATE_FILE=gitlab_mr_release.md.erb
DEFAULT_TITLE=Release <%= Time.now %> <%= source_branch %> -> <%= target_branch %>
DEFAULT_SOURCE_BRANCH=develop
DEFAULT_TARGET_BRANCH=master
DEFAULT_LABELS=release
```

この設定ファイルはカレントディレクトリ（ `.env.gitlab` ）とhomeディレクトリ（`~/.env.gitlab`）の2ヶ所から読みこむことができるので、`GITLAB_API_PRIVATE_TOKEN` のようにリポジトリにコミットしたくないものは `~/.env.gitlab` に設定しておくとよいです

`~/.bash_profile` あたりで

```shell-session
export GITLAB_API_PRIVATE_TOKEN=XXXXXXXXXXXXXXXXXXX
```

していてもたぶん大丈夫

## gitlab_mr_release.md.erb
```erb:gitlab_mr_release.md.erb
# MergeRequests
<% merge_requests.each do |mr| %>
* [ ] !<%= mr.iid %> <%= mr.title %> @<%= mr.author.username %>
<% end %>
```

MergeRequestを作成する時のdescriptionのテンプレートです。erbなので `each` でループを回したりできます。

`merge_requests` は `gitlab_mr_release create` 実行時の `--source` と `--target` の間にあるアクセプトされたMergeRequestの配列です。

`mr` で参照できる要素は下記参照。 https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/merge_requests.md#get-single-mr

# 引数の説明
`gitlab_mr_release create` に引数が渡されなかった場合、`.env.gitlab` や `~/.env.gitlab` から読み込まれます。

優先順位は下記です。（上にあるほど優先度が高い）

1. `gitlab_mr_release create` の引数
2. カレントディレクトリの `.env.gitlab`
3. `~/.env.gitlab`

* `--source` , `DEFAULT_SOURCE_BRANCH` **(どちらか片方必須)**
  * リリースMRのマージ元branch (例. `develop`)
* `--target` , `DEFAULT_TARGET_BRANCH` **(どちらか片方必須)**
  * リリースMRのマージ先branch (例. `master`)
* `--title`, `DEFAULT_TITLE`
  * MergeRequestのタイトル
  * `DEFAULT_TITLE` はerbで書けます。
  * 両方ない場合のデフォルトは 「Release :timestamp :source -> :target」
* `--labels` , `DEFAULT_LABELS`
  * リリースMRのラベル
  * カンマ区切りで複数設定(例. `label1,label2`)

#Tips
## 設定の使い分けの指針
自分がメンテしてるアプリだと `GITLAB_API_PRIVATE_TOKEN`　だけ `~/.gitlab.env` に置き、それ以外は `.env.gitlab` に置いてリポジトリにコミットしています。

設定ファイルをなるべくリポジトリにコミットしておくことで、`gitlab_mr_release create` を叩くことで誰が実行しても同じリリースMRが作られるようにしています。 

## gitlab_mr_releaseを導入したメリット
普段の開発でもMRのタイトルを分かりやすくするという動きができました。

普通にPRやMRを作るとデフォルトのタイトルがブランチ名から補完されますが、これだと後から見た時に分かりづらいです。

`gitlab_mr_release` を導入することで「MRのタイトルは後からリリースMR作った時のリリースノートになるので後から読んだ時に分かりやすいタイトルにして！」と言う理由もできました :sweat_smile: