decochのブログ

フリーランスのiOSエンジニア decoch のブログです

CircleCI Workflow で Job間でファイルを共有する方法

私は現在CircleCIを使って自動テストの実行、検証環境のデプロイ、本番環境のデプロイを自動化しています。 babel などでビルドしたファイルをサーバーから配信する必要があり、後続のJobにビルド結果を共有する必要が出てきました。 それをCircleCIの機能を使って実現したたため記事としてまとめます。

CircleCIのWorkflow とは

CircleCI2.0から追加された機能で、以下のように設定したJobを組み合わせて処理を実行する事ができます。

f:id:decoch:20181222131915p:plain
workflow

設定自体は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では共有されません。

f:id:decoch:20181222134214p:plain
workflow-test

これだとわかりやすいですが、実際に運用する場合Jobの数は10~30程度まで増えていきます。 この処理はどうせ後に行われるから共有されるだろうと考えるとハマることがあり、ファイルがないとのエラーしか表示されないため原因を調べるのに時間がかかる場合があります。 最初から後続のJobは基本的にすべてWorkflowをつないで定義しておくと良いでしょう。

まとめ

  • Job間でファイルの共有をしたい場合は、persist_to_workspaceattach_workspace を利用する
  • ファイル共有をするJobは後続のJobである必要がある
  • あとで行われるJobがある場合つながるように定義すると良い