アジャイル x クラウドことはじめ: IBM CloudでGitLabを使う

# はじめに
アプリケーション開発の案件をアジャイル開発で進めるにあたり、ツールなどの選定はその後のチーム開発の進め方に大きく影響する重要な要素かと思います。今回アジャイル開発のプロジェクトでIBM CloudのGitLabを使用し開発を進めたので、その使い方を紹介します。

# 前提
IBM Cloudを使いますので、以下の作業が完了していることを前提とします。

- IBM Cloudのライト・アカウント登録

# GitLabとは?
gitリポジトリとしてよく使われているのはGitHubかと思いますが、GitLabはGithub同様gitベースのソースコード管理やIssue管理などの機能を備えたOSSです。自前のサーバー上に構築することができるほか、GitLab.comという有償のサービス版もあります。
詳しく知りたい場合は、以下の記事が参考になります。

- [GitLabって何?](https://qiita.com/masakura/items/29f8949379fa86dac22c)

# IBM CloudのGitLabサービス
GitLabはIBM Cloud上にもサービスとして提供されており、IBM Cloudアカウントがあれば誰でも利用することができます。GitLabはいくつかのリージョンで提供されていて、記事執筆時点では[東京](https://jp-tok.git.cloud.ibm.com/)、[フランクフルト](https://eu-de.git.cloud.ibm.com/)、[ロンドン](https://eu-gb.git.cloud.ibm.com/)、[ダラス](https://us-south.git.cloud.ibm.com/)、[ワシントンDC](https://us-east.git.cloud.ibm.com/)リージョンがあるようです。また別途書きたいと思いますが、これらのリージョンはtoolchainなどCI/CD系のサービスと併せて使うことができ、デプロイする先（Cloud FoundryやKubernetesのコンテナ等）をどのリージョンにおくかに併せるのが良いかと思います。

# そもそもなぜIBM CloudのGitLabを選んだのか？
このプロジェクトは、当初アジャイル開発のチームを立ち上げたばかりで、開発チームも含めこれからどのように進めようか、というノウハウが溜まってない状態からのスタートでした。また、アプリケーションの実行基盤として、IBM Cloudを使うということがすでに決まっていました。そのため、選択基準となったのは以下のようなポイントでした。

**1. 無料で使えること**
**2. アプリケーションのコード管理とアジャイル開発のスプリント、バックログ管理を一つのツールで行えること**
**3. IBM Cloudを使う前提で他のサービスと連携がしやすいこと**

アジャイル開発をするならばJIRAなどのリッチなツールや、Trelloなど無料で使えるボードツールもありますが、IBM Cloud上のGitLabでこの3点を満たすことができ、IBM Cloudのライト・アカウント1つで無料かつクイックに開発を始めることができます。

# IBM Cloud GitLabを使った開発の進め方例
実際の使い方を流れに沿って紹介します。

## 準備
チームで利用するためのグループを作成し、チームメンバーを招待します。

#### グループの作成
メニューバーの「＋」ボタンをクリックし、「New group」を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/c56ff515-7435-822d-3998-4f0ce80f93aa.png)
グループ名を入力し「Create group」をクリックする。（デフォルトではグループ名がURLになる）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/ba162298-17a2-8a06-335a-d38a9fbe7861.png)
以下のように、グループが作成される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/ef56d53d-b355-3fa3-32fa-808f6615e880.png)

#### メンバーの追加
グループページ > Membersで、メンバーを検索し追加する。

- IBMCloudにアカウントを持つユーザーは、ユーザー名で検索するとリストに表示される。
- IBMCloudにアカウントを持たないユーザーについてもInviteが可能（Invite後、IBMCloudのアカウントを作成する必要あり。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/a4801431-db1d-87bb-a167-222c78018999.png)

※ユーザーロールの種類と可能なアクションについては以下を参照。
[GitLab Docs - Permissions](https://docs.gitlab.com/ee/user/permissions.html)


## アジャイル開発における各種機能の使い方
アジャイル開発における各種成果物をGitLabでどのように管理するかについては、以下の記事で機能のマッピング表と共に丁寧にまとめられています。今回のプロジェクトでも、こちらを参考に各種機能を使っていきました。
[アジャイル開発におけるGitLabの使い方](https://licensecounter.jp/devops-hub/blog/sbcskato8/)

なお、Board, Label, Milestoneといった機能は、Groupにも、各Projectにも存在します。多くの場合、Group内に機能単位、アプリ単位でProjectを作っていくことになりますが、**各Projectで作成したIssueはGroupのボードで一括管理することが可能**です。以降、そのような手順で進めています。

#### プロジェクトの作成
グループページから「New Project」でプロジェクトを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/dd6070ab-16b4-2de3-e83c-10001cc466b1.png)

プロジェクト名を指定し、「Create project」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/7af3ef67-ec6c-816f-969d-550b21063c3d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/6dc975c0-80ad-15ff-01d0-13b90e804695.png)

#### Label作成
Issueでストーリーを管理するために以下のようなラベルをグループラベルとして作成しておく

- Story, Task: ストーリー、タスク（ストーリーをさらに細かいレベルに分けたもの）起票用タグ
- TODO, Doing等のステータス管理用タグ
- 機能毎、要素毎のタグ: Issueの見やすさのために必要に応じて作成する

ステータス管理用のタグは、グループのIssue > Boardを開き、「Add default list」でデフォルトのものを作成できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/f79f1481-558c-ca3c-b209-c6a269a6eda9.png)

その他のタグについては、グループのIssue > Labelsから作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/228051a5-fd47-e20f-a25c-82c19ac63bb5.png)

当プロジェクトでは、ステータス管理としてInternalReview, Review, Completeといったラベルを設けたため、必要なラベルを定義後はこのようになった。（別途、機能別のタグを都度用意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/28568d8a-8c3e-415e-6922-27f0b11744b5.png)

#### Board作成（アジャイルボード）
グループのIssues > Boardを開く（先ほどBoardからAdd Default listした場合は、すでにTODO, Doingがボード上に見えている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/836ff84c-8983-c84f-909f-ef0c133afa7c.png)

ボードに表示したい別のステータスがあれば追加する。このプロジェクトの場合は、Doingの後、内部レビュー(InternalReview)、お客様によるレビュー(Review)、レビュー完了(Complete)を経てクローズするというルールにしていたため、ボードにこれらを表示させるように変更。
上部の「Add list」から、対応するラベルを選択することで追加可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/2d8f2777-4b53-8a8b-7c6d-78a7c9488f22.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/9a329c3e-189d-f8a3-514d-886f398f0d3e.png)

#### Milestone追加（スプリントの管理）
グループのIssues > Milestonesを開き、「New Milestones」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/b826e36b-bb14-b3d7-8ee1-37251e174474.png)

スプリント期間を設定し「Create Milestone」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/888e4db9-6359-54f0-6be8-84d16fb8bd5d.png)

同様に、各スプリントの期間をMilestoneとしていれていくと、以下のようになる。後続のSprintについては「Upcoming」と表示される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/158ee325-1e0f-ea81-fbe8-bea7af0b4a4c.png)

#### Issueの起票（ストーリーの起票）
Issueは、Group内の各Project毎に起票する。Groupnページから起票する場合は、Issues > Listを開き、「Select project to create issue」でIssueを起票するプロジェクトを選択する。（以下の場合は、testprojを選択）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/008977dc-4824-d4f4-cb5d-8635bbd30fe8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/d1bc7908-373f-0958-62a7-2777efca3a33.png)

Title, Assignee, Milestone, Labels等を設定し、「Submit Issue」でストーリーを起票する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/de532c67-33e8-f39a-0a24-861fa831665c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/0cc5d5e6-5e87-6b54-572b-c2a5dd53403a.png)

ストーリー内にいくつかのタスクがある場合、Descriptionにタスクを記載することで管理できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/457f63dd-8c2d-e71b-b2bd-5a54854627d7.png)
タスクをチェックすると、全体に対して何件完了したか表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/528751fb-2f20-c6aa-4215-64d2a98914c1.png)

他のIssueとの紐付けも可能。同じプロジェクト内のタスクであれば、"#[IssueNo]"のように記載すればリンクされる。同じグループ内の別のプロジェクト内のIssueも"[Project名]#[IssueNo]"と記載するとリンクされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/541e7694-e1ea-bdf7-277d-c66156ca5215.png)

※ コードとの紐付けも、同じようにコミット時に"#[IssueNo]"を記載すればIssueにリンクされる。

#### Estimate/Spendの追加（見積/実績値の設定）
ストーリー毎に見積や実績値を設定したい場合はEstimate/Spendコマンドで設定が可能。ただし、単位はhour, dateなどの実時間となり、筆者が調べた限りでは相対値で設定する方法はない。

Issueのコメント欄に"/"を入力すると、利用可能なコマンドが表示される。見積もり設定は/estimateを使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/0f80e848-362d-aaff-b1f4-36c99683fda4.png)

以下のように、/estimate 6hと設定し、「Comment」をクリックして入力すると見積もり値として登録され、右側の「Timetracking」に表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/515814b4-bafe-7081-2a79-f5d2daf2654e.png)

ストーリーが完了したら、実績値は/spendを使用して入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/5a346bc2-8451-8698-1d1e-1f8f7d1f47bd.png)

実績値を入力すると、右側のTime trackingに反映され見積値と比較した結果が表示される。（この例の場合は実績値が見積に対してオーバーしているので赤で表示）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/0d3178e9-f65c-346e-5145-be29006fa1a7.png)

#### 運用イメージ
Group > Issue > Boardを開くと、複数のProjectの下にあるIssueが一括で管理できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/66d4cee7-fe8c-0d5e-52a4-8d99918a268a.png)

Group >Issue > Milestonesでスプリントの進捗状況を見ることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/674cf00f-f6c4-508b-5d1a-9c31e2c38085.png)

スプリントのMilestoneを開くと、Open/CloseのIssueがどれかわかるようになっている。見積もりに対して実績値がどれくらいかもみれる（ただし、合計値）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/173887/26f27209-5b53-70aa-4cb8-f439b0f85457.png)



## IBMCloudのGitLabで現状できないこと
上記の通り、アジャイル開発で使いたい基本的な機能は揃っていますが、いくつか、できないことも存在します。記事執筆時点で、以下ができない状態です。

- バーンダウンチャートを表示する
GitLabの一般向けサービス版では、プランによってはバーンダウンチャートを出すことができますが、IBM CloudのGitLabにはありませんでした。（見積/実績値を抜き出して都度グラフを手動で作ることは大変手間がかかるため、このプロジェクトではバーンダウンチャートは出していませんでした。）
https://docs.gitlab.com/ee/user/project/milestones/burndown_charts.html

- Epicを作成する
ユーザーストーリーをより抽象化して表現したエピックを管理したい場合、GitLabにはEpicというそのものの機能があるのですが、これもIBM CloudのGitLabにはありません。（エピックを扱いたい場合は、代替として、Epicというラベルを用意してStoryとは別のIssueとして起票しリンクさせて管理する、といった方法が考えられます。）
https://docs.gitlab.com/ee/user/group/epics/