Circle CI

CLI

https://circleci.com/docs/2.0/local-cli/

インストール

brew install circleci

https://circleci.com/account/api に行き、CLI 用のトークンを取得する。

次のコマンドを実行して取得したトークンを貼り付ける。

circleci setup

config.yml のバリデーション

circleci config validate

ビルトイン環境変数

https://circleci.com/docs/2.0/env-vars/#built-in-environment-variables

テンプレ

gradle

version: 2


# 各ジョブで共通の設定をまとめられる
references:
  env_config: &env_config
    docker:
      - image: "circleci/openjdk:8u181-jdk-stretch-node"
    environment:
      HTTP_PROXY: http://proxy.example.com:9999
      HTTPS_PROXY: http://proxy.example.com:9999
      GRADLE_OPTS: "-Dhttp.proxyHost=proxy.example.com -Dhttp.proxyPort=9999 -Dhttps.proxyHost=proxy.example.com -Dhttps.proxyPort=9999"
  # checksumで指定したファイルに変更があったらキャッシュを更新する
  gradle_cache: &gradle_cache gradle-{{ checksum "build.gradle" }}

jobs:
  build:
    <<: *env_config
    steps:
      - checkout
      - restore_cache:
          key: *gradle_cache
      - run:
          name: Assemble
          command: ./gradlew assemble
      - save_cache:
          paths:
            - ~/.gradle
          key: *gradle_cache

  deploy:
    <<: *env_config
    steps:
      - checkout
      - restore_cache:
          key: *gradle_cache
      - run:
          name: Store build number
          command: mkdir _hoge && echo 'hello' >> _hoge/hoge.txt
      # ジョブで生成したファイルを別のジョブから参照したいときに使う
      - persist_to_workspace:
          root: _hoge
          paths:
            - hoge

  test:
    <<: *env_config
    steps:
      - checkout
      - run:
          name: test
          command: ./gradlew test

workflows:
  version: 2

  build_and_test:
    jobs:
      - build
      - test:
          requires:
            - build
          # 特定のブランチでのみjobを動かしたいときに
          filters:
            branches:
              only:
                - master
                - develop

node.js

npm-cli-loginを使うために以下の環境変数を設定しておく必要あり。

  • NPM_NAME
  • NPM_EMAIL
  • NPM_PASS
  • NPM_REGISTRY
version: 2

# 各ジョブで共通の設定をまとめられる
references:
  env_config: &env_config
    docker:
      - image: "circleci/node:strech"
  npm_cache: &npm_cache v1-npm-deps-{{ checksum "package.json" }}

jobs:
  build:
    <<: *env_config
    steps:
      - checkout
      - restore_cache:
          key: *npm_cache
      # - run:
      #     name: Install npm-cli-login
      #     command: yarn add npm-cli-login
      - run:
          name: Install
          command: yarn
      - run:
          name: Build
          command: yarn build
      - save_cache:
          key: *npm_cache
          paths:
            - ./node_modules

  publish:
    <<: *env_config
    steps:
      - checkout
      - restore_cache:
          key: *npm_cache
      - run:
          name: Login NPM registory
          command: yarn npm-cli-login
      - run:
          name: Publish
          command: npm publish
          # command: npm --no-git-tag-version version patch && npm publish

workflows:
  version: 2
  build_and_publish:
    jobs:
      - build
      - publish:
          requires:
            - build
          filters:
            branches:
              only:
                - master

Ref: npm-cli-login

GitHub Pages にデプロイ

yarn add -D gh-pages

package.jsonにデプロイ用のスクリプトを追加する。
-dオプションでデプロイ対象のディレクトリを指定する。

{
  "scripts": {
    "deploy-pages": "gh-pages -d .out"
  }
}

CircleCI からデプロイする用の鍵を生成する。

cd ~/.ssh
ssh-keygen -t rsa -b 4096 -C "<>" -f circleci-myproject

生成した鍵はそれぞれ次のとおりに登録する。

  • 秘密鍵: CircleCI のプロジェクト設定で登録
  • 公開鍵: GitHub のプロジェクト設定で登録(書き込み権限にチェックを入れるのを忘れない)

.circleci/config.ymlを書く。以下は一例。
デプロイ前にgit configでユーザ名とパスワードを設定しておく必要がある。

version: 2

references:
  env_config: &env_config
    docker:
      - image: "circleci/node:stretch"
  npm_cache: &npm_cache v1-npm-deps-{{ checksum "yarn.lock" }}

jobs:
  build:
    <<: *env_config
    steps:
      - checkout
      - restore_cache:
          key: *npm_cache
      - run:
          name: Install
          command: yarn
      - run:
          name: Build
          command: yarn build
      - save_cache:
          key: *npm_cache
          paths:
            - ./node_modules

  publish_storybook:
    <<: *env_config
    steps:
      - checkout
      - restore_cache:
          key: *npm_cache
      - run:
          name: Git config
          command: |
            git config user.name "CircleCI"
            git config user.email "<>"
      - run:
          name: Build
          command: yarn build
      - run:
          name: Deploy
          command: yarn deploy-ghpages

workflows:
  version: 2
  build_and_publish:
    jobs:
      - build:
          filters:
            branches:
              ignore:
                - gh-pages
      - publish_storybook:
          requires:
            - build

git pushなしでCircleCIを動かす

config.ymlを直してgit pushを繰り返すとコミットログもCIログも汚れるので、
トライアンドエラーしたい場合はこの方法で試せる。

export CIRCLE_TOKEN=<CIRCLECIのトークン>
export CIRCLE_USER=hako1912
export CIRCLE_REPO=my-repository
export CIRCLE_RIVISION=<コミットリビジョン>
curl --user ${CIRCLE_TOKEN}: \
    --request POST \
    --form revision=${CIRCLE_RIVISION} \
    --form config=@.circleci/config.yml \
    --form notify=false \
    https://circleci.com/api/v1.1/project/github/${CIRCLE_USER}/${CIRCLE_REPO}/tree/master

https://circleci.com/docs/ja/2.0/examples/#section=configuration

複数イメージを指定する

テストに便利。
コマンドは最初に指定したコンテナで実行される。

jobs:
  build:
    docker:
      - image: "ubuntu:18.04"
      - image: "circleci/mysql:5.7"
    steps:
      - checkout
      - run:
          name: Install
          command: echo 'hello'