CircleCIのTech stackとかよく使ってるツールとか

こんにちは、CircleCI Advent Calendar 18日目担当のKimです。

今回はCircleCIのTech stackと活躍しているツールについて紹介したいと思います。

# 開発系
## Clojure
<img src="https://glot.io/static/img/clojure.svg" width="100" height="100">

CircleCIといえばご存知Clojureです。最初はRubyとRoRを使ってたみたいですが途中で切り替えた様です。Clojureを本格的に使ってるチームはまだまだ少ないと思います。個人的にはClojureがやってみたくてCircleCIに入ったという部分は大きいです。

起動が遅いとか、エラーメッセージが結構な割合で意味不明とか、関数言語としては怪しい仕様が時々あるとか、色々細かい不満はありますが基本的にはみんなClojureを愛しています。

## ClojureScript
<img src="http://daynin.github.io/clojurescript-presentation/img/clojurescript-logo.svg" width="100" height="100">

フロントエンド開発では[ClojureScript](https://github.com/clojure/clojurescript)を使っています。フロントエンドはほとんど触らないのであんまり詳しくないですが、直接Javascriptを書くよりもClojureで書かれたバックエンドとの親和性がいいみたいです。

## Om
[Om](https://github.com/omcljs/om)はReactのClojureScript用インターフェースです。ClojureScriptからReactを使いたければほぼOmしか選択肢がないから使ってるからだと思われ、、、(あんまり知らない)

## エディター
<img src="http://daifuku-p.org/w/wp-content/uploads/2015/08/1024px-EmacsIcon.svg_.png" width="100" height="100">

ちょっと路線がずれますが...Clojureをメインで使ってるのでEmacsを使ってる思うかもしれませんが実際はEmacsとVimが半々くらいです。EmcasだとClojureの開発環境は充実していますが、Vimでも[vim-fireplace](https://github.com/tpope/vim-fireplace)とかあったりして特に問題ない様です。IDE？多分誰も使ってないと思います :)

ここ数ヶ月はEmacsを自分は使っていて最近ようやく手に馴染んできたところです。ところで、`view-mode`を昨日知ったんですがこれのおかげでめっちゃコードリーディングはかどります。

## Github
<img src="https://upload.wikimedia.org/wikipedia/commons/9/91/Octicons-mark-github.svg" width="100" height="100">

もちろんGithubを使っています。PRベースで基本的にコードレビューはしますが厳格なレビュールールやコード規約とかはありません。むしろ動くコードを早くデプロイして動かしながら問題があれば直していくというスタンスです。

マージしてよければ **LGTM**、あんまり詳しくは知らないけど大丈夫っぽいからマージしていいよは、**IGYB** とかコメントしたりします。

## Replicated
<img src="https://www.replicated.com/images/logo.png" width=200 height=100>

ちょっと宣伝になってしまって申し訳ないのですが、最近公式に[CircleCI Enterprise](https://circleci.com/enterprise/)をリリースしました。しかし、Enterpriseプロダクトにはどうしても難しい問題があります。どうやってお客様先のバージョンをアップデートするとかトラブルシューティングをどの様にするかなどです。

[Replicated](http://www.replicated.com/)はこうゆうEnterprise固有の問題をある程度解決してくれます。以前は自前でやってた処理を今はずいぶん任せることができています。

# インフラ/運用系

## AWS
<img src=https://irlabs.io/uploads/course/logo.png width=100 height=100>

基本インフラは全てAWSで運用しています。全てのビルドは後述するAWSのインスタンスのLXC上で動いています。値段が高いとかUIがよくないとか不満はありますがスケールが簡単にできるのでAWSなしでは今や成り立ちません。将来的には別のクラウドプロバイダーも透過的に使える様にしたいですね。

## LXC
<img src=https://linuxcontainers.org/static/img/containers.png height=100 width=100>

AWSのインスタンス上でLXCコンテナが動いていて、ビルドはコンテナ上で実行されます。コンテナを使うことでセキュリティを確保したりリソースを制限したりすることができます。Unprivilegedコンテナを使っているのでビルドからディバイスへのアクセスなどはできませんが大抵のコードは実行することができます。

なぜDockerを使ってない？と思うかもしれませんが、当時はDockerがなかったからだと思います。あと、Dockerは基本的にはアプリケーション用コンテナ向けなのでCircleCIの様にVM的に使いたい場合はLXCの方が向いています。しかし、最近Dockerでsysvinitを使う方法を発見したのでもしかしたらLXCをDockerに置き換えることができるかもと少し期待してます。

## Datadog
<img src="https://www.datadoghq.com/wp-content/uploads/2015/06/dd_logo-icon-PMS-page-001.jpg" height=150 width=130>

データの可視化は[Datadog](https://www.datadoghq.com/lpg/)を使用しています。Datadog素晴らしいです。簡単にデータの収集もできるしグラフのサイズも豊富でみたいデータを簡単に可視化してくれます。

## Rollbar
<img src="https://avatars3.githubusercontent.com/u/3219584?v=3&s=400" height=100 width=100>

スケールな環境だと時々発生する例外は避けれません。(言い訳かもしれませんが、、、）CircleCIでは[Rollbar](https://rollbar.com/)を使ってバックエンドとフロントエンドで発生する例外をSlackに送っています。障害が発生するとすごい勢いでメッセージが出ます。。。

# サポート系

## Intercom
<img src="http://blog.intercom.io/wp-content/uploads/2012/08/intercom-logo.png" height=100 width=100>

CircleCIで質問したことがある人なら知ってると思いますが右下に現れるあれです。[Intercom](https://www.intercom.io/)はチケットとアナウンスをするのに使っています。完全なチケットシステムではないので融通が効かないこともありますが、サポート用のUIも提供してくれたりするので重宝しています。

## Discourse
<img src="https://pbs.twimg.com/profile_images/3264780953/6c9a2cd7bb2efcb4c53d32900e52c8ac_400x400.png" height=100 width=100>

最近[コミュニティーサイト](https://discuss.circleci.com/)をラウンチしました。これはDiscourseをベースにして作っています。個人的にはUIがかなり気にっています。デザインチームの人も頑張ったんだと思いますが、DiscourseのUIがすごく綺麗に作られているんだと思います。

何かわからないことがあった時はここを検索すれば答えがあるかもしれないので試して見てください。

# コミュニケーション系
## Slack
<img src="https://lh3.googleusercontent.com/CzlsZP3xUHeX3HAGdZ2rL9mK6_C-6T1-YWeBeM8nB3ilmfPSBHCFx4-UbQr8MnQms3d9=w300" height=100 width=100>

もちろんチャットはSlackでやっています。Slacの良さを今更説明する必要はないと思うますが、それにしても欧米人ってミームとか大好きですよね。randomっていうチャットルームがあるんですがそこはミーム画像で溢れています。

あとEmojiもみんな大好きです。こうやって１日の予定をEmojiで表したりします。
<img width="178" alt="Screen Shot 2015-12-18 at 12.54.26 PM.png" src="https://qiita-image-store.s3.amazonaws.com/0/16437/cd0aa838-e0fe-091f-1a31-07abaca1dd09.png">


## Zoom
<img src="https://lh5.ggpht.com/ukIEkdwZAedDk4OLDb3B5mF8-kJnAq_8QHwjHHifYZLGIPAfKcWKMiPJwu48_l8FG3Q=w300" height=100 width=100>

技術チームの７割くらいはみんなリモートで働いていて顔を合わせるのは年に数回しかありません。なのでビデオ会議がすごく重要になります。今まではGoogle Hangoutを使ってたんですが大勢が参加した時の接続に問題があって最近[Zoom](https://zoom.us/)に乗り換えました。レイテンシーが結構ある環境でも問題なくつないでくれるすごいやつです。

## Google Calendar
<img src=https://lh3.ggpht.com/oGR9I1X9No3SfFEXrq655tETtVVzI3jIphhmEVPGPEVuM5gfwh8lOGWHQFf6gjSTvw=w300 height=100 width=100>

CircleCIではいろんな国の人がリモートで働いているので共通のカレンダーがありません。また休暇も自由に取れるのでますます誰がいつどこで働いているのかわからなくなります。なので可能な限り予定はGoogle Calendarで共有するようにしています。また、Zoomとも連携しているのでGoogle Calendarから参加可能なZoomのビデオ会議とかも設定できるので便利です。

# まとめ/求人
興味があるツールはあったでしょうか？他にも細かいツールはいろいろあるけど大体活躍してるのはこんな感じです。

ところで、現在CircleCIでは日本からリモートで働ける[サポートエンジニア](https://jobs.lever.co/circleci/65cfaf2f-91fc-46dc-816d-a4d258cba8f1)を鋭意募集中です。完全フレックス制・コアタイムなし、無制限休暇、Clojureが使えるなど色々いいことがあるので、興味があればぜひ応募してみてください。質問などがあれば、yangkookkim@gmail.comまで連絡していただければ何でもお答えします。