GitLab運用方法と設定手順について

社内では去年までSVNで管理しておりGitを利用するには外のサービスを利用していました。
これじゃダメだと思い今年の春頃からGitLabを導入して運用しています。
導入する際のあれこれの決め事が面倒だったりトライアンドエラーを繰り返して何とか問題なく運用できるところまで来ました。
GitLabをこれから導入する人に役に立てばと思います。

# **はじめに**

## やりたいこと

- システム管理者の負荷を軽減するため、リポジトリ作成はシステム管理者ではなくPJ案件管理者(PM)に作成してもらいたい。
- リポジトリの削除は基本禁止。
- GitHubフローで管理したい。

## Groupについて
GitLabにはリポジトリをグルーピングすることができます。
グループを案件(PJ)単位で作成し、案件で開発する・保守するシステムをリポジトリで管理します。

## 権限について
上記のやりたいことを満たすため、下記のように権限を付与します。

| 担当者         | Group権限 | Group配下のリポジトリ(Project)権限 |
|:--------------|:--------:|:----------:|
| システム管理者   | Owner    | Group権限引継 (Owner)|
| PJ案件管理者(PM)| Master   | Group権限引継 (Master)|
| 開発リーダー・コードレビュア| 所属しない | Master |
| 開発者(PG) | 所属しない | Developer |




## メンバー登録運用フローについて
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/cc4fc1aa-73e9-26cc-d913-2aebb6f3a4b2.png)

権限の詳細についてはこちらを参照すると良いと思います。
http://qiita.com/mats116/items/f11e2e25731c325eeda8


## GitHubフローについて
下記のように運用しています。

| ブランチ         | プロテクト有無 | ブランチ作成元 | 概要 |
|:--------------|:--------:|:----------:|:----------|
| master   | あり    | - | 常に本番環境・UAT環境にリリースできる状態 |
| develop| あり   | master | 常に社内共通テスト環境にリリースできる状態 | 
| 作業ブランチ| なし | develop | 開発用ブランチ |


**masterブランチ**

- 常に本番環境・UAT環境にリリースできる状態。
- developブランチからマージする際にはMaster権限のユーザがWeb上でマージリクエストを行い自身でAcceptもしくは別のMaster権限持っているユーザにAcceptしてもらう。
- 本番リリース時にはいつリリースしたものかを記すためmasterブランチにタグを付ける。

**developブランチ**

- 常に社内共通テスト環境にリリースできる状態。
- リポジトリ作成時にmasterブランチと同時に作成。
- 作業ブランチからdevelopブランチにマージする際はWeb上でマージリクエストを行う。
- AcceptするMaster権限持っているユーザは必ずレビューしてからAcceptを行う。

**作業ブランチ**

- 開発用ブランチ。
- 開発するためのブランチで開発者が自らdevelopからブランチを作成する。
- developブランチにマージする際はWeb上でマージリクエストを行う。

GitHubフローの詳細についてはこちらを参照すると良いと思います。
http://qiita.com/tbpgr/items/4ff76ef35c4ff0ec8314

## 各担当者ができること（最終形）

上記の内容から各担当者ができることを表にまとめてみた。

| タスク  | システム管理者 | PJ管理者 | 開発リーダー | 開発者 |備考|
|:-------|:--------:|:----------:|:---------:|:-------:|:-------|
| ユーザーの作成（GitLab）  |○ |× |× |× ||
| ユーザーの削除（GitLab）  |○ |× |× |× ||
| グループの作成  |○ |× |× |× ||
| グループの編集  |○ |○ |× |× ||
| グループの削除  |○ |× |× |× ||
| 所属グループへユーザーの権限付与＆追加  |○ |△ |× |× |*システム管理者がPJ管理者をグループにMasterとして追加。その後、PJ管理者も所属グループへユーザーの権限付与＆追加可能となるが、運用ではPJ管理者交代の際を除いて基本禁止している。*|
| 所属グループからユーザーの削除  |○ |△ |× |× |*システム管理者がPJ管理者をグループにMasterとして追加。その後、PJ管理者も所属グループへユーザーの削除可能となるが、運用ではPJ管理者交代の際を除いて基本禁止している。*|
| 所属グループ内のリポジトリの作成  |○ |○ |× |× ||
| 所属グループ内のリポジトリへユーザーの権限付与＆追加 |○ |○ |○ |× |*PJ管理者が開発リーダーをMasterとして追加。その後、開発リーダーもユーザーの権限付与＆追加が可能となる。*|
| 所属リポジトリからユーザー削除  |○ |○ |○ |× ||
| 所属リポジトリの編集  |○ |○ |○ |× ||
| 所属リポジトリの削除  |○ |× |× |× ||
| プロテクトブランチ(master/develop)へのマージ  |○ |○ |○ |× ||



# **具体的な作業手順**

## **■システム管理者がやること**
### **(1) ユーザ作成**
ユーザ作成手順は特に注意することもないので割愛します。

### **(2) Group作成**
1. [Groups]を選択（左メニュー）
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/c6b0ff77-c8b9-082e-e788-6b608edd9d02.png)

2. [AdminArea]を選択（画面右上）
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/22a73640-7092-f7dd-1252-4d59fdb9187c.png)

3. [New Group]をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/11cc8243-a000-7d7e-f762-9bd3a6f5501e.png)

4. [Group path]にグループ名を入力
5. [Create group]をクリックしてGroupを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/fc9e2f47-09c2-dc23-c6a7-08a59a51159c.png)

### **(3) GroupにPJ案件管理者の追加**
1. [Add user(s) to the group]（画面右）の[Search for a user]でPJ案件管理者のユーザを選択
2. 権限は[Master]を選択
3. [Add users to group]をクリック

![image](https://qiita-image-store.s3.amazonaws.com/0/61752/415e95f3-7e36-a876-e635-b6a5ac5bc652.png)

## **■PJ案件管理者(PM)がやること**
### **(1) リポジトリ作成**
1. [Groups]を選択（左メニュー）
2. Project作成対象のGroupを選択する
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/43bc9805-1fb3-ed0f-a818-91a836061207.png)

3. Groupの[Projects]→[+New Project]をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/f83dffe6-e787-8352-822a-6fb924a234c5.png)

4. [Projects path]でグループを選択、プロジェクト名を入力する
5. [Visibility Level]は[private]を選択
6. [Create project]をクリックしProjectを作成する
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/0d7c5e5e-8853-d764-c413-381804931173.png)

### **(2) masterブランチ作成（README.mdの追加）**
1. Project作成後の画面で[adding README]のリンクをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/55b2384e-a858-a60c-5fc8-c080af981451.png)

2. 本文とCommit messageを記載して[Commit Changes]をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/f25f1317-4c25-6eb7-738f-524110e44b17.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/f199d8e3-68c2-84d5-fd8c-80c4caa957a5.png)

### **(3) developブランチの作成**
1. [Projects]を選択（左メニュー）
2. プロジェクト名をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/65fc9506-d11c-0f62-e20a-c9d06a52a398.png)

3. [*n* branch]のリンクをクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/fcff6172-459c-a75e-596e-083482afcbb6.png)

4. [+New branch]をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/2d7fdca0-f95c-d302-6af6-4e49b3b495d1.png)

5. [Branch name]は[develop]、[Create from]は[master]を選択
6. [Create branch]をクリックしブランチをブランチを作成
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/887f688f-823c-4c19-c2e4-f0b03c63122e.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/cc343e7b-40a8-a055-0393-6e37a9f605e6.png)

### **(4) デフォルトブランチの変更**
1. [Projects]を選択（左メニュー）
2. プロジェクト名をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/53bbb455-1a9b-70f9-da8c-1336d89f61ab.png)

3. [Settings]を選択（左メニューの一番下、縦幅が狭い場合スクロールが必要）
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/2863c656-89ec-bb52-3047-3cca061b37ac.png)

4. [Default Branch]で[develop]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/3295fbb2-a6b5-c166-ead6-8b90ceab3096.png)

5. [Save changes]をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/b2a745f8-0887-c1bf-da7b-59b60cd4fe9e.png)

### **(5) ブランチの保護**
1. [Projects]を選択（左メニュー）
2. プロジェクト名をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/1deb58fb-8084-bde1-0603-3e2847b87038.png)

3. [Settings]をクリック（左メニューの一番下、縦幅が狭い場合スクロールが必要）
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/bf0ee105-2811-b14b-ed9a-efeccb34e269.png)

4. [Protected branches]を選択（左メニュー）
5. [Branch]で[develop]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/fbdc6c56-8f04-ea26-d1f6-4173230b791a.png)

6. [Protect]をクリックし[develop]ブランチを保護する。これにより、権限が[Developer]のユーザはdevelopにpushできなくなる
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/ec098069-5807-ddf5-888d-62461c9d1f2f.png)

***※チェックボックスにチェックを入れるだけでDeveloper権限がプッシュできるように自動更新されるので注意！！***

### **(6) リポジトリへのメンバーの追加（その１）**
1. [Projects]を選択（左メニュー）
2. プロジェクト名をクリック
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/363d0e42-b63c-d99a-4705-9c39ea9e194d.png)

3. [Members]を選択（左メニュー）
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/0d8a3571-3dd4-82d6-d908-c7095742106f.png)

4. [People]で対象のメンバーおよび[Project Access]で権限を選択
5. [Add users to project]をクリックしメンバーを追加
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/ff30b3da-68a6-f679-8dff-11a702e6a977.png)

### **(7) リポジトリへのメンバーの追加（その２）**
Projectごとにメンバー追加をするのは面倒なので、1度Projectにメンバーを追加したらメンバーはimportするのが楽

1. メンバー追加の画面で右上の[import members]を選択
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/0d6a08de-80b1-3c22-0f61-f0714c884bfd.png)

2. [Project]でメンバーimport元のプロジェクトを選択
3. [Import project members]をクリックしメンバーをimport
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/2f95dfe3-30a7-8fc0-82e3-1aa585d3a761.png)
![image](https://qiita-image-store.s3.amazonaws.com/0/61752/1d1e156a-88ed-d508-118b-d21263599291.png)

### **(8)その他**
Slack連携やRedmine連携等のServiceもリポジトリ毎の設定になるので連携したい場合は設定してください。

# **さいごに**
上記は一例なので各企業や組織によって上手いことやってください。
では、素敵なGitLabライフを送ってください。
以上です。