CircleCI Workflow で Job間でファイルを共有する方法
私は現在CircleCIを使って自動テストの実行、検証環境のデプロイ、本番環境のデプロイを自動化しています。 babel などでビルドしたファイルをサーバーから配信する必要があり、後続のJobにビルド結果を共有する必要が出てきました。 それをCircleCIの機能を使って実現したたため記事としてまとめます。
CircleCIのWorkflow とは
CircleCI2.0から追加された機能で、以下のように設定したJobを組み合わせて処理を実行する事ができます。
設定自体はyaml形式で記述することができます
version: 2.1 jobs: test: docker: - image: circleci/node steps: - run: name: example command: | echo 'test' build: docker: - image: circleci/node steps: - run: name: example command: | echo 'build' workflows: main: jobs: - test - build
Job間のファイル共有に関して
CircleCIではファイルを共有するために以下の2つのJobが定義されています。
- persist_to_workspace: ファイルを他のJobに共有
- attach_workspace: 共有されたファイルを読み込む
version: 2.1 jobs: create: docker: - image: circleci/node steps: - run: command: | run: echo 'This is artifact' >> /tmp/tmp.txt - persist_to_workspace: root: /tmp paths: - tmp.txt echo: docker: - image: circleci/node steps: - attach_workspace: at: /tmp/workspace - run: command: | cat /tmp/tmp.txt workflows: main: jobs: - create - echo
注意点
上記のように - persist_to_workspace - attach_workspace
を利用すればファイルの共有ができますが。workflow がつながっていないとファイルの共有ができません。
例えば簡単な例ですが、以下のようなWorkflowだとdeployのJobが後で行われたとしてもbuildで生成したファイルがdeployでは共有されません。
これだとわかりやすいですが、実際に運用する場合Jobの数は10~30程度まで増えていきます。 この処理はどうせ後に行われるから共有されるだろうと考えるとハマることがあり、ファイルがないとのエラーしか表示されないため原因を調べるのに時間がかかる場合があります。 最初から後続のJobは基本的にすべてWorkflowをつないで定義しておくと良いでしょう。
まとめ
- Job間でファイルの共有をしたい場合は、
persist_to_workspace
とattach_workspace
を利用する - ファイル共有をするJobは後続のJobである必要がある
- あとで行われるJobがある場合つながるように定義すると良い