【古いのでストック非推奨】CircleCIの新しい有料プラン Performance Pricing plan について

# 追記 2021/06/08
https://circleci.com/pricing/
この記事で紹介しているプランが Performance プランとして正式に公開されています。

記事を書いた当時とクレジット数が違うようなのでこちらの記事はあまり参考にされないほうが良いと思います。じゃあ消せよと言われるかもしれませんが、過渡期の記録としてこの記事は残しておきます。

正しいクレジット数はこちらを参照してください
https://circleci.com/pricing/#compute-options-table

# この記事について
https://circleci.com/pricing/
2018/06/05現在、CircleCIの有料プランには、追加コンテナの料金を毎月支払うというプランが公開されています。しかし、それとは別で Performance Pricing plan というプランが用意されています。いくつかの機能は現在 Performance Pricing plan でないと利用できないようになっています。
この記事では、CircleCIのサポートとやり取りをして分かった Performance Pricing plan で使えるようになる機能とプランの料金体系を紹介します。

※ この記事で紹介している Performance Pricing plan は、まだ実験的なものなようです。現在、私の所属しているチームはこのプランを利用しています。
↑ まだ公開されていないプランなので記事にしてよいかをサポートに聞いたところ、"Please feel free to write a blog post as long as you make a note that you're piloting the plan!" と回答を受けたので明記しました。

# 背景
CircleCIでAndroidのビルドやユニットテストを実行している際に、よくメモリエラーで落ちるようになりました。おそらくKotlinの導入モジュールを増やしたタイミングだと思われます。

CircleCIでのメモリエラーについて調べたところ、configファイルで `resource_class` という設定を追加するとマシンのメモリを増やすことができるということがわかりました。2017年末の段階ではサポートに問い合わせれば有料プランでも無料プランでも、`resource_class` が利用できたようです。[^1] [^2]

しかし、サポートに問い合わせてみると「`resource_class` は新しい料金体系である Performance Pricing plan でないと利用できません」という回答を受けました。サポートとのやり取りの中で、Performance Pricing plan の追加機能と料金体系について教えてもらいました。

# 追加機能
Performance Pricing plan では少なくとも以下の機能が追加されるようです：

- `resource_class`：マシンの仮想CPU数、RAM容量を指定できます。[公式の説明](https://circleci.com/docs/2.0/configuration-reference/#resource_class)があります。
- Docker Layer Caching：キャッシュによってビルド時間の削減に活用できるようです。こちらも[公式の説明](https://circleci.com/docs/2.0/docker-layer-caching/)があります。
- 365 Day Data Retention：365日間、ビルドデータの保持をしてくれるようです。

# 料金体系
コンテナプランは1コンテナあたり毎月これだけという定額課金でしたが、Performance Pricing plan はいわゆる従量課金プランです。ビルド時間やアクティブユーザー数によって毎月の料金が異なります。

## クレジットによる課金
毎月のビルドに使ったリソースがクレジット(credit)という単位で計算され、1クレジットでいくらという料金体系になっています。クレジットはビルド時間1分ごとに増えていきます。また、1分あたりに増えるクレジット数はビルドに利用されるマシンによって異なります。LinuxよりもmacOSの方が高く、また `resource_class` で性能の良いマシンを指定すると高くなります。具体的には以下のような表になっています。

**Linux**

| Resource Class | 仮想CPU数(vCPU) | RAM | クレジット数(credit)|
|:---------------|---------------:|----:|----------------:|
| small          |              1 |  2GB|               5 |
| medium(default)|              2 |  4GB|              10 |
| medium+        |              3 |  6GB|              15 |
| large          |              4 |  8GB|              20 |
| xlarge         |              8 | 16GB|              40 |

**macOS**

| Resource Class | 仮想CPU数(vCPU) | RAM | クレジット数(credit)|
|:---------------|---------------:|----:|----------------:|
| large          |              4 |  8GB|              50 |


たとえば、Linuxで `resource_class: large` を指定して1,500分間ビルドし、macOSで1,000分間をビルドした場合、

```
1,500 × 20 + 1,000 × 50 = 30,000 + 50,000 = 80,000
```

と計算され、 80,000クレジットとなります。
2018/06/05現在、10クレジットあたり0.006ドル課金されるので、

```
80,000 ÷ 10 × 0.006 = 48
```

となり、クレジット代は48ドルになります。

## アクティブユーザーによる課金
さらに、CIを利用するアクティブユーザー数によっても課金されます。アクティブユーザーの定義は「個人のPCからビルドをトリガーした人」だそうです。アクティブユーザーは5人からとなっており、その月のアクティブユーザーが5人未満だとしても5人として計算されます。

2018/06/05現在、1アクティブユーザーあたり15ドル課金されます。
アクティブユーザーは5人からなので、最低75ドル 、5人より多い場合は1人あたり15ドル追加で課金されます。

# その他
## 切り替え方法
サポートに Performance Pricing plan にしたいと連絡すると、CircleCIの設定画面にプラン切り替えの設定を出してもらえました。

## 注意：一度切り替えると戻せない
現在、一度 Performance Pricing plan に切り替えるとコンテナプランに戻すことはできないそうです。私のケースでは、サポートに自分のプロジェクトのビルド時間やアクティブユーザーから計算した見積もりを出してもらえたので、皆さんも見積もりを出してもらうことをおすすめします。

# さいごに
この記事では、CircleCIの新しい有料プラン Performance Pricing plan について、利用可能になる機能と料金体系についてまとめました。Performance Pricing plan が正式に公開されるようになったら、この記事の意味はあまり無い感じになりますが、もし誰かのお役に立てば幸いです。

[^1]: [Android + CircleCI 2.0のメモリエラー対策](https://medium.com/@star_zero/android-circleci-2-0%E3%81%AE%E3%83%A1%E3%83%A2%E3%83%AA%E3%82%A8%E3%83%A9%E3%83%BC%E5%AF%BE%E7%AD%96-17aeb7447f95)
[^2]: [CircleCI 2.0 の resource_class で CPU と RAM のリソースを変更してみる](http://tech.gamewith.co.jp/entry/2017/12/25/185239)