CircleCI 2.0でGAE/Node.jsのプロジェクトをデプロイ

基本、ずっとTravisかWerckerを使ってたんだけど、CircleCIデビューしてみた。今年の7月にCircleCI 2.0がリリースされ、config.ymlの記法も刷新されたとかで、ググって出て来るのは1.0の記法ばかりで苦労したので、メモ代わりに残しとく。

基本は上記のブログがわかりやすい。

version: 2
jobs:
  build:
    working_directory: ~/repo
    docker:
      - image: circleci/node:8

    steps:
      - checkout
      - run:
          name: System information
          command: |
            echo "Node $(node -v)"
            echo "Yarn v$(yarn --version)"
      - run:
          name: Install dependencies
          command: yarn
      - run:
          name: Build
          command: yarn run build
      - run:
          name: Test
          command: yarn test

version: 2 で2.0でやりまっせーって宣言して、dockerイメージとか指定していく。yarn がデフォルトで入ってるらしく、GAE/Node.jsもyarnが使えるのでyarnを使っていく。

あとはrunでステップを指定していく。command|を置けば、複数行でも書ける。

      - save_cache:
          key: cache-{{ .Branch }}-{{ checksum "yarn.lock" }}
          paths:
            - ~/repo/.cache/yarn
            - ~/repo/dist
            - ~/repo/node_modules
            - ~/repo/package.json

{{ hoge }}はテンプレートで、checksum は base64でハッシュを作ってくれる。 ここではユニークなkey名を指定したくて、こんな風にしている。あとはキャッシュさせたいパス。

buildステップは終わり。

  deploy:
    working_directory: ~/repo
    docker:
      - image: google/cloud-sdk

    steps:
      - checkout
      - restore_cache:
          key: cache-{{ .Branch }}-{{ checksum "yarn.lock" }}
      - run:
          name: Deploy to Google App Engine
          command: |
            echo "$GOOGLE_AUTH" | base64 -i --decode > "$HOME/gcp-key.json"
            gcloud auth activate-service-account --key-file "$HOME/gcp-key.json"
            gcloud --quiet config set project "$GOOGLE_PROJECT_ID"
            gcloud --quiet app deploy app.yaml --version $(echo $CIRCLE_BRANCH | sed "s/\//\-/g")
          no_output_timeout: 20m

つぎに、deployステップ。gcloud app deployのコマンドでデプロイするので、gcloudが入ったdockerイメージを指定。

restore_cache で先のステップで保存しといたファイルを呼び出す。

あとはデプロイコマンド。CI上でデプロイするので権限をもったサービスアカウントを作らなければならない。

上記はCloud Functionだけど、認証の部分は同じなので真似するとよい。んで、エンコードしたものをCircleCIの環境変数として登録しておく。

$CIRCLE_BRANCHはCircleCIが設定している環境変数。ビルド番号とかもある。

あとno_output_timeoutは、GAE/Node.jsへのデプロイがくっそ遅くて、タイムアウト(デフォルト10分)になるので20分に伸ばしてる。

workflows:
  version: 2
  build_and_deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build

最後はワークフローの設定。フィルターとかでmasterブランチのときだけ実行とか、必須条件とか決めれる。便利。

参考