無料で整える趣味チームの開発環境

# **趣味チーム？**

趣味チームに所属している方はいらっしゃるでしょうか。
お仕事関係なしに友人たちと趣味で開発するような人たちです。
趣味と言えどもチームですから、チームで使える開発環境を整えたくなります。

「 **趣味チームの開発環境を整えたい** 」

そう思った時に課題になるのが **お金** です。
もちろん投資だと思ってお金を出せればいいのですが、基本線は趣味ですから中々そうもいきません。
ここはひとつ趣味の一環として、 **無料縛り** という制約を貸した上で、趣味チームの開発環境をどこまで整えられるのかを考えてみたいと思います。

## 環境イメージ

先にネタばらしをしておくと、以下のような感じに落ち着きました。利用量の制限はありますが **無料** です。

*<img src="https://qiita-image-store.s3.amazonaws.com/0/45253/cf9abe46-92e9-de98-4a49-c01b6f4d9e36.png" width=800>
<div>Icons made by <a href="https://www.flaticon.com/authors/prosymbols" title="Prosymbols">Prosymbols</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div>*


簡単に言うと以下のようなことができます。

- メンバ数 **制限なし**
- **プライベートリポジトリ** 作成可
- 任意のデバイスからのチャット(～1万メッセージ)、ファイル共有(～15GB)
- **毎月2000分** までのCI
- **24時間稼働のChatbot**
- **24時間稼働のVM** (1vCPU, 0.6GB) × 1

### ChatOps

イメージ図から大体想像つくかと思いますが、Blumix上のHubotでSlackからChatOps的なこともやってます。

- VMの **起動 / 停止**
- **定期ジョブの実行**
    - 起動中VMの通知
    - 課金額の通知
- VMでのコマンド実行

地味にありがたいのは「 **起動中VMの通知** 」「 **VMの停止** 」あたりですかね。
無料枠だけではどうしてもリソースが足りないときは当然有料のVMを借りるんですが、なんとなく止め忘れちゃったりすることもあるので、 **気づくことと停止がSlackだけでサクッとできる** のは非常に重宝します。

あとは「課金額の通知」なんかも **無料縛り** の実現のためには重要なbot機能でしょうか。

## サービスカテゴリ

今回は下記のカテゴリについて、全体的なバランスをみながら考えました。

- **Chat**
- **Git Repository**
- **CI**
- **Infra/App Platform**
- **Filestorage**
- **その他**

それぞれの中には「なんとなく決めた」ものも当然入っていますので、厳密な評価でないことはご容赦ください。
各カテゴリについて、

- **Point**
    - サービスを選定する上で外せなかったポイント。いわゆる要件。
- **Pros**
    - そのサービスのよいところ、イケてるところ。
- **Cons**
    - そのサービスのわるいところ、イマイチなところ。

の観点で簡単に評価していきたいと思います。

# **Chat**
まずはコミュニケーションの要、チャットツールを考えましょう。

- **[Slack](https://slack.com/)**
- [Gitter](https://gitter.im/)
- [HipChat](https://ja.atlassian.com/software/hipchat)
- [ChatWork](http://www.chatwork.com/ja/)
- [LINE](https://line.me/ja/)
- [Skype](https://www.skype.com/ja/)

無料で使えるものだけでも結構な数があります。  

## Point

基本的にはPCに向かって開発をやるわけではありますが、コミュニケーション自体は色々なところでやりますので、 **マルチデバイス対応** が重要です。
PC版(Windows/Mac/Linux)、モバイル版(Android/iOS)への対応が必須です。
また、色んなことをして遊びたいので **bot連携** 、 **外部サービス連携** のしやすさも重視したポイントです。

以上を踏まえ、チャットサービスには **Slack** を選択しました。

## **Slack**

<img src="https://qiita-image-store.s3.amazonaws.com/0/45253/1b79af86-6da9-1b4a-99c7-746b7a15f64c.png" width=400>

### Pros

- マルチデバイス対応
- 豊富な外部連携

何と言っても外部連携に寛容でIT技術者向けなところが最大の長所といえます。

他サービスに比べれば標準で持っている機能に乏しい面があったりしますが、ターゲットがIT技術者であるがゆえにAPIやら何やらで利用者自身がその不足を補えるようになっています。 **楽しい** 。
IT界隈でのチャットサービスとしてはデファクトスタンダードとなっているので、情報量豊富なのも遊ぶアイデアに困ることなく嬉しいポイントです。

### Cons

今回の例で言えば特段気になる点はなかったのですが、一般的な比較においてはタスク管理などのチャット以外の機能について言及されることが多いようですね。
また、「アカウントを持たない社外メンバとも気軽にやりとりしたい」というケースにも対応できないため、コミュニティクローズドな部分が場合によっては短所になるようです。[^1]

[^1]: [Shared Channel](https://slackhq.com/introducing-shared-channels-where-you-can-work-with-anyone-in-slack-8c5d2a943f57)という機能が今後登場するようなので、この部分は短所としては弱くなっていくかもしれません。

- [チャットワークとSlackどちらを採用すべき？2大チャットツールを徹底比較！](https://boxil.jp/mag/a110/)

# **Git Repository**

おそらく何かしらを開発することになると思うので、成果物を共有するための場所が必要です。
ソースコードといえばバージョン管理システムが必須になるでしょうから、Gitのサービスを選んでみます。

- **[GitLab](https://gitlab.com)**
- [GitHub](https://github.com)
- [BitBucket](https://bitbucket.org)

## Point

作るものにもよりけりですが、今回はチームで内々に作っていきたいものだったため、 **プライベートリポジトリ** が要件としてありました。
この点では業界のデファクトスタンダードである GitHub は少し弱いため、他の機能の豊富さと相まって **GitLab** を選ぶに至りました。

## **GitLab**

<img src="https://qiita-image-store.s3.amazonaws.com/0/45253/5c9b405a-2b34-38e4-4a7e-3d8fd12b755f.png" width=400>

### Pros

ポイントでも述べた通り、 **プライベートリポジトリが無料** で使えるのが魅力です。
プライベートリポジトリという点ではBitBucketも無料で使えるのですが、無料のプライベートリポジトリは **所属ユーザが5名まで** という制限があります。
その他、GitLabは競合するサービスと同等の各種機能を備え、後述する **CI機能** すら備わっています。

### Cons

仮にチームの成果物をクローズドではなくオープンに見せたい場合は **圧倒的にGitHubが優位** になると言えます。
ここに至っては機能よりサービスとしての **知名度** がモノを言いますので、GitLab最大の弱点と言えるでしょう。
また、個人的には好きですがGitLabはガンガン最新版へのアップデートをかけていくため、気づいたらUIがずいぶん変わっていたなんとことも起こったりします。

あとはチームの大きさにもよりますが、「1 Issue, 1 Asignee」ってのも場合によっては問題になるかもしれません。

# **CI**

さて、ソースコードの管理に続いてCI機能もほしいところです。
リポジトリへのpushに反応してビルドなどを自動で行ってくれるCIサービスは一度使い始めるとやめられない魅力があります。

- **[GitLab CI](https://about.gitlab.com/features/gitlab-ci-cd/)**
- [Circle CI](https://circleci.com/)
- [Travis CI](https://travis-ci.org/)
- [Concourse CI](https://concourse.ci/)
- [Appveyor](https://www.appveyor.com/)
- [Semaphore](https://semaphoreci.com/)

## Point

基本的にはソースコードと密接に関連があるもののため、Gitサービスとの連携性が重要なポイントになります。
とはいえ、基本的なところは「Git連携機能」として各サービス共通ですし、サービス固有ということであればGitHubとそれ以外っていうくくりになります。
今回はGitリポジトリにGitLabを選んでいるため、連携性での優位性はGitLab CIを含めて特段関係がないと思われます。

- [無料で使える CI サービス比較](http://srz-zumix.blogspot.jp/2016/01/ci.html)

あとは上記ページでもまとめられていますが、 **ビルド時間の制限** はサービスごとにちょっとばらつきがあるようです。
選定時点で特にこだわりはなかったのでGitリポジトリとの親和性をイメージして **GitLab CI** を選択しています。

## **GitLab CI**

<img src="https://qiita-image-store.s3.amazonaws.com/0/45253/5c9b405a-2b34-38e4-4a7e-3d8fd12b755f.png" width=400>

### Pros

GitLabとの連携という点では印象的には優れている感があります。
SlackインテグレーションなんかでもGitLab連携ひとつで済むので、趣味チームとして利用サービスが少ないのはそこそこ嬉しくはあります。

また、今回悩まなかったのですが、この記事のため調べていて「 **プライベートリポジトリに対するCI** 」って意外とできないところが多いんだなと感じました。もちろんGitLabとGitLab CIの組み合わせなら気にする必要はありません。

### Cons

機能的なところでいくと、GitLab CIは「時間トリガー」で処理を実行することができません。
時間トリガーってところであれば、 **Appveyor** とか **Semaphore** あたりを使うことになると思います。

- [無料で使える CI サービス比較（定期実行編）](http://srz-zumix.blogspot.jp/2016/10/ci.html)

ちなみに今回は時間トリガー処理はCIサービスに頼らずbotで動く [cron](https://www.npmjs.com/package/cron) 機能に任せています。

# **Infra/App Platform**

チームで成果物を作ったら、おそらくどこかで動したくなるものでしょう。
そういった場合にいわゆるIaaSやPaaSといったサービスを利用したくなります。

- **[Bluemix](https://www.ibm.com/cloud-computing/bluemix/)**
    - [Bluemix Pricing](https://www.ibm.com/cloud-computing/bluemix/ja/pricing)
- **[GCP](https://cloud.google.com/?hl=ja)**
    - [Google Cloud Platform Free Tier](https://cloud.google.com/free/?hl=ja)
- [Heroku](https://www.heroku.com/home)
    - [Simple, flexible pricing](https://www.heroku.com/pricing)
- [AWS](https://aws.amazon.com/jp/)
    - [AWS Free Tier](https://aws.amazon.com/jp/free/)
- [Azure](https://azure.microsoft.com/ja-jp/)
    - [free pricing offers](https://azure.microsoft.com/ja-jp/free/pricing-offers/)

## Point

ここに並んだサービスのシェアだけで言えば圧倒的に **AWS** なのですが、意外とAWSの無料枠はしょっぱかったりするのでお金のない趣味チームには向きません。
そこで出てくるのが **Bluemix** と **GCP** です。
サービスが多岐にわたることからぱっと理解するのが難しいのですが **[Bluemix Pricing](https://www.ibm.com/cloud-computing/bluemix/ja/pricing)** や **[Google Cloud Platform Free Tier](https://cloud.google.com/free/?hl=ja)** を見ると、結構色々なものに無料枠が備わっていることがわかります。
今回特に注目したのが、「仮想マシン」「アプリエンジン」でした。

## **Bluemix & GCP**

<img src="https://qiita-image-store.s3.amazonaws.com/0/45253/33500120-7b62-2920-95f6-670236c4cfdd.png" width=400><img src="https://qiita-image-store.s3.amazonaws.com/0/45253/539f0bfc-19c8-e02f-96a6-1c7069bb52bb.png" width=400>

### Pros

- **仮想マシン**
    - [GCP: Google Compute Engine](https://cloud.google.com/compute/?hl=ja)
        - 1ヶ月あたりf1-micro(1vCPU, 0.60GB)相当分が無料
        - 米国リージョンのみ
        - ネットワークトラフィックの課金に注意
            - [GCEのf1-microインスタンスを真にタダで使う方法](http://qiita.com/hnw/items/a4e395d047b382e7dc5f)
- **アプリエンジン**
    - [Bluemix: Bluemix Cloud Foundry app runtimes](https://www.ibm.com/cloud-computing/bluemix/runtimes)
        - 1ヶ月あたり512MB・月が無料
        - [参考: Herokuでbotを運用する時代は終わった。これからはIBM Bluemixを使って無料で運用する](http://qiita.com/akameco/items/39a55635ceb0ba185b7f)
    - [GCP: Google App Engine](https://cloud.google.com/appengine/?hl=ja)
        - 1日あたり28時間・インスタンスが無料

参考にもあるように、Bluemixを使ってbotを24時間運用しています。簡単な処理をこいつにさせることも出来るので意外と重宝しています。
ちなみに少し前まではBluemixでdashDBというRDBがデータ量1GBまで無料だったのですが、いつの間にかなくなっていました。残念です。
dashDBの無料枠がなくなってしまった今では [IBM Cloudant](https://www.ibm.com/analytics/jp/ja/technology/cloud-data-services/cloudant/) というNoSQLが1ヶ月あたり1GB分無料となっています。

### Cons

無料枠が強気なところがまさにそのためだと思うのですが、BluemixとGCPはAWSやAzureに比べて情報が少ないです。
実際には、AWSに関する情報量とAzureを含めたその他全ての情報量を比べてもまだAWSに勝てないというような構図だと思いますが、無料でがんばろうとするのであれば、こうした情報収集で音を上げるわけにはいかないところです。

Bluemixは元々SoftLayerっていうIaaSとBluemixっていうPaasに分かれていたこともあり、サービスとしての全体像が掴みにくいのですが、IBMならではのWatsonサービスを使って [会話エンジンにWatson Conversationを使ったSlack botを作ってみた](http://qiita.com/tsota/items/497513585f069386626f) みたいなことができたりもします。

一方GCPはどうかというと、 **[BigQuery](https://cloud.google.com/bigquery/?hl=ja)** が1ヶ月あたり1TBスキャンまで無料だたり、画像認識の **[Google Cloud Vision API](https://cloud.google.com/vision/?hl=ja)** が1ヶ月あたり1000ユニットまで無料で使えたりします。

### 注意

ただし、これらの無料枠を使用するためにはアカウントに対して **クレジットカードの紐付け** が必要になります。
無料枠を超えた分は自動的に課金されることになるため、各サービスの課金体系を理解し、使用量を正しくモニタリングできない場合は安易に手を出さないほうがよいでしょう。戒めのため以下の記事を紹介します。

- [BigQueryで150万円溶かした人の顔](http://qiita.com/itkr/items/745d54c781badc148bb9)
- [Amazon Glacierでクラウド破産しないために](http://blog.hde.co.jp/entry/2015/01/30/154101)

また、ありがちな話ですが各種リソースをコントロール可能な **APIキーの公開は絶対にやめましょう & 注意しましょう** 。

- [初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。](http://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694)
- [クラウド破産しないように git-secrets を使う](http://qiita.com/pottava/items/4c602c97aacf10c058f1)

# **Filestorage**

ソースコードはGitで管理、共有すればいいのですが、バイナリファイルをGitに置くのは心が痛みます。
そのため、ファイルストレージサービスを探しましょう。

- **[Google Drive](https://www.google.com/intl/ja_jp/drive/)**
- [Dropbox](https://www.dropbox.com)
- [BOX](https://www.box.com/ja-jp)
- [MEGA](https://mega.co.nz/)
- [ChatWork](http://www.chatwork.com/ja/)

## Point

基本的にはバイナリファイルの受け渡し場所として機能すればよいため、正直なところあまりポイントはありません。
データをまるっと渡したりすることがあるかもと考えると、最低でも10GBくらいはあると安心かもしれません。

- [【比較表有】容量だけで選んでいいの？無料オンラインファイルストレージ17選](https://ferret-plus.com/2377)

また、すでにチャットカテゴリでも登場している ChatWork ですが、チーム機能の一環でファイルストレージ機能ももっています。
利用サービスを極力少なくしたいということであれば、 ChatWork に寄せてしまうのもアリでしょう。

## **Google Drive**

<img src="https://qiita-image-store.s3.amazonaws.com/0/45253/4525a21c-7eb8-3954-b1c7-491d3aade871.png" width=400>

### Pros

15GBと比較的容量が多いことと、 **[Slackとの親和性](https://get.slack.help/hc/ja/articles/205875058-Slack-%E3%81%A7-Google-%E3%83%89%E3%83%A9%E3%82%A4%E3%83%96%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B)** が高いところでしょうか。
Excelみたいなものを共有する場合、Googleスプレッドシートなどでブラウザ上でそのまま開けるのも便利です。

あとは多分チームのみんなGoogleアカウントは持っているでしょうから、アカウント増やさなくて済むのも割と大きな魅力です。

### Cons

先に挙げた比較ページを見てわかると思いますが、15GBという容量は比較的多いのですが、トップではありません。
トップのMEGAは無料で50GB使えるらしいので、 **容量重視であればMEGA一択** でしょう。

また、Google Driveの容量15GBというのはアカウントあたりであるため、誰かのアカウントの領域を他メンバに共有するという形態になります。
そのため、個人が元々Googleドライブを利用していた場合、チーム開発用途と個人用途で15GBとなってしまうのも難点の1つと言えるでしょう。

# **その他**

ここからはオマケです。今のところ使っていませんが、ニーズは感じているため使おうかな―と考えているようなものです。

## Task Management

GitリポジトリにはIssue機能がありますから、ソースコードに関連するタスクをIssueとして記録しておくことができます。
一方で、ソースコードに直接紐付かない微妙なタスクや全体のナレッジはどこにも残せなかったりするのでチームに紐づくタスクやナレッジの管理ができると便利です。

- [Wrike](https://www.wrike.com/ja/)
- [Trello](https://trello.com/)
- [Asana](https://asana.com/)

他にも無料プランがあるものはいくつかあるようです。

### Point

タスク管理ツール自体は結構使ってみないと良し悪しがわからなかったりするので、これといった要件を出すことが難しかったりします。

- [長く使えるプロジェクト管理ツール厳選レポート2017](http://mfl.revee.jp/blog/project-management-tool-2015/)

タスク進捗はチャットから見たいと思いますので、 **[Slack Apps](https://slack.com/apps)** にあるものを優先的に選んでみるのでもいいかもしれません。

## Monitoring

趣味チームとはいえクオリティを気にしていきたい場合、何かしらのモニタリングが必要です。

- [Datadog](https://www.datadoghq.com/)
- [Mackerel](https://mackerel.io/ja/)
- [New-Relic](https://newrelic.com/)

### Point

一言にモニタリングといってもサーバレイヤとアプリレイヤがありますので、それによってもポイントが異なります。
GCEで無料仮想マシンを使っている場合には Datadog をとりあえず入れておくのがよいでしょうし、作ったアプリの挙動を見たいってことであれば New-Relic だったり他のものを使うことになると思います。

# **おわりに**

**無料縛り** での開発環境整備、いかがだったでしょうか。
もちろんお金を少しでも払えばまた全然違った結果になるのですが、無料でもかなり便利に & 遊べるようになるかと思います。
使ってみると便利なものばかりですので、色々なものを試してみるのはとてもよいなと思いました。

この記事で挙げたカテゴリや、ここにないカテゴリでも趣味チームに向いているサービスなんかがあったらぜひ共有いただきたいです！
それでは **よい趣味チームライフ** を！