astahチームの開発を支える技術(開発ツール編)

こんにちは。製品事業部の近藤( [@kompiro](http://twitter.com/kompiro) )です。[JavaDayTokyo2015で平鍋が発表したそうですね](https://twitter.com/hiranabe/status/585979999687090176)。いい機会ですので、これらのツール群をどのように連携させているかを紹介します。

![Kobito.ITGS7T.png](https://qiita-image-store.s3.amazonaws.com/0/4244/d3d1b0ca-baf0-09dd-d975-54489cab1c83.png "Kobito.ITGS7T.png")


## 利用している主なツール

- [Idobata](#idobata): 開発状況を共有するためのチャット
- [Trac](#trac): Wiki&Ticket 管理
- [GitHub](#github): 言わずと知れたGitHub。SCMとして利用するだけでなく、コードレビューにも活用しています。
- [Jenkins](#jenkins): CIやインストーラのビルド。
- [VMWare ESXi](#vmware-esxi): 複数の仮想マシンを動作させる仮想マシンサーバ
- [Trello](#trello): ふりかえりで活用するだけでなく、HubotがIdobataに流れる情報を元に適宜Trelloに反映してくれるおかげでプロジェクトの状況をデジタルに俯瞰できるボードもできました。
- [Hubot](#hubot): chatops&プロジェクトで色々助かることをしてくれるロボット
- [Raspberry Pi](#raspberry-pi): カメラを使ってアナログなかんばんを毎日10:00に撮影
- [Google Apps](#google-apps‎): 撮影した画像をGoogle Driveに貯めています。かんばん上のどこの状態にタスクがたまっているか、追跡しやすくしています。
- [進捗管理 ススム君](#進捗管理-ススム君): 社内製のChrome拡張です。GitHubのIssueの状態をラベルを使って管理します。(以前はTrelloに状態を反映していましたが、認証管理がめんどくさいのでやめました。)
- [かんばん](#かんばん): プロジェクト全体を俯瞰するだけでなく、サポートチームの情報も同じボードに載せる事で、astahの開発に関係するタスク全体を俯瞰

## それぞれのツールの紹介

### Idobata

https://idobata.io/

Idobataは親会社の永和システムマネジメント製です。ただ、それだけで選んでいるわけではありません。シンプルで使いやすいのです。最近はSlackが流行っていますね。Slackは多機能なので、なにもしないでも色々なツールを連携できるのがいいところです。私は **プロジェクトに合わせて開発ツール群をカスタマイズするのが大好き** なのです。できるだけツールが持っている機能は少なく、カスタマイズしやすいツールを好みます。Idobata自身が持っている機能は多くないですし、カスタマイズしやすいツールなので好みなのです。

### Trac

http://trac.edgewall.org/

Tracも最近はJiraだったりRedmineだったりをお使いの方が多いように思います。Tracも同様に機能が少ないですが、カスタマイズしやすいツールです。(プロジェクトを作ったら表示されますよね **Trac is a minimalistic approach to web-based management of software projects.** って。ミニマリスティックですってよ。) 結構昔からTracを使い込んでおり、[Idobataに情報を流すプラグイン](https://github.com/kompiro/trac-idobata-plugin)やらなんやらを作ったりしています。

GitHubでチケット管理をしないのは、GitHubではプロジェクト全体のIssueを一覧しづらいからです。

### GitHub

http://github.com/

言わずと知れたGitHubですね。GitHubのいいところは Pull Request というワークフローを提供してくれる所と、コードレビューが簡単にできる所ですが、リポジトリビューアとしてもいいものですよね。 Pull Request を作成した後はレビューの状態をラベルを使って管理しています。この辺のフローについても後の連載で取り上げますかね。

### Jenkins

https://jenkins-ci.org/

GitHubにPushしたら自動でCIだけではなく、4台のスレーブに仕事を分散してastahの各OSのインストーラをビルドしています。インストーラのビルドはボタン１つです。それだけでなく、各サーバへのデプロイもJenkinsで行っています。

Hubotと連携させて各Jobを実行することも良く実施されていますが、なんせJobが多いので、結局Jenkins上で検索した方が早かったりします。もうちょっと改善できそうですね。

### VMWare ESXi

https://www.vmware.com/jp/products/esxi-and-esx/overview

astahの動作環境はWindowsだけでなく、MacやLinuxもサポートしています。VagrantやDockerなど、より軽量で簡単に試せる新しい仮想環境もありますが、リソースの問題や開発者間で同じマシン環境を使いたいといった要望から仮想マシンサーバが社内で活躍しています。

### Hubot

https://hubot.github.com/

Idobataに投げられたコマンドを実行してくれるってだけじゃなく、他のサービスからIdobataに投げられた情報を元に色々実行してくれる小人さんのような事もしています。例えばGitHubのPull Requestにつけたラベルを元に、Trelloのカードを対応する状態に移動する、とか、そういう事もしています。これもChatOpsと言えばそうかもしれません。動作させているHubotスクリプトなどは今後まとめていきます。

### Raspberry Pi

https://www.raspberrypi.org/

IoTが流行っていますね。このRaspberry Piはその波に乗る意味で買って放置されてたわけじゃないんです。astahチームでは以前からかんばんを使ってプロジェクトの状況を見える化していました。かんばんの運用の肝は、どのステータスにタスクが滞留しているか確認し、ボトルネックを取り除く事で全体的なスループットを向上させることです。タスクが滞留していることを確認するにはどうすればよいでしょうか？astahチームでは、予め定時にかんばんの写真を撮っておき、定期的にふりかえりの時に時系列で眺めています。そうすることで、スループットが詰まっている箇所を改善できることはないか、円滑に話し合うようにしているのです。Raspberry Piは写真の自動化するために導入しました。定時に自動で写真を撮る以外にも、idobataで`bot shot`というと、写真を撮ってくれます。

こういうシステムを作るのが簡単に、しかも安くできる、いい時代になりました。

### Google Apps

https://www.google.com/work/apps/business/

Gmailなど、会社の基盤としてGoogle Appsを利用しています。Google Appsの中にあるGoogle Driveがさっき撮った写真の置き場にちょうどいいのでおいています。

### 進捗管理 ススム君

https://github.com/ChangeVision/susumu-kun-nx

GitHubにPull Requestを出すとastahチームではその修正が意図した変更か確認するアクセプト作業に入ります。アクセプトに入った後の状態をいい感じにサポートしてくれるのが`進捗管理 ススム君`です。これを使うと進捗の状態を切り替えてくれるだけのユーティリティですが、そういったちょっとした事が作業のワークフローを運用可能にしてくれています。発案者の松田さん、いいアイディアです。

### かんばん

最後に紹介するのがかんばんです。astahチームの開発現場では、開発の状況を共有するだけでなく、サポートの状況も共有しています。毎朝朝会はこのかんばんの前に集まり、お互いの状況を確認し、連携しています。

## ツール連携

最初のモデル図だとなにがなんだかよくわからないので、文脈毎にわけてみました。

### JenkinsによるCIとインストーラ作成

![Kobito.Rt26Sk.png](https://qiita-image-store.s3.amazonaws.com/0/4244/e8519834-dc7c-0691-5548-88a6b17af5bc.png "Kobito.Rt26Sk.png")

GitHubにpushされるとJenkinsでCIが実施され、その結果がIdobataに流れます。Jenkinsとその仲間たちはESXiで実行されています。

### 進捗の見える化

![Kobito.NtYVK0.png](https://qiita-image-store.s3.amazonaws.com/0/4244/e48d8359-11bf-0d14-3550-3375deddf156.png "Kobito.NtYVK0.png")

astahチーム全体のプロジェクト管理をTracで実施し、個々のリポジトリにPushし、PullRequestがマージされると自動でTracのチケットを閉じます。チーム全体を見える化しているのがかんばんです。

GitHubやTracの変更は逐次Idobataに通知され、HubotがIdobataに常駐することでそれぞれの変更を監視し、変更があればTrelloに反映させています。


### Hubotによる定時カメラ

![Kobito.z4tdOb.png](https://qiita-image-store.s3.amazonaws.com/0/4244/b59d6259-c342-eaea-7f5a-b2c8a31c1639.png "Kobito.z4tdOb.png")

HubotはRaspberry Pi上で動作しています。RasPiにはカメラがあるので毎朝10:00に写真を取り、Google Appsにアップロードしています。

ざっくりですが、こんな感じです。

ちなみに、各サービス連携はastahのクラス図で書いています。ステレオタイプ毎に拡張アイコンを設定し、依存や関連で線を書きました。