CircleCIでビルド、テスト、デプロイ(SSH)の自動化を実現する

以前纏めていたCircleCIのconfig.ymlの場所を失念してしまい、見つけるのに少し時間がかかってしまった為、これを機にブログ化しておくことにしました。

CircleCIについて概要を説明すると、ビルド・テスト・デプロイが行えるSaas型のCI/CDサービスです。

Dockerで動作するDrone.ioConcourseも検討しましたが、結局メンテナンスや使い勝手が楽なCircleCIを使っています。

CircleCIについては、有名且つ各所に色々な情報があるため割愛します。

ということで、今回のブログ化は主にCircleCIの.circleci/config.ymlの内容に絞ります
また.circleci/config.ymlは、AWS EC2などを想定したSSH経由でのデプロイとします。

.circleci/config.yml(全体)

早速ですが、.circleci/config.yml(全体)です。

冒頭の通り、CircleCIのログインやプロジェクト設定など詳細は割愛します。
お手数ですが、たくさん情報があるため別途調べてみてください。

デプロイ先の環境によっては概ねコピー&ペーストで使用できますが、主にjobs: の内容(build, test, deploy)などは環境によって変更ください。

pwdコマンドやls -laコマンドを挟み、CircleCI上で実行ログを見た際にある程度分かりやすいようにしています。

行別の詳細は後述します。

.circleci/config.yml(行別の説明)

1〜2行目(version:)

本ブログ執筆時の最新バージョンは2.1です。

今回の.circleci/config.ymlで使用しているcommands:、parameters:、executors:はバージョン2.1でしか使用できません

《参考》CircleCI 構成リファレンス
https://circleci.com/docs/ja/2.0/configuration-reference/

4〜11行目(executors:)

deploy-environment: で、デプロイ時に使用する環境を定義しています。

ステージング環境と本番環境にデプロイする際に行う処理は同じため、共通化しています。

13〜102行目(commands:

ファンクションのようなもので、何度も使用する一連の処理をコマンドとして定義しています。

parameters: では、受け取る値を型制御も含めて定義しています。

104〜120行目(job: > build:)

stepsに沿って上から順にビルド処理を行います。

stepsの内容は環境によって異なるため適宜変更が必要です。
合わせてdockerで使用するimageも環境によって異なってきます。

121〜130行目(job: > test:)

stepsに沿って上から順にテストを行います。

stepsの内容は環境によって異なるため適宜変更が必要です。

テスト項目がない場合は、test: 自体config.ymlに記述する必要はありません。
(記述しない場合はworkflows: の内容も修正が必要です)

131〜152行目(job: > deploy-xxxxx:)

ステージング環境と本番環境の2つがある場合を想定しています。

workflows: の内容に沿ってステージング環境のみデプロイ、本番環境のみデプロイが行えます。

commad: で定義していたssh-deploy-command: を呼び出して処理を行っています。

ssh_key_fingerprintには、CircleCIの該当プロジェクトの「Project Settings」画面→「SSH Keys」画面で登録したSSH Keyのフィンガープリントの値を記述します。

ssh_host、ssh_user、ssh_port、app_env、deploy_dirは環境によって変更が必要です。

config.ymlに直接記述でも良いですが、CircleCIを使う上でGit管理が前提のため(フィンガープリントを使用してのSSH接続と言えども)セキュリティ上はCircleCIの該当プロジェクトの「Project Settings」画面→「Environment Variables」画面にて変数及び値を登録した上で、変数名をconfig.ymlに記述しての使用が望ましいです。

変数名を使用した場合は、下記のような記述になります。
ssh_key_fingerprintも変数化できると思います。

154〜187行目(workflows:)

全てのジョブのオーケストレーションです。

workflows: の内容に沿って各ジョブが実行されます。

今回のconfig.ymlの内容では、下記の順番でビルド、テスト、デプロイが自動実行されます。

  1. stagingまたはmasterのGitリモートブランチにプッシュされる。
  2. build: が実行される。
  3. test: が実行される。
  4. stagingのGitリモートブランチにプッシュされた場合はdeploy-staging: が実行される。
    masterのGitリモートブランチにプッシュされた場合はdeploy-production: が実行される。

まとめ

SSH経由ではなくFirebaseにデプロイしたいなど様々あると思いますが、今回はAWS EC2などを想定したSSH経由でのデプロイを前提とした、.circleci/config.ymlのご紹介でした。

(ブログ執筆時では).circleci/config.ymlの最新バージョンである2.1でしか使用できないキー(commands, parameters, executors)をいくつか盛り込んでみました。

CI/CDは一度設定を書いてしまえば以降はビルド、テスト、デプロイを自動で行ってくれるため、ミス軽減や工数削減、何より本番環境へのデプロイ時の精神的な負担を和らげてくれる素晴らしいものです。

中でもCircleCIはSaaS型のため、誰でも簡単に使用できるので一度是非使ってみてください。
メルカリでも使われているようです。

コメントを残す

メールアドレスが公開されることはありません。

ABOUTこの記事をかいた人

高原 徹也

大手通信キャリアを経て、大ヒットスマートフォンアプリ開発を手がける企業で多数の開発プロジェクトに携わった後、起業。 起業後も様々な開発プロジェクトに携わり、開発を通じて会社を大きく成長させ、今ではASP会社、メディア運用会社を子会社で持ち、シンガポール法人でWEBメディア会社を経営、M&Aを手がける起業家として活動中。