今さらだけどCircleCI2.1について学んだよ
CircleCI2.1について業務でまとめたので、載せておく
そもそもCircleCIとは
- CI/CDのSaas
そもそも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感