CircleCI

CircleCI勉強会

これは?

  • 社内勉強会用の資料です

CircleCI 2.0

  • 2.0が2017-07-11にリリース
  • Dockerコンテナ上で実行
    • 予め環境を作っておける
  • 1.0はちゃんと使ったことがありません

CircleCIで解決したこと

  • テスト
  • AMIの生成

CircleCIを設定する

  • Webページでプロジェクトを追加
  • 環境変数等を設定
  • YAMLファイルを実装
  • Dockerイメージの用意
  • commit & push

環境変数等を設定

Webから以下のような設定が可能

  • Environment Variables
    環境変数の設定

  • AWS Permissions
    ジョブ実行時に ~/.aws/credentials が設定される

  • Chat Notifications
    Slackの連携はここ

ほかはヘルプを参照


YAMLファイルを実装


Workflow

  • ジョブの実行順序を定義したもの
  • ビルドの実行フェーズを分割できる
  • 実行フェーズごとにジョブの成功・失敗を把握しやすい
  • 並列実行や条件による実行ができる

Dockerイメージの用意

  • DockerHubで公開されているイメージが使える
  • プライベートなライブラリ等はジョブ実行時にセットアップする

ローカルでの開発


CLIの制約

  • Workflowは使えない
  • 設定画面で行える設定(AWS Permissionsなどなど)が使えない

Tips


.netrcを使ったclone

  • .netrcにGitHubのトークンを記述してHTTPSでcloneする
  • ターゲットリポジトリ以外のリポジトリを使うときに有効

shallow clone

  • CI環境に歴史はいらない
  • リポジトリのサイズが大きいときに有効

git clone --depth=1


すでに存在する環境変数を設定(PATH等)

    docker:
      - image: <image>
        environment:
          BASH_ENV: ~/.bashrc
    run:
      name: set path
      command: |
        echo 'export PATH=/path/to/script:${PATH}' > ~/.bashrc

アンカーとエイリアスを活用する

  • 見通しを良くする
  • DRYに書く
  container_config: &container_config
    docker:
      - image: ubuntu
        environment:
          API_ENDPOINT: https://circleci.com/api/v1.1/

  branch_config: &branch_config
    branches:
      only:
        - master
        - develop
...
jobs:
  build:
    <<: *container_config
    <<: *branch_config

Pitfalls


CLIのValidateに頼らない

  • 文法のチェックだけしかしない
  • 以下の例ですべてValidationは通る

YAMLの結果が正しくない例

jobs:
  build:
    steps:
    - run:
      name: hello
      command: echo hoge
{
  "jobs": {
    "build": {
      "steps": [
        {
          "run": null, 
          "command": "echo hoge", 
          "name": "hello"
        }
      ]
    }
  }
}

YAMLの結果は正しくない例

run以下をインデント

jobs:
  build:
    steps:
      - run:
        name: hello
        command: echo hoge
{
  "jobs": {
    "build": {
      "steps": [
        {
          "run": null, 
          "command": "echo hoge", 
          "name": "hello"
        }
      ]
    }
  }
}

正しく動作する例

namecommandをインデント

jobs:
  build:
    steps:
      - run:
          name: hello
          command: echo hoge
{
  "jobs": {
    "build": {
      "steps": [
        {
          "run": {
            "command": "echo hoge", 
            "name": "hello"
          }
        }
      ]
    }
  }
}

Dockerイメージの更新の影響

  • latestなイメージは変更される可能性がある
  • CIビルドが走るのはDockerイメージの更新時ではなく、コードのpush時なので気づきにくい

AWS Permissionsにはリージョンがない

  • 設定画面から追加できるのはアクセスキーIDとシークレットアクセスキーのみ
  • リージョンは直接ファイルに書き出す
command: |
  mkdir ~/.aws
  echo -e "[default]\nregion = ap-northeast-1" > ~/.aws/config
  chmod 0600 ~/.aws/config