効果10倍!? Storage料金節約方法を解説

こんにちは！CircleCIでカスタマーサスセスをしているチヨです。
5月よりパフォーマンスプランでのストレージ料金の課金が開始されました。
1GB 420creditsでおよそ25セント28円ぐらいかと思っていたのが最近の為替レートですと35円の計算になります。日本のお客様にはSaasの料金が重荷になっており、なんとか料金を抑えられる方法を紹介できればと思います。今回はworkspaceとartifactの節約術2選を紹介いたします。

[初めに](#初めに)
まずストレージで課金対象になっているものは以下の3つです：
![Screen Shot 2022-07-12 at 23.40.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/c3542ca0-1048-1446-9969-065bb2f61d9e.png)
CircleCIで使用している図で表すと、
:arrow_right:キャッシュ- Wrokflowをまたぎ同じステップで使用されるキャシング(npm、Gem パッケージなど) 
:arrow_down:ワークスペース- wrokflow内で使用するジョブの間に必要なデータ
:arrow_down:アーティファクト　ジョブが完了した後もデータを保持し、ビルドプロセス出力を保存する

[ワークスペース節約方法](#ワークスペース節約方法)
jobの間に使用するワーススペースはデフォルトで15日間保存されております。
お客様の使用方法によっては、長期間 workspaceへの保存が必要ないプロジェクトがあります。
その際に使用していただきたいのがUsage Controlページです。
ビルドを走らせる前に変更いただくことで保存日数が変更され、クレジットの消費が抑えられます。
![Screen Shot 2022-07-19 at 8.50.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/16ab39a3-ce67-9b52-2d09-52e02258a0e0.png)
以下同じConfigを72回Scheduled Pipelineで動かしたものです。
1回のworkflowでWorkspaceは512MiB作成されます。
![Screen Shot 2022-07-19 at 11.03.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/c499a64c-1798-01f3-c524-570fc07b4b95.png)
Usage Control設定なしで2日間使用した場合19.6GB消費しました。
![Screen Shot 2022-07-17 at 20.07.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/439521df-1755-a96d-ac2a-5a5395927c74.png)
workspace1日に設定した場合同じプロジェクトで2日間で1.6GBまで削減できました。
![Screen Shot 2022-07-17 at 20.07.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/9ae62a6a-d9e9-b839-d5f5-78d7b87866b5.png)
今回のプロジェクトはjobが2回走る簡単なものでしたのが、workspaceの保持日数を短くしてもビルド時間などに影響は見られませんでした。
実際に1回のjobで70GBほどWorkspaceを使用していたお客様でもストレージ保存日数を変更した例がありますが、ビルド時間の相違はストレージ保存日数を短くしても変化がありませんでした。

[アーティファクト節約方法](#アーティファクト節約方法)
アーティファクトの重要な役割として、ビルドの失敗をトラブルシュートするのに役立ちます。 問題が解決しないなど長期間トラブルシューティングが必要になる場合workspaceの際に設定した1日という保存期間は短く、デフォルトの30日から短くするのを憚れると思います。

以下弊社[ドキュメント](https://circleci.com/docs/ja/persist-data#artifact-optimization)で紹介されているartifactの最適化方法です
![Screen Shot 2022-07-13 at 0.41.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/2efda857-25e4-071e-09e2-7a974c490fd3.png)

その中でもビルドを失敗した時のみ保存する設定をしております。
```
version: 2.1

jobs:
    build:
        docker:
            - image: ubuntu:rolling
        steps:
            - run: mkdir artefacts
            - run: echo 'Hello artefacts!' | tee hello.txt
            # - run: echo 'Another artefact!' | tee artefacts/save-me-always.txt
            - run: exit 0
            - run:
                  command: mv hello.txt -t artefacts
                  when: on_fail
            #失敗した時のみartifactへアップロードする
            - store_artifacts:
                  path: artefacts
```

Hello worldの単純なartifactのため、Artifactのストレージの量は一回につき7kです。今回12回実行したため、2KBの消費がありました。

失敗した場合保存しない設定すると、同じ回数のテストをしても保存されておりません。
![Screen Shot 2022-07-15 at 7.50.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1277768/55d85cce-8859-7b6d-422d-6f2b16780ba6.png)

もちろん失敗したテスト結果のみartifactとして保存しているわけではないので、節約の1つの方法と思っていただけると幸いです。

[Cacheについて](#Cacheについて)
キャッシュはよりビルド時間を短縮できるよう戦略的使用方法が[弊社ドキュメント](https://circleci.com/docs/ja/caching-strategy)にて紹介されております。
こちらはストレージ日数を急激に下げると、ビルド時間に影響が出てしまいます。
データ使用量を減らしたい場合、各データの使用量を保持する価値があるかどうかコンフィグ内の`save_cache`を検討してください。 キャッシュによる開発 / コンピューティング時間の節約は、ダウンロードとアップロードのコストを上回っているかどうがご確認ください。リストアされたキャッシュの量が、保存されたキャッシュの10倍から20倍になるような状況が最適化されている目標です。

[最後に](#最後に)
ストレージ料金を下げる方法を2つ紹介させていただきました。使用していただくにあたり、実際に導入した場合の時間短縮と消去した場合のビルド時間を比較しよりお客様の納得いく方法を選んでください。Storageの有効活用方法以外にも弊社[ブログ](https://circleci.com/ja/blog/six-optimization-tips-for-your-config/)にてCIの最適化方法などを紹介しております。