kurosame’s diary

フロントエンドが少しできます

CircleCI のコンテナー間のファイル受け渡し

やることになった経緯

  • 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-ajob-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を使ってファイルを取得&デシリアライズできる