CircleCI 2.0 GAリリース: 続Node.jsマルチバージョンビルド

CircleCI 2.0 GA が無事リリースされたので、betaが取れるのを待ってた方は是非どうぞ。 今の所は爆速だったbeta時代と遜色ない速度で動いてる。

circleci.com

1.0やTravis CIと比較してのCircleCI 2.0のメリットは前回記事に書いたのでご参照ください。

CircleCI 2.0 でNode.jsのマルチバージョンビルド - teppeis blog

Workflows

前回の記事curlを使った無理やりなマルチビルド並列実行を紹介したけど、当時クローズドアルファだったWorkflowsといういわゆるビルドパイプラインのようなものを組める機能が無事搭載された。

Orchestrating Workflows - CircleCI

これを使うとNode.jsのマルチバージョンビルドはこんな感じで書ける。

workflows:
  version: 2
  node-multi-build:
    jobs:
      - node-v4
      - node-v6
      - node-v8

version: 2
jobs:
  node-base: &node-base
    docker:
      - image: node
    working_directory: ~/working_directory
    steps:
      - run:
          name: Versions
          command: |
            yarn versions
            echo "npm: $(npm --version)"
      - checkout
      - restore_cache:
          keys:
            - v{{ .Environment.CIRCLE_CACHE_VERSION }}-yarn-lock-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}
            - v{{ .Environment.CIRCLE_CACHE_VERSION }}-yarn-lock-master-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}
            - v{{ .Environment.CIRCLE_CACHE_VERSION }}-yarn-cache-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}
            - v{{ .Environment.CIRCLE_CACHE_VERSION }}-yarn-cache-master-{{ .Environment.CIRCLE_JOB }}
      - run:
          name: Install dependencies
          command: yarn install
      - run:
          name: Test
          command: |
            mkdir -p $TEST_REPORTS
            yarn test
      - save_cache:
          key: v{{ .Environment.CIRCLE_CACHE_VERSION }}-yarn-lock-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}
          paths:
            - node_modules
      - save_cache:
          key: v{{ .Environment.CIRCLE_CACHE_VERSION }}-yarn-cache-{{ .Branch }}-{{ .Environment.CIRCLE_JOB }}-{{ checksum "yarn.lock" }}
          paths:
            - /usr/local/share/.cache/yarn
      - run:
          # Variables are not available in `path` or `paths`
          # https://discuss.circleci.com/t/can-i-use-variables-in-cache-paths/11393
          name: Check `yarn cache dir`
          command: |
            CACHE_DIR=$(yarn cache dir)
            echo "yarn cache dir: ${CACHE_DIR}"
            if [[ "$CACHE_DIR" != /usr/local/share/.cache/yarn* ]]; then
                exit 1
            fi

  node-v4:
    <<: *node-base
    docker:
      - image: node:4
  node-v6:
    <<: *node-base
    docker:
      - image: node:6
  node-v8:
    <<: *node-base
    docker:
      - image: node:8

サンプルプロジェクトはこちらを参照。curl用のAPIトークンが不要になってセットアップも楽になった。

github.com

プルリクはこんな感じ

その他、前回書いたpath環境変数使えない問題と、Dockerイメージのキャッシュ制御できない問題は解決していない。 Dockerイメージの方は、node:8とか書いておけばまあ実用上問題ないレベルだった。

あと、Node v8でpackage-lock.jsonを採用した場合にNode v6以下をどうするか問題にも答えが出ていない。 みんなどうしているんだろう。