リポジトリに含めたくないYAMLなどのデータをCircleCIに登録したいこと、ありませんか?
提供されている手段を素直に使おうとした場合の問題点
- SSH Permissions は秘密鍵の形式でなければ登録できない。
- Environment variables の value は連続の空白文字が1つの半角スペースに変換されてしまう。YAMLやCSVなどの改行に意味のあるデータは壊れてしまうし、JSONなどの改行自体に意味のないデータもstring内のスペースの扱いが変わってしまいデータが改変されてしまう可能性がある。
どうするか?
Base64エンコードした文字列をCircleCIの Environment variables に登録する。参照する時はBase64でデコードする。
1. ローカルで登録したいファイルをBase64エンコードする
cat example.yml | base64
2. 出力された文字列を CircleCIの Environment variables に登録する。
3. CircleCIのdependenciesなど適当なタスクで登録した環境変数をBase64デコードする。
echo $EXAMPLE_YAML | base64 --decode > example.yml
環境変数のvalueに登録可能なデータサイズの上限は?
実際に CircleCI 上で Environment variables の value に登録できるデータサイズの上限を調べてみた。
調査方法
何度かの試行で次のことが分かった。大きなサイズのデータを持つ環境変数を一定数以上作ると、 Exporting env vars from project settings のタスクで Argument list too long Action failed: Exporting env vars from project settings
というエラーが出力され、以降のタスクがキャンセルされるということだ。そこで、環境変数に登録するvalueのサイズを変えつつ、そのサイズの変数が何個設定可能かを調べた。
結果
KB/value | 登録可能な環境変数の最大数 |
---|---|
10 | 13 |
20 | 6 |
30 | 4 |
40 | 3 |
50 | 2 |
60 | 2 |
70 | 1 |
80 | 1 |
90 | 1 |
100 | 1 |
110 | 1 |
120 | 1 |
130 | 1 |
140 | 0 |
考察
valueの合計が大体130KBくらいまでなら登録が可能なことが分かった。Base64へのエンコードでデータ量が4/3になることから逆算すると97.5KBのデータが登録できることになる。よほど巨大なデータでない限りこの枠に収まるだろう。
エラー内容と value のサイズに対して登録可能な環境変数の最大数が変動することから、Environment variables で登録した全てのkey-valueを展開しつつビルドが実行されるコンテナ内で一度にexportしていると想像している。
リポジトリやCI
当エントリに記載したコードをCircleCIでテストしている。
- GitHub minodisk/circleci-huge-env: circle.ymlのdependenciesで環境変数をBase64デコードし、testで元のファイルとdiffをとって比較している。
- CircleCI minodisk/circleci-huge-env: Retriedは上記の表を書くための試行の跡...
元ネタ
Pushing to Google Container Registry from CircleCI を読んでこの手法について知った。該当のエントリにおけるコンテキストはこの手法についてではないのだが、方法がないか模索していた事柄だったので調査と共にエントリにした。