Webエンジニア hakshuの部屋

のらりくらりと綴る

今さらだけどCircleCI2.1について学んだよ

CircleCI2.1について業務でまとめたので、載せておく

そもそもCircleCIとは

そもそもCI/CDとは

  • CI: 継続的インテグレーション
    • ビルド、テストまでを自動化して、小さなサイクルで繰り返すことで、統合されたソフトウェアを迅速に開発する
  • CD: 継続的デリバリー
    • CIを含めたリリースプロセス全体の自動化を行い、素早くソフトウェアに反映し、ユーザーに価値を届ける

CircleCI用語

参考: https://circleci.com/docs/ja/2.0/concepts/#section=getting-started

  • プロジェクト
  • ステップ
    • ジョブを実行するために行うアクション。基本はコマンドの集まり
  • イメージ
    • 実行コンテナを作成するためのパッケージ
    • CircleCIが提供しているimageリスト
  • ジョブ
    • ステップの集まり
    • ジョブにはExecutor(実行環境)を宣言する必要あり
  • キャッシュ
    • ビルドを高速化するために依存関係やソースをキャッシュできる
  • ワークフロー
    • ジョブのリストと実行順序。ジョブを並列/順次/スケジュール/承認ジョブでの手動での実行 など実行方法を設定できる
  • ワークスペース
    • ワークフローに対応したストレージ
    • ジョブ固有のデータを保存して、同じワークフロー内の他のjobで使えるようにしている
  • アーティファクト
    • ワークフローが完了した後もデータを維持するストレージ  

CircleCI2.1に乗り換えたい場合

  • config.ymlのversion指定を2.1にするだけ
version: 2.1

CircleCI2.1の新機能

参考・引用: https://discuss.circleci.com/t/circleci-2-1-config-overview/26057

commands

  • 一連のstepをcommandとして定義できる
  • jobのstepで利用する
version: 2.1

commands:
  my-command:
    steps:
      - run: echo "a command is a collection of steps"
      - run: echo "this command has two steps"

jobs:
  my-job:
    steps:
      - my-command

executors

executorに指定する実行環境を定義しておける

version: 2.1

executors:
  my-executor:
    docker:
      - image: python
  my-other-executor:
    docker:
      - image: ruby

jobs:
  my-job:
    executor: my-executor
    steps:
      - run: echo "i'm using my-executor"
  my-job2:
    executor: my-other-executor
    steps:
      - run: echo "i'm using my-other-executor"

parameters

  • commands、executors、jobsで使えるパラメータを定義する。使える型は以下
    • string
    • boolean
    • steps
    • enum
  • << parameters.param-name >> で展開する
commands:
  copy-markdown:
    parameters:
      destination:
        description: destination directory
        type: string
        default: docs
    steps:
      - cp *.md << parameters.destination >>

orbs

  • jobs, executors, commandsなどをまとめる
  • orbはパッケージとして公開されているので、インポートして利用できる https://circleci.com/orbs/registry/
orbs:
  codecov: circleci/codecov-clojure@0.0.4
  my-orb:
    executors:
      default:
        docker:
          - image: circleci/ruby:1.4.2
    commands:
      dospecialthings:
        steps:
          - run: echo "We will now do special things"
    jobs:
      myjob:
        executor: default
        steps:
          - dospecialthings
          - codecov/upload:
              path: ~/tmp/results.xml

workflows:
  main:
    jobs:
      - my-orb/myjob

conditional steps

when と unless という条件分岐のためのkeyが追加

jobs:
  myjob:
    parameters:
      preinstall-foo:
        type: boolean
        default: false
    machine: true
    steps:
      - run: echo "preinstall is << parameters.preinstall-foo >>"
      - when:
          condition: << parameters.preinstall-foo >>
          steps:
            - run: echo "preinstall"
      - unless:
          condition: << parameters.preinstall-foo >>
          steps:
            - run: echo "don't preinstall"

pre-steps and post-steps

名前の通りで、jobの前後に実行するstepを定義できる

version: 2.1

orbs:
  foo: somenamespace/foo@1.2
workflows:
  build:
    jobs:
      - foo/bar:
          pre-steps:
            - run:
                command: echo "install custom dependency"
          post-steps:
            - run:
                command: echo "upload artifact to s3"

所感

  • DRYにまとめられる機能が増えてconfigの見通しが良くなった
  • orbsによって、Slack連携やパブリッククラウドへのデプロイなどがやりやすくなった、GitHubActions感