GitLabでの標準的な設定

GitLabで資産管理を行う場合に、一般的に設定を行う項目・機能について整理する。  
尚、本資料はFree版で可能な設定・機能のみとする。

## アカウント管理

GitLabのアカウントはユーザ毎に権限設定を行う必要がある。  
通常、GitLab全体のユーザ管理では以下の2種類の権限を設定する。

- 管理者(Administrator)：GitLab管理者
- 標準(Regular)：GitLab管理者以外の全ユーザ

次にグループやプロジェクトに対するアクセス権限をユーザ毎に設定する必要がある。  
通常、以下の3種類の権限を設定する。

- Maintainer：マージリクエストの承認者・レビュー者
- Developer：開発担当者
- Reporter：参照のみの担当者(PMOメンバ等)

尚、プロジェクト毎に設定を行うのは面倒なため、チーム毎にグループを作成し、そのグループ配下でプロジェクトを管理する。  
権限設定はプロジェクトではなくグループに対して行い、プロジェクト追加時やメンバの追加・削除時にプロジェクト数分設定を行う必要がなくなる。

## GitLab全体設定

Self-ManagedのGitLabの場合にはインスタンス全体に対して以下の設定が可能。  
ここで設定した内容は全グループ・プロジェクトに適用される。尚、適用された内容をグループとプロジェクトで別設定をした場合は`プロジェクト ＞ サブグループ ＞ グループ ＞ GitLab全体`の順で上書きされる。

### デフォルトブランチ(GitLab全体)

GitLab全体のデフォルトブランチの設定とそのブランチに対する保護設定をすることが可能。  
プロジェクト追加時にはこの設定が反映される。

![gitlab-defaultbranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/4019c612-b2dc-48d9-437e-c0d506070559.png)

### 外部連携(GitLab全体)

Teams、Slack等のツール連携を設定することが可能。  
下記例はTeamsへのGitLabイベントの通知を行っている設定。  
何をトリガーとするか設定も可能。

![gitlab-integration01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/0c3aa422-311d-b47d-f3ea-5874b7d3f61f.png)

![gitlab-integration02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/a81095cb-fd47-425e-a1d9-468838f7332d.png)

### GitLab Runner(GitLab全体)

GitLab CI/CDを使用する場合にパイプラインを実行するRunnerを設定する必要がある。

## グループ設定

グループに設定した内容はその配下の全てのサブグループとプロジェクトに適用される。尚、適用された内容をサブグループとプロジェクトで別設定をした場合は`サブグループ・プロジェクト ＞ グループ`の順で上書きされる。

### デフォルトブランチ(グループ)

GitLab全体の設定内容と同じ。

![group-defaultbranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/b763410c-65c3-b077-6064-13553b62a6d8.png)

### プロテクトタグ(グループ)

プロテクトタグの設定とそのタグを作成可能な権限を設定することが可能。  
正規表現で指定することができる。

![group-protecttag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/4e604fb2-edbf-359e-9edc-1ba9ca88b554.png)

### 外部連携(グループ)

GitLab全体の設定内容と同じ。

![group-integration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/a0c962d4-285d-79db-6585-8fe89a5f4035.png)

### マイルストーン(グループ)

issueとマージリクエストを紐づけて管理することができる。  
例えば、Ver1.0.0対応という開発イベントをマイルストーンとして定義し、その対応となるisseuとマージリクエストをマイルストーンに紐づけることで、Ver1.0.0として対応中・対応完了したissueとマージリクエストを確認することが可能。

マイルストーンを以下のように設定。

![group-milestone01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/d0538816-38f5-c59e-b7f5-df61d0707ed4.png)

マイルストーンに関連するissueとマージリクエストの状態を確認可能。

![group-milestone02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/cd2338dd-2e9d-3ebb-b841-f152e1b8a84c.png)

### ラベル(グループ)

issueやマージリクエストの入力項目をカスタマイズすることはできないが、ラベルをissueやマージリクエストに設定することで代替することが可能となる。  
例えば、優先度やステータスといったプロジェクトとして管理したい項目をラベルとして定義し、issueやマージリクエストに設定する。

ラベルを以下のように定義。

![group-label01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/efaabd39-3db3-2fe5-fb68-fe728860bd9e.png)

issueにラベルを設定すると以下のように見える。ラベル名を選択してフィルタすることも可能。

![group-label02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/96ca0431-5f86-4339-33e3-911df38f2287.png)

## プロジェクト設定

プロジェクトで個別に設定したものが最終的な設定となるが、何も個別に設定しない場合には上位のグループやGitLab全体の設定が適用される。

### デフォルトブランチ(プロジェクト)

GitLab全体の設定内容と同じ。

![project-defaultbranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/35c18ff1-59ed-3355-a4af-0b09b9699b8c.png)

### プロテクトブランチ(プロジェクト)

プロテクトブランチの設定とそのブランチに対してマージ、直接プッシュが可能な権限を設定することが可能。  
一般的にはプロテクトブランチは必ずマージリクエストでのみ更新を許可し、その権限は`Maintainers`と設定する。  
また、強制プッシュを許可するかどうかも設定できるが、これは基本オフとする。
対象となるブランチは正規表現で指定することができる。

![project-protectbranch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/858e0558-fb5f-e4ac-c35e-42b5dfdd04fd.png)

### プロテクトタグ(プロジェクト)

グループの設定内容と同じ。

![project-protecttag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/80b5a665-9bd3-862a-969f-91cee63a41b2.png)

### 外部連携(プロジェクト)

GitLab全体の設定内容と同じ。

![project-integration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/228aa82f-3205-dddb-56ee-70e1437a3e55.png)

### マージリクエストチェック(プロジェクト)

マージリクエストでのチェックルールを設定することが可能。  
パイプラインがある場合にはそのパイプラインが成功しなければマージできないようにする設定が可能。(パイプラインがない場合には本設定は無効化しておく)  
また、マージリクエストでレビューアが記入したコメント(スレッド)を全て解決済みにしないとマージができないようにする設定も可能。  
基本的には両方とも設定を有効にする。

![project-mrcheck.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/a121e174-eb88-95e8-63a8-b332213533bf.png)

尚、Premium/Ulitimate版の場合にはマージリクエストの承認・マージ可能なユーザをユーザ個別で指定したり、何人以上承認しないとマージできないといった設定が可能となる。

### マイルストーン(プロジェクト)

グループの設定内容と同じ。

![project-milestone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/ef1d8b94-732f-2766-1348-f769d351c57b.png)

### ラベル(プロジェクト)

グループの設定内容と同じ。

![project-label.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/8dd32ae1-b2ea-14b3-619b-0eaec47439ab.png)

### テンプレート(プロジェクト)

以下の通りプロジェクト直下に`.gitlab`というディレクトリを作成し、その配下にマークダウンファイルを格納することでissueとマージリクエストのテンプレートとして使用可能となる。

プロジェクトとして何をissueやマージリクエストに記載するべきなのか整理し、それをテンプレート化する。

- issue_templates配下：isseuのテンプレート
- merge_request_templates配下：マージリクエストのテンプレート

```bash
.gitlab/
  ├─issue_templates/　　　　　　 ※issueのテンプレート
  │      1_task.md
  │      2_add_feature.md
  │      3_change_require.md
  │      4_bug.md
  │      5_request.md
  │      6_qa.md
  │      7_etc.md
  │
  └─merge_request_templates/　　 ※マージリクエストのテンプレート
          merge_request.md
```

issue起票・編集時にテンプレートとして登録したものを選択可能となる。

![project-issue-template01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/53832b1b-1178-14cf-95b8-e9cab4a5133b.png)

選択するとテンプレートの内容が反映されるため、後は適宜issueを更新する。

![project-issue-template02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/ce4d3234-6a38-d2e2-725d-62c3de02b21d.png)

マージリクエスト起票・編集時にテンプレートとして登録したものを選択可能となる

![project-mr-template01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/37242041-8a77-cfda-f574-4852d4658379.png)

選択するとテンプレートの内容が反映されるため、後は適宜マージリクエストを更新する

![project-mr-template02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/575313/5567c14d-a794-9693-84d1-bab0e6eeea93.png)