オフラインでもChatOpsしたい！Dockerで導入したその後！


前回[オフラインでもChatOpsしたい！Dockerで解決しよう！](http://qiita.com/tsuruchika/items/8379fab837c17d98e781)で投稿したとおり、オフラインの現場でChatOpsするための環境を作りました。  
まだ道半ばですが一旦導入してから半年かつ年末ということもありまとめてみます。
最終的に導入したものは以下のとおりです。  



### [RocketChat](https://hub.docker.com/r/rocketchat/rocket.chat/)
* Slackクローンのチャットツール(ビデオ通話もできる)

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/4605110d-af61-e846-d9c0-83f127f809c6.png" width="500px">

### [Kanboard](https://hub.docker.com/r/kanboard/kanboard/)
* タスク管理できるカンバンツール

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/e7489180-2847-aa04-d7f1-81b3fb8141f5.png" width="500px">


### [Jenkins](https://hub.docker.com/_/jenkins/)
* JOB管理ツール

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/e502387d-c9df-d40d-b910-8f0ef766c97e.png" width="500px">

### [Knowledge](https://hub.docker.com/r/koda/docker-knowledge/)
* Qiitaクローンのナレッジ共有ツール（もちろんMarkdownでかけるよ）

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/0e01aeec-fba7-268b-55e5-677ed2c2bc96.png" width="500px">

### [fluentd](https://hub.docker.com/r/fluent/fluentd/)
* ログ収集ツール

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/c12cf33d-e0a7-e3ed-9843-633adcee8a76.png" width="500px">

### [ELK(ElasticSearch+Logstash+Kibana)](https://hub.docker.com/r/sebp/elk/)
* 全文検索＋ログ収集＋ビューがDockerイメージで固められてます

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/39b4b767-bd1d-8a52-3d0d-6e33246e47f4.png" width="500px">

### [SonarQube](https://hub.docker.com/_/sonarqube/)※1
* 静的解析ツール

<img src="https://qiita-image-store.s3.amazonaws.com/0/26911/0f0fe6de-6180-214d-2223-9663b3da3593.png" width="500px">


もともと共通のコード管理ツールとして[Gitlab](https://about.gitlab.com/)は提供されていたので、そのまま利用しています。
※1 SonarQubeは重たかったため別ローカルPCを用意してそこのDocker上で起動させてます。（課題）

## 現在の構成
現在の構成で矢印引くと以下のようになりました。

![スクリーンショット 2016-12-25 21.54.28.png](https://qiita-image-store.s3.amazonaws.com/0/26911/0d3393fd-537f-5edf-0c42-713aa769ee43.png "スクリーンショット 2016-12-25 21.54.28.png")

### 各種連携内容

#### GitLab→RocketChat
* マージリクエストが作成されるとRocketChatへ通知が行きます。
* マージリクエストのdescriptionにレビューアを２名以上指定する方針にしてます。
* 記載内容はチーム内共通のテンプレートを利用するようにしているので、正規表現でレビューアのところだけRocketChatにも書かれます。
  * [tkeydll](http://qiita.com/tkeydll)さんの[GitLabとRocket.Chatを連携させる](http://qiita.com/tkeydll/items/09d82701fbdbb200a1ef)を参考にチーム用にカスタマイズしました。

#### Jenkins→検証サーバー（→RocketChat）
* ビルドJOBとデプロイJOBを分けて組んでます。
  * JavaDocも合わせて生成しています。
* JOBのパラメータでどのブランチを対象にするのか、どのサーバーに対してデプロイするのかを指定できるようにしています。
* JOBが成功したか、失敗したかを含めてRocketChatに完了通知を行います。
* JaCoCoやFindbugsなど解析系のJOBもビルドJOB後の後続として走っています。
* 本番リリース用のビルドも合わせて行っているのでJenkinsから直接取得できます。


#### 検証サーバー→fluentd→RocketChat
* 検証サーバのログ・ファイルからfluentdでエラーログを拾いRocketChatに飛ばすようにしています。
  * 最初は全てにしていたのですが、想定しているエラーログまでも拾っていたので、想定していないエラーのみに絞るようにしています。

### 連携の今後の予定
#### RocketChat→Hubot→Jenkins
* RocketChat上で「デプロイしてやー」と依頼できるようにしたいです。
* RocketChatの[0.45.0](https://github.com/RocketChat/Rocket.Chat/releases/tag/0.45.0)以降だとHubotを内包しているので、うまく利用していきたいです。

#### Gitlabにマジリク→Jenkins→SonarQube
* Gitlabにマジリクが出されたらJenkinsでSonarRunnerを走らせて解析させ、SonarQubeに結果を反映＋Gitlabのマジリクのソースにコメントを自動で残していきたいです。

#### PostgreSQL→Logstash→ElasticSearch→Kibana
* 現在のプロジェクトではログを一部PostgreSQLに吐き出しています。
* PostgreSQLのログをLogstashで取得しElasticSearchに適用していきたいです。
  * 一旦お試しで導入はできたんですが、PostgreSQLのJSONB型をElasticSearchに反映させる際に文字列型になってしまう課題がでてきました。可変のJSONを入れているので、どうにかできればと思っているんですが・・・

#### Jenkins→MkDocs
* 設計書などは現在全てExcelですが、いずれMarkdownで全て書き起こして行きたい！
* Markdownで書かれたドキュメントをブラウザで閲覧できるようにMkDocsでGenerateできればと。。
* UMLも一部PlantUMLとAtomを組み合わせてMarkdownで書いているのでそちらも合わせてしたいです。

### やらないこと
#### Kanboard→RocketChat
* タスクの動きを常に監視できるのは大変便利なんですが、一定数以上のチームになってくるとその通知は「もうっ！見に行くからええよ！」ってぐらいになってきてやりません。

## 連携してないけど使ってるツール
### Kanboard
* もとはRestyaboardを使っていた。
* Restyaboardはカードを移動させると記載しておいたメモが消えてしまうのがいけてない。
* Kanboardはメモが消えないのはもちろん[プラグイン](https://kanboard.net/plugins)が豊富。
* 作業工数も記録できるし、サブタスクももてるからRedmineの上位互換的立ち位置。
* CSVで出力して分析・・もできるが、もともとKanboardには分析用のグラフ画面が用意されていてGOOD。

### SonarQube
* メモリもCPUも喰うのでDockerでいろいろ乗せている場所に相乗りは正直キツイ印象。
* 現在サーバーは調整中だがローカルPCで立ち上げて解析はしていて、潜在バグを減らしていいモノ作るぞ感がすごくでてイイ！
* 改修サンプルを出してくれるので改善＋学習できる印象。

## まとめ
以上、職場のオフライン環境でもChatOpsするぞ！と意気込んだ日からのその後でした。
チーム全体で半年間取り組んだ働きやすい環境作りは少しづつですが成長できています。
メンバーの協力がなければ成り立ちませんでした。本当に心からいいチームだと思います。
おそらく私のいるチームにはこれがベストマッチしたわけで、他のチームにそのまま流用とはいかないかもしれません。ただ、私どもの取り組みを少しでも知って参考にしてもらい、オフライン環境での製造に息苦しく感じている方々の風通しが少しでも良くなればと願ってます。