Orbs
さて、ここまでの解説でワークフローの便利さが分かってもらえたでしょうか? ワークフローを使うと複雑なビルドの設定をパイプラインに分けて管理することができます。
しかし、問題もあります。ワークスペースまで設定した.circleci/config.ymlはかなり大きくなってしまいました。また、よく見てみるとDockerイメージの設定や依存関係のインストール方法などがそれぞれのジョブで重複しています。
docker:
- image: circleci/ruby:2.4.1-node
environment:
RAILS_ENV: test
- image: circleci/postgres:9.4.12-alpine
- restore_cache:
key: v1-rails-demo-{{ checksum "Gemfile.lock" }}
- run: bundle install --path vendor/bundle
- save_cache:
key: v1-rails-demo-{{ checksum "Gemfile.lock" }}
paths:
- vendor/bundle
これまで重複する部分を共通化しようとするとYAMLの標準機能であるアンカーなどを使うことが多かったのですが、YAMLとCircleCIの制限でどうしても限界がありました。そこで、2018年11月にOrbsという新機能が追加されました。ここではOrbsと前回紹介したConfig Ver. 2.1を使って設定を共通化する方法を学んでいきましょう。
OrbsとVer. 2.1のおさらい
前回の記事でも書いたように、CircleCI 2.0でビルド設定の柔軟性は格段に増したのですが、設定が重複して肥大化する問題がありました。そして、Ver. 2.1を使うとそれらを解決することができたのでした。
しかし、実はVer. 2.1だけでは問題の半分しか解決できていません。例えば、依存関係のインストールコマンドを共通化できても、その設定は必ずプロジェクトごとに最低一度は定義しないといけません。似たようなプロジェクトが社内に複数あった場合、結局プロジェクト単位で同じような設定の重複が発生してしまいます。もし、この共通化した部分をCircleCIの外部で管理してどのプロジェクトでも使えることができれば、CircleCIの設定をライブラリのように使うことができるようになり、とても便利です。
それを可能にするのが新機能のOrbsです。Orbsを一言で言うと、CircleCIの設定を再利用してさらにそれを自由に配布する仕組みです。
Orbsを使うと他の人が書いたCircleCIの設定を自分のプロジェクトの.circleci/config.ymlに差し込むことができ、自分で最初から書く必要がありません。また、Orbsレジストリ上で誰でも公開することができ、他のユーザーが作ったOrbを誰でも使うことができます。
補足
執筆の時点(2018年12月)ではパブリックなOrbしか作れませんが、今後は同じ組織のプロジェクトだけが参照できるプライベートなOrbsも作成できるようになる予定です。
それでは、重複部分を取り出してOrbとVer. 2.1ですっきりさせましょう。最終的な.circleci/config.ymlはこちらをご確認ください。
既存のプロジェクトでOrbsを使用するためには "Enable Build Processing" という設定をオンにする必要があります。プロジェクトの右上にあるギアのアイコンから "Advanced Setting" で設定することができます。なお、新規のプロジェクトはデフォルトで有効化されているので、この手順は必要ありません。
また、OrbsにはCircleCIが公式に認定するOrbsとそれ以外のサードパーティーOrbsがあり、後者を使うためにはさらに設定変更が必要です。左のナビゲーションバーから "SETTINGS" -> "Security" と行き "Orb Security Settings" でYesを選択します。
それではOrbsの使い方を詳しく見ていきましょう。
version: 2.1 orbs: ruby-orbs: sue445/ruby-orbs@1.3.10
- orbs:使用するOrbを宣言します。以下の命名規則に基づいています。
- ruby-orbs:参照を簡単にするためのエイリアス
- sue445:このOrbの作者
- ruby-orbs@1.3.10:このOrbの名前とバージョン
Orbsはセマンティックバージョニングを採用しています。@1.30のところがそれを表していて、この場合だとそれぞれ、メジャー1、マイナー3、パッチ30というバージョンだと分かります。Orbsを使うだけであればあまり意識する必要はありませんが、自分で作成する場合は必要な知識となるので詳しくは公式ドキュメントをご確認ください。
executors:
ruby-executor:
working_directory: ~/circleci-demo-ruby-rails
docker:
- image: circleci/ruby:2.4.1-node
environment:
RAILS_ENV: test
- image: circleci/postgres:9.4.12-alpine
この部分は前回の復習となります。Ver. v2.1のexecutorを使ってDockerイメージ周りの設定をruby-executorにまとめています。
- ruby-orbs/bundle-install:
cache_key_prefix: v1-rails-demo
それぞれのジョブを見てみると、今までbundle installを使った依存関係のインストールやキャッシュの設定が上記の2行に置き換えられていることが分かります。ruby-orbs/bundle-installと書くと最初に宣言したruby-orbsに用意されているbundle-installというコマンドを使うことができるようになります。
ruby-orbs/bundle-installは前回紹介したBuild Prpocessingの機能によりCircleCI上で実行時に展開され、キャッシュのレストアや依存関係のインストールをすべて行ってくれます。実際に実行されたビルドの設定を見てみると以下のように展開されているのが分かります。
このようにsue445/ruby-orbsを使うことで、今まで繰り返して書かないといけなかった依存関係のインストールコマンドや、頭を悩ませて考えたキャッシュキーの設定をたった2行に置き換えることができるようになりました。今回は紙面の関係でOrbsの作成方法については解説できませんが、すでに日本のユーザーの方々が素晴らしい記事を書いてくださっているのでそちらに譲らせていただきます。
- 「CircleCI Orbs 入門」(tsub's blog):Orbs作成の概要について
- 「CircleCI Orbs 入門」(生産性向上ブログ):Orbs使用法と同じく作成の概要について
- 「CircleCI orb Perfect Testing」(くりにっき):作成したOrbsのテストについて
Orbsレジストリには他にも便利がOrbsが公開されているのでぜひ見てみてください。
CI/CDとCircleCIの未来
さて、ここまで駆け足で来ましたが、CircleCIを通してのCI/CD入門連載も今回が最終回となります。本当はまだまだ書きたいことがあるのですが、それは次のためにとっておこうと思います。ここまで読んでくださりありがとうございました。
最後に筆者が考えるCI/CDとCircleCIの未来にについて書きたいと思います。この連載の最初にも書きましたが、近年のデプロイメント環境は急速に進化しています。また開発者側でもアジャイル開発のプラクティスは現場でどんどん広まっています。それらの環境を使って開発者がより早く、より安全に新機能をリリースするための橋渡しとしてCI/CDは今後さらに重要になっていくでしょう。
CircleCIもどんどん進化しています。Orbsが登場したことで、今後CircleCIはパートナーやユーザーを巻き込んでCircleCIエコシステムを構築していきます。その目的はただ一つ、より簡単にCI/CDを導入することで世界中の開発者がもっと早く素晴らしいプロダクトを開発できるよう手助けすることです。
日本でもその活動はすでに加速しています。今年の12月には日本語でのサポート開始や、ユーザー間で知見を共有するためのユーザーコミュニティも立ち上がりました。今後も継続して日本でCI/CDが広まるよう貢献していきたいと思います。
