やることになった経緯
- Python で重い関数 A と重い関数 B がある
- A の結果が B の引数になっている
- CircleCI 上で A と B を実行するのだが、諸事情で A と B のジョブを分けたい
- ジョブを分けると CircleCI 上のジョブ A とジョブ B のコンテナー間でどうにか情報を連携する方法が必要
- ジョブ A の結果をファイルに書き出せば、CircleCI 上の tmp ストレージに保存して A と B 間の情報連携ができそうだった
結果をローカルファイルに保存
import pandas as pd pd.to_pickle(res, "./output/result.pkl")
to_pickle
は配列などのオブジェクトをシリアライズしてファイルに保存してくれるやつ
CircleCI の tmp ストレージに保存
steps: - checkout - run: ... - persist_to_workspace: root: ./output paths: - result.pkl
persist_to_workspace
を使ってワークフローのワークスペースに保存できる
注意点として
- tmp ストレージに保存したファイルの保存期間は 15 日間
- tmp ストレージ内のファイルは同じワークフロー内でのみ共有できる
以下のようにjob-a
とjob-b
を同一ワークフロー内で実行し、requires
を使って 2 つのジョブを同期的に実行できるようにする
workflows: version: 2 test: jobs: - job-a - job-b: requires: - job-a
tmp ストレージからファイルを取得する
steps: - checkout - attach_workspace: at: ./output - run: ...
attach_workspace
を使ってこのジョブのコンテナーにマウントする
ファイルを確認
import pandas as pd res = pd.read_pickle("./output/result.pkl") print(res)
read_pickle
を使ってファイルを取得&デシリアライズできる