なぜ書いた?
- 趣味で調べたことを職場で参照したい
- もしかすると参考になる人がいるかもしれない
- OpenProject と Metabase の可能性に震えたから
OpenProject の準備
OpenProjectは、場所に依存しないチームコラボレーションのためのWebベースのプロジェクト管理システムです。
まず OpenProject のインストール方法は下記の3つであると公式にあります。
docker(-compose) を使うのが手軽そうなのでこれでやってみます。
- DEB/RPM packages
- 既存のマシンなどへ直接インストール(推奨)
- docker
- docker-compose で起動
- Installation with Univention Corporate Server
- VMイメージを入手
Installing OpenProject | OpenProject Help & Documentation
https://docs.openproject.org/installation-and-operations/installation/
docker を使ったインストール方法は下記の2つであると公式にあります。
推奨されている前者の方法でやってみます。
- One container per process
- WebやDBなどの機能ごとにコンテナを分けます(推奨)
- All-in-one container
- 1つのコンテナで全ての機能を賄います
Install OpenProject with Docker | OpenProject Help & Documentation
https://docs.openproject.org/installation-and-operations/installation/docker/
とりあえずローカルで試運転する分には上記のページに従って下記のコマンドを打つだけで起動します(簡単!)。ですが Metabase と組み合わせたいので起動の前に docker-compose.yml
を編集します。
# docker-compose.yml などを取得する
git clone --depth=1 --branch=stable/10 https://github.com/opf/openproject
# docker-compose.yml のあるディレクトリへ移動する
cd openproject
# デタッチモードで起動
docker-compose up -d
docker-compose.yml
を読み解くと主な要素は下記のように配置されると分かります。
ここへ Metabase を追加してみます。
Metabase の準備
メタベースは、社内の誰もが質問したり、データから学んだりするための簡単でオープンソースな方法です。
Metabase を加えて下記の構成となるよう docker-compose.yml
を編集します。
そして出来上がった docker-compose.yml
がこちら。
docker-compose up -d
で起動させると http://localhost:8080/ に OpenProject が、 http://localhost:3000/ に Metabase が起動します。Metabase の起動が完了するまではしばらく待つかもしれません。
version: "3.7"
networks:
frontend:
backend:
metabase-backend:
volumes:
pgdata:
opdata:
metabase-pgdata:
x-op-restart-policy: &restart_policy
restart: unless-stopped
x-op-image: &image
image: openproject/community:${TAG:-10}
x-op-app: &app
<<: *image
<<: *restart_policy
environment:
- "RAILS_CACHE_STORE=memcache"
- "OPENPROJECT_CACHE__MEMCACHE__SERVER=cache:11211"
- "OPENPROJECT_RAILS__RELATIVE__URL__ROOT=${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"
- "DATABASE_URL=postgres://postgres:p4ssw0rd@db/openproject"
- "USE_PUMA=true"
# set to true to enable the email receiving feature. See ./docker/cron for more options
- "IMAP_ENABLED=false"
volumes:
- "opdata:/var/openproject/assets"
depends_on:
- db
- cache
x-mb-app: &mb-app
image: metabase/metabase
<<: *restart_policy
environment:
- "MB_DB_TYPE=postgres"
- "MB_DB_DBNAME=metabase"
- "MB_DB_PORT=5432"
- "MB_DB_USER=postgres"
- "MB_DB_PASS=p4ssw0rd"
- "MB_DB_HOST=metabase-db"
depends_on:
- db
- metabase-db
services:
db:
image: postgres:10
<<: *restart_policy
stop_grace_period: "3s"
volumes:
- "pgdata:/var/lib/postgresql/data"
environment:
- POSTGRES_PASSWORD=p4ssw0rd
- POSTGRES_DB=openproject
networks:
- backend
cache:
image: memcached
<<: *restart_policy
networks:
- backend
proxy:
<<: *image
<<: *restart_policy
command: "./docker/proxy"
ports:
- "8080:80"
environment:
- APP_HOST=web
- "OPENPROJECT_RAILS__RELATIVE__URL__ROOT=${OPENPROJECT_RAILS__RELATIVE__URL__ROOT:-}"
depends_on:
- web
networks:
- frontend
web:
<<: *app
command: "./docker/web"
networks:
- frontend
- backend
worker:
<<: *app
command: "./docker/worker"
networks:
- backend
cron:
<<: *app
command: "./docker/cron"
networks:
- backend
seeder:
<<: *app
command: "./docker/seeder"
restart: on-failure
networks:
- backend
metabase-app:
<<: *mb-app
ports:
- "3000:3000"
networks:
- backend
- metabase-backend
metabase-db:
image: postgres:10
<<: *restart_policy
stop_grace_period: "3s"
volumes:
- "metabase-pgdata:/var/lib/postgresql/data"
environment:
- POSTGRES_PASSWORD=p4ssw0rd
- POSTGRES_DB=metabase
networks:
- metabase-backend
Metabase が起動したら初期設定時に OpenProject の DB を登録してしまいましょう。
「名前」は任意、「データベースユーザー名」と「ポート」は postgres のデフォルトですが、「ホスト」から「データベースパスワード」のその他の項目は docker-compose.yml
の db サービスの設定から読み取れる内容で埋めます。
OpenProject の DB スキーマを紐解く
※ まだあまり紐解けていないので随時更新予定
OpenProject の Work packages(Redmine におけるチケットに相当する概念) を格納しているテーブルは、Metabase からは Work Packages という名前で見えるようになります(生のSQLで参照する場合は work_packages)。このテーブルには多数の列がありますが下記の列に注目してみます。
- Story Points
- 相対見積もり
- Derived Estimated Hours
- 配下のタスクの見積もりの合計(時間単位)
まず一例としてプロダクトバックログ項目に対して割り当てた相対見積もりと、いざ項目を実行しようとしてタスクへブレークダウンした後の時間見積もりが相関しているかウォッチできる散布図を作ってみました(データが少ないので見栄えしない)。
最終的には99%の確率で納期を守るにはの考え方を使ってプロジェクトの成功率を表示したいと思っています。OpenProject のタイムトラッキング機能を有効にするとタスクの実行にかかった時間を入力できるようになりますが Work Packages テーブルに直接は反映されないので器用に抽出する必要がありそうです。