現在の職場ではCircleCIを使ってCI/CDを実現しているのですが、私自身あまりこの部分を担当したことがなく、そのことについてずっと危機感を覚えていました。そんなとき、Twitter上でこんなツイートを見つけました。
CircleCI、Dockerコンテナ……ちょうど興味のある分野でした。Herokuにデプロイというのも、あまりハードルが高すぎず、私のような初心者でもとっつきやすい印象があったので、4/1(金)のイベントに参加してみました(プレゼントのボトルがほしかったというのも背景にあります笑)。
以下は、イベントに参加したときに得た知識や、抱いた感想をまとめたものになります。
Orbとは?
CircleCI Orb とは、ジョブ、コマンド、Executor などの、パラメーター化および再利用が可能な設定要素をまとめた共有可能なオープンソースパッケージです。
CircleCIを使う目的というのは、自動テストや自動デプロイを継続的に実施することで、スムーズな開発体験を実現したい、というのが背景にあると思います。そしてこれを実現するためには、CI/CDのための設定ファイルが、開発者にとって管理しやすいことも大事な要素のはずです。
一方で、CircleCIの設定ファイルであるconfig.ymlは、言ってしまえば自由に記述することができてしまいます。結果的にCI/CDが実現できていれば、チームにとっての正がそのconfig.ymlになってしまい、リファクタしたり、追記修正したりするのがちょっと怖くなってしまいますよね(自分がいじったせいで、テストやデプロイがうまくいかなくなったら怖いですよね)。だから結果的に、そのあたりが詳しい開発者が主担当となってしまって、知見の共有ができなかったり、「オレオレconfig.yml」が出来上がったりしてしまうこともあると思います。
しかしOrbを使えば、config.ymlをもっとすっきりさせることができます。考えてみれば、デプロイやテスト実行などの手順は、各プロジェクトによってそこまで差異がないはずです。そういう共通化できそうな部分をひとまとまりにして、プロジェクトを横断して利用できるようにしたものがOrbです。
私の現場ではOrbをあまり使っておらず、例えばCIに失敗したときのSlack通知用に利用しているくらいでした。ちなみに、奇しくもそのorbを追加したのは私です笑(とは言え仕組みはまったく理解していませんでした。。。)。今回もくもく会に参加してみて、orbについて入門し、今後のCI/CD環境整備に役立ててみたいというのが狙いです。
ハンズオンでHerokuに自動デプロイできるようにした
下記は、もくもく会の資料を参考に、ハンズオンで自分用に記述したものの一部抜粋です。config.ymlを覗いてみましょう。
version: 2.1
orbs:
docker_orb: circleci/docker@2.0.3
heroku_orb: circleci/heroku@1.2.6
jobs:
build-and-deploy:
executor:
name: docker_orb/machine
dlc: true
steps:
- checkout
- heroku_orb/push-docker-image:
app-name: $CIRCLE_PROJECT_REPONAME
process-types: web
- heroku_orb/release-docker-image:
app-name: $CIRCLE_PROJECT_REPONAME
上記は今回利用するheroku・dcokerのorbとjobsの記載です。
公式に行くと、各orbの内容やコマンドの詳細を確認することができます。
例えば、heroku_orb/push-docker-image
というコマンドは、
Push a Docker image to the Heroku Docker registry.
と記載があり、読んで字のごとく、HerokuのDocker registoryにイメージをプッシュしてくれるものになります。元となるコマンドソースを覗いてみると、なんだか長い処理が、、、こういう長ったらしい記述をorbだけで表現できるのは大変便利ですね。そして公式ドキュメントに沿って適切なenv情報を渡せば、あとはよしなにやってくれるわけです。
事前にCircleCIに必要なenvを登録しておきます。
これでバッチリですね。ちなみにここで一つポイント。先ほどのconfig.yml
に記載されていた$CIRCLE_PROJECT_REPONAME
の情報がありません。。。これはCircleCIで定義済みの環境変数となり、いちいち自分で設定しなくても良いものになります。これも便利ですね。定義済み環境変数についてはこちらをご確認ください。
諸々の設定に関する説明を省いて恐縮ですが、とりあえず自分の修正内容がgithubにPushしただけで、Herokuに反映されるか、確認してみましょう。
index.ejs
を少し修正してみます。
<!DOCTYPE html>
<html>
<head>
<title>
<%= title %>
</title>
<link rel='stylesheet' href='/stylesheets/style.css' />
</head>
<body>
<h1>
<%= title %>
</h1>
<p>Welcome to <%= title %>
</p>
-
+ <h3> hello hikaru !! </h3>
</body>
</html>
pushしてみましょう。
git add .
git commit -m'add my name'
git push origin HEAD
CircleCIのPipelinesを覗きにいってみましょう。
ぐるぐる回っていますね。。。
終わりました! きちんとデプロイされて、修正内容が反映されたのか、アプリを確認しましょう。
おお!きちんと反映されていました! orbを使うと非常に簡単ですね。
感想
CI/CDを秘伝のタレ化しないためにも、orbという共通化の手段をどんどん使っていくのもいいかもしれません。config.ymlの肥大化を防ぐこともできます。まずは自分たちのプロジェクトにおいてどんなorbが適用できるかを整理していくのがいいと思います。
そしてこのorbは自作することもできるそうです。こちらのもくもく会にも参加してみたいですね。
orbを使いこなして快適なCI/CDライフを楽しみたいですね!(なんだか宣伝っぽい終わり方になってしまいました。。)