Redmine で Agile プラグイン( Light 版)を使う

[RedmineUP](https://www.redmineup.com/) が提供する Redmine プラグインを試しつつ、具体的にどう使ったら良いのか考えてみました。

![board.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81857/8f3d3ed9-a485-fdfc-b327-341355b7bd15.png)

![charts.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81857/7d1920a9-ac8c-1a88-cf12-d31129c573e1.png)


# Redmine を用意する

下記の Docker イメージを使い、お手軽に docker-compose で立ち上げてみます。

>
redmine - Docker Hub
https://hub.docker.com/_/redmine

上記ページの "Example stack.yml" を参考に
下記の docker-compose.yml を作成しました。

```yml
version: '3.1'

services:

  redmine:
    image: redmine
    restart: always
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: example
      REDMINE_SECRET_KEY_BASE: supersecretkey
    volumes:
      - ./:/mnt/host

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
```
"Example stack.yml" からの変更点は２つです。

1. 後にプラグインのインストールで使うため docker-compose.yml の親ディレクトリを /mnt/host としてマウント(共有)している
2. redmine で日本語が使えるよう db に文字コードの設定をしている

docker-compose.yml の親ディレクトリで docker-compose up すると `http://localhost:8080` に Redmine が起動します。

※あくまでお試し環境として永続化の設定はしていませんので docker-compose down などすると db のデータもろとも削除されます。

# Agile プラグイン( Light 版)をインストールする
プラグインを入手するには RedmineUP へメールアドレスを登録してダウンロードリンクを送ってもらう必要があります。ダウンロード後は次の３ステップでインストールが完了します。

1. ダウンロードした .zip ファイルを docker-compose.yml の親ディレクトリに置く
2. redmine コンテナ上で後述のコマンドを実行する
3. redmine コンテナ を再起動する

ステップ２のコマンドはこちらです。

```
apt update &&
apt install -y unzip &&
cp /mnt/host/redmine_agile-1_5_3-light.zip plugins/ &&
cd plugins &&
unzip redmine_agile-1_5_3-light.zip &&
cd .. &&
bundle install --without development test --no-deployment &&
bundle exec rake redmine:plugins NAME=redmine_agile RAILS_ENV=production
```

公式サイトにある下記の手順を参考にしています。

>
Installing Redmine plugins on Linux | RedmineUP Help & Support | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/installing-redmine-agile-plugin-on-linux

# Redmine およびプラグインを設定する

Redmine の管理メニューから次の項目を設定します

## ロールと権限
Agile プラグインに関する権限は下記の４つがありますが、インストール直後は管理者ロールにしか許可されていません。管理者以外のロールにも適宜許可してください。1と2は Light 版には無関係に見えますが。

1. Manage public agile boards
2. Add agile boards
3. View agile boards
4. View agile charts 

## チケットのステータス
Redmine のデフォルト設定においてチケットのステータスは下記の６種類があります

|English    |日本語
|-----------|---
|New        |新規
|In Progress|進行中
|Resolved   |解決
|Feedback   |フィードバック(差し戻し)
|Closed     |終了
|Rejected   |却下

Agile プラグインのカンバンを用いてスプリント(イテレーション)を回すなら、下記のように２つのステータスを追加すると良さそうです。ステータスは追加するだけでなくワークフローを適宜設定しないと使用できないのでご注意ください。ステータスの並びはカンバンにも反映されるのでそのつもりで並び替えておきましょう。

|English    |日本語
|-----------|---
|New        |新規
|***ToDo*** |
|In Progress|進行中
|Resolved   |解決
|Feedback   |フィードバック(差し戻し)
|***Done*** |
|Closed     |終了
|Rejected   |却下

トラッカー、チケットのステータス、ワークフローの設定はスプリントを回しながらチームに最適化させるのが良いのでしょうね。

## Agile( プラグイン -> Redmine Agile plugin )
管理メニュー直下に項目が追加されますがプラグイン一覧からも同じ設定画面を開くことができます。

主な設定を紹介します。

### Story points
指定したトラッカーに対してカスタムフィールドのようにストーリーポイントを付与できます。
トラッカーは複数選択できます。

### Exclude weekends from ideal effort
バーンダウンチャートの理想線を求める際に土日休みを考慮するか設定できます。

### Auto assign on move
カンバン上でチケットをドラッグ＆ドロップした人がそのチケットの担当者に自動的に設定される機能があります。

# Agile 機能を使う

## 方針・前提
* マイルストーンの達成は重要だがスプリント個別の進捗目標の達成・未達で一喜一憂しない
* マイルストーンはバーンダウンチャートで、スプリントはカンバンで進捗を管理する
    * 「管理とは良いか悪いか判断することである」と大学の講義で習いました

## プロジェクトを作成する

プロジェクトを作成しチケットの親子関係を使用してWBSを作成します。
プロジェクト毎のモジュールの有効無効の設定で Agile を有効化するとカンバンなどの機能が使えるようになります。

##### 親子関係の例
タスク管理と要件管理を一体化させるのが好ましそうです。

|親|子
|---|---
|パッケージ|ユースケース
|エピック|ユーザーストーリー

## マイルストーンを作成する
対外的なマイルストーン毎にバージョンを作成し、チケットをバージョンに割り当てます。
**Agile プラグインがバージョン毎にバーンダウンチャートを生成してくれます。**
バーンダウンチャートの縦軸の単位は下記から選択できます。

* チケット数(デフォルト)
* ストーリーポイント
* 作業時間

マイルストーンに対して期日を設定し、チケットに対して期日を設定することはなるべく避けます。

## バックログを作成する
プロジェクトの Agile タブを開くとカンバンを開くことができます。
バージョン(=マイルストーン)を参考にチケットを優先度順に並び替えてバックログとします。

* はじめは全てのチケットのステータスが New のはずなので、優先度の高いチケットから順に ToDo へ移動させます。
* New から ToDo へ移動させるにあたり、ストーリーポイントが振れる程度には実施内容を検討すると良さそうです。
* マイルストーンがまだ先のチケットは New に置いたままでも構いませんが、最低でも１スプリント分のチケットは ToDo へ移動させます。
* 並び順は定期的に見直すべきらしいです。

**この優先度順に並び替えられるというのが Agile プラグインの強みです。**プラグインがなくてもチケットに対して優先度や期日を設定できますが、同じ優先度や期日のチケットがあると都度判断しなければなりません。

## スプリントを計画する
バックログ上で仕切りの役割を果たすダミーのチケットを作成して ToDo に置きます。

* 最上位のチケットから仕切りまでのチケットがスプリントで消化したいチケットの範囲になります。
* ダミーでなく「スプリントNリリース」のような実作業のチケットを仕切りとして運用しても良さそうです。
* 複数の仕切りを置けば先々のスプリントまで計画できますし、仕切りをドラッグ＆ドロップで動かすだけでリスケができます。
* スプリントディバイダーとかゴールバーとかチケットセパレータとか名付けられそうです。
* 仕切りを２つ設けてストレッチゴールを設定するテクニックも使えます。
    * [スクラムの知られざる勘所](https://www.slideshare.net/YoshifumiTsuda/ss-31198424)

スプリントを Redmine のバージョンで表すと言う人もいますが、そうするとバックログから優先度順にスプリントへ切り出して消化する流れを作りにくくありませんか？

ここで提案している使用法の場合、計画においてはまだ先のマイルストーンに属するチケットをフィルターで隠すためにバージョンを使います。バーンダウンチャートも１〜２週間のスプリントよりもっと長いスパンの傾向を見るために使いたいです。スプリントが１ヶ月などと長めの場合や、１〜２週間で本当にチームの外へリリースを行う場合はスプリントを Redmine のバージョンで表すのも良く思えます。

なお Light 版ではフィルターを保存できないのでWikiのリンク、ブックマーク、ブックマークレットでフィルターを保存・共有しましょう。

## スプリントを実行する
チケットの進捗に合わせて ToDo の枠から Done の枠までカンバン上でチケットを動かしていきます。

滞留しているチケットがあれば何が終わっていて何が終わっていないのか明確にさせると良さそうです。カンバンのオプションで In status にチェックを入れると何日滞留しているか表示してくれます。また同じく RedmineUP の CheckLists プラグインを使うと子チケットまで作らずとも手軽にチケットをブレイクダウンでき、カンバン上でも表示できます。

チケットを ToDo から進行中へ動かすのを担当者に任せるプル型のチームとするのが良さそうです↓

> こんなスクラムには気をつけろ!? – Ryuzee.com
> https://www.ryuzee.com/contents/blog/7073
> 
> 「スクラムマスターがタスクをアサインする」
> 「スクラムマスターが忙しすぎる」

* チケットの割り振りで時間使っちゃいますもんね。。。
* バックログを優先度順に保つことへのプレッシャーになる
* メンバーの自律を促せそう
* チケットを動かすと担当者が切り替わるプラグインの機能を活かせる

## スプリントを振り返る
Done の枠にあるチケットの量(=生産性、出来高)などを参考に振り返りを行ったら Done の枠にあるチケットのステータスを Closed にします。次のスプリントを計画してから Closed にしても良さそうです。消化できたチケットの実績と照らし合わせながら次はどこまで消化できるか計画できますね。

# Pro 版の固有機能

## Agile backlog モジュール(Version planning)
バージョンとは別にスプリントでチケットをグループ化できるようになります。バージョンにもスプリントにもドラッグ＆ドロップでスプリントに割り当てられるようになります。バージョンとスプリントは独立しており、システム上の親子関係などはありません。スプリントに未割り当てのチケット群がバックログとなり、バックログ内でもスプリント内でも優先度順にドラッグ＆ドロップでソートできます。**でもせっかくバックログ内でソートしたのに１つ１つドラッグ＆ドロップでスプリントに移していくの面倒じゃないですか？**

Pro 版ではカンバンがスプリントで必ずフィルターされるようになるようで、スプリントに未割り当ての(=バックログの)チケットはカンバンに表示されません。仕切りチケットを使う緩めの運用はできなくなります。

## チャートの種類が増える
下記のようなチャートが使えます。

* バーンアップチャートが使える
* チケットのトラッカーやステータスで層別できる
* ベロシティやリードタイムのスコアをグラフ化できる

Light 版でこのようなグラフが見たい場合は Metabase などで頑張りましょう。

>
Agile Charts | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/agile-charts

## カンバンのフルスクリーン表示
カンバンを大きく表示できます。
サイドバーを隠せるように設定してあれば Light 版でも大きく表示できます。

>
Fullscreen mode | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/fullscreen-mode

## カンバン上でのチケット編集

通常のチケット一覧と同様にカンバン上のチケットを右クリックすると編集メニューが現れます。
カンバン上でチケットの追加もできますが、タイトルしか入力はできません。そして Agile backlog モジュールによるスプリントフィルターが働いてしまうので追加したチケットは即非表示になってしまいます。。。

>
On board editing | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/on-board-editing

## カンバンの保存
チケット一覧でクエリを保存する要領で、カンバンで設定したフィルターを保存できます。

>
Saving boards | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/saving-boards

## カンバン上でステータスを階層化する

ステータスの名前を `親状態: 子状態` のようにするとカンバン上では階層表示されます。

>
Subcolumns | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/subcolumns

## カンバンを上下に分割する
チケット一覧でのオプションのグループ条件に近い機能です。
下記のいずれかの要素でカンバンを分割表示できます。
これは使いたくなりそう。

* プロジェクト
* トラッカー
* 優先度
* 作成者
* カテゴリ
* 対象バージョン
* 親チケット
* 担当者

>
Swimlanes | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/swimlanes

## 各ステータスに存在するチケットの数に上限を設ける
進行中の(着手したけど完了していない)チケットが増加するのは不健全な状態として、システムとして制限することができます。

>
Work in progress limits | RedmineUP Help | Agile plugin documentation
https://www.redmineup.com/pages/help/agile/work-in-progress

## チケットの色分け
トラッカーなどで色分けができます。

## Pro 版まとめ
スプリントのあり方がシステムとして固定されてしまうのでそれが気にいるなら Pro 版が良さそうです。それが気に入らず、カンバンの上下分割やチケットの色分けといったちょっと気の利いた機能は欲しいけど運用は自分で工夫したい場合は Light 版で充分に幸せかもしれません。