LoginSignup
43
26

More than 5 years have passed since last update.

CircleCI 2.0でbuild_dirを指定する

Posted at

今更ながらCircleCIを2.0にアップデートしました。
対応する機能がない部分等で若干詰まったのでメモします。

CircleCI 1.0の設定

1.0では以下のような設定でcheckoutした後のcurrent directoryを指定できました。

circle.yml

general:
  # ここで設定することでrepository内のdirectoryを指定できた
  build_dir: api

test:
  override:
    # run local unit tests
    # test_runner.pyがapi/以下にある場合でもこのまま実行できる。
    - python test_runner.py $HOME/google_appengine .

    # もし指定しない場合は毎回cdする必要があった。
    - cd api && python test_runner.py $HOME/google_appengine .

こうするとことでrepositryのルートにないプロジェクトのテストが行えました。
(逆に複数プロジェクトが含まれるケースは面倒でした)

CircleCI 2.0では、、

2.0では対応する設定はありませんでした。
working_directoryという設定がありますが、これはレポジトリのcheckout前に指定するもので、
checkoutした先のディレクトリはグローバルに設定することはできません。

上の会話にありますが、回答としては、runコマンドごとにworking_directoryを指定できるので、これで解決できる、ということです。

.circleci/config.yml

  build:
    # この設定はcheckout先の指定であって、repository内のdirectoryは指定できない
    working_directory: ~/project
    docker:
      - image: circleci/python:2.7.14-stretch-browsers
    steps:
      - checkout # ここでworking_directoryにcheckooutされる
      - run:
         name: Build the Docker Image
         command: make package
         working_directory: docker/docker-images/image1 # 各ステップでそれぞれ指定できる
      - deploy:
         name: Publish a Docker Image
         command: make publish_branch
         working_directory: docker/docker-images/image1

一つのレポジトリ内の複数のモジュールのテストを行うことなどを考えると、この方が自然かなーと思ったりするので、便利さはどちらがいいかはわからないですね。
複数モジュールの場合は環境も違う可能性があるので、複数ワークフローとかにした方が良さそうですが。。

cacheの指定など

若干面倒なのはcacheなどを保存するときに比較するfileのパスも指定しないといけないことでしょうか。

run/deployステップと同じようにrestore_cacheやsave_cacheステップにworking_directory指定をできたら書き方が統一できるんですが、残念ながら動きません。

動かない設定

以下のように書いても動かず、

config.yml
      - restore_cache:
          working_directory: api # ここのブロックには有効にならない
          key: venv-{{ checksum "requirements.txt" }}
      - run:
          name: Create venv
          working_directory: api # ここは使える
          command: |
            virtualenv venv
            . venv/bin/activate
            pip install -r requirements.txt
      - save_cache:
          working_directory: api # ここのブロックには有効にならない
          key: venv-{{ checksum "requirements.txt" }}
          paths: venv

Error computing cache key: template: cacheKey:1:8: executing "cacheKey" at : error calling checksum: open /home/circleci/project/requirements.txt: no such file or directory

と言われてしまいます。

正しい設定

正しく動かすには、以下のようにする必要があります。

config.yml
      - restore_cache:
          key: venv-{{ checksum "api/requirements.txt" }} # checksum関数に渡すときに示す。
      - run:
          name: Create venv
          working_directory: api # ここは使える
          command: |
            virtualenv venv
            . venv/bin/activate
            pip install -r requirements.txt
      - save_cache:
          key: venv-{{ checksum "api/requirements.txt" }}
          paths: api/venv # 保存するパスもきちんと示す

なんか統一感がなくて、ちょっとしっくりきませんが、キャッシュを利用すると速度がだいぶ上がるので、どんどん利用したいですね。
(他にも変数展開が部分的にできたりできなかったりjobごとにrestore先のパスを指定できなかったりには不満がありますw)

開発に依存のない部分はbaseのdocker imageで適宜アップデートする方がいいと思いますが、それはそれでメンテコストが上がりそうですね。。

43
26
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
43
26