こんにちわ。技術部でバックエンドエンジニアをしている金子です。
プログラミングとは関係のない某メーカからロコガイドに転職して早2年が経ちました。
最近、アプリ開発を加速させるために、テスト環境のCI構築
を初めてやってみたので、今日はその紹介を行いたいと思います。
なぜ、必要だったのか?
今までのアプリの機能検証は、開発用アプリの向き先をAPI開発担当の個人開発環境へ変えることで行ってきました。
しかし、この方法だと複数のAPI開発が同時に進行した場合、
- 開発用アプリでのエンドポイントを都度変える必要あり、手間
- 複数機能の統合検証が行いにくい
などのデメリットが発生します。
これを解決するために、みんなが楽にデプロイ可能な「テスト環境」を構築してみようとチャレンジしました。
個人開発環境
本題の前に、個人開発環境についてちょっと紹介します。
ロコガイドでは、バックエンドエンジニアそれぞれに開発用のdocker環境が用意されており、以下の手順でデプロイが可能です。
※デプロイツールにはhakoを使用しています。
①ローカルでdocker imageの作成
②ECRへのpush
③ECRへpushしたイメージを使ってのデプロイ
以上の3つからなっています。
テスト環境の構築
最終イメージとして、「あるブランチへのプッシュをトリガーにCIを動かし、デプロイしたい」と思い、ブランチ(staging
)とCircleCIのワークフローを用意しました。
フィルター :staging_branch_filters
まず、今回のCIは staging
ブランチのみに適用したいため、フィルターについて紹介をします。
staging_branch_filters: &staging_branch_filters filters: branches: only: - staging
通常は、正規表現にてマッチするブランチを指定することが多いようですが、今回は1つのブランチ(staging)にて
運用していくので、指定は staging
のみにしています。
YAMLのanchors/referencesを利用することですっきり書けますね。
また、各ジョブに requires
キーを指定して、依存関係を設定しています。
※各機能の詳細な設定等は公式ドキュメントをご覧ください。
ジョブ
①staging_branch_setup
まず、CIを回す上での環境設定を行うジョブを実行します。
ここの部分に関してはそれぞれの環境にて別々になるはずなので割愛させてもらいます。
②build_and_push_staging_docker_image
次に、docker imageのセットアップをするジョブを実行します。
build_and_push_staging_docker_image: <<: *container environment: <<: *default_environment steps: - *attach_workspace - setup_remote_docker: reusable: true - run: command: | $(aws ecr get-login --region ap-northeast-1 --no-include-email) docker build -t <タグ名> --build-arg ASSET_RAILS_ENV=staging --build-arg <環境変数> -f Dockerfile.staging . docker tag <タグ名> <ECRのURL>/<イメージ名>:latest docker push <ECRのURL>/<イメージ名>:latest
中身は
- docker image作成
- 作成したdocker imageへのタグ付け
- ECRへの作成したイメージのプッシュ
です。
CircleCI
はリモートのでのdocker imageをビルドする環境を用意してくれているので、
それを利用するために、setup_remote_docker
ステップを追加することがポイントです。
また、少しハマった点としてはdocker imageを作成する際には
--build-arg
で環境変数を渡せるのですが、これを複数渡したい場合はその分だけ --build-arg
を指定する必要がありました。
docker build -t <タグ名> --build-arg ASSET_RAILS_ENV=staging --build-arg <環境変数> -f Dockerfile.staging .
③deploy_staging
最後に、デプロイをするジョブを実行します。
deploy_staging: <<: *container environment: <<: *default_environment steps: - run: command: curl -X POST <デプロイジョブのURL>
ロコガイドでは元々、kuroko2というgemを使って、デプロイジョブを作成しています。それをWeb API経由でキックします。
以上で、特定のブランチのデプロイ用ワークフローを作ることができました。
結果
staging
ブランチにプッシュするだけで、テスト環境へデプロイできるようになったので、元々の開発フローからかなり楽にできたかなと思います。
さらに、うれしいことにメンバーから以下のような意見もいただくことができて、やってよかったなと思いましたし
褒められて、めちゃめちゃうれしかった!
まとめ
今回、CircleCIもdockerもほとんど触ったことないところから、ワークフローを書き始めましたが、既存のワークフローがあったことや 同僚に聞ける環境があったおかげで、作成することができました。ありがとうございました。
また、CircleCIの制御方法やdockerのことやYAMLについても馴染みがあまりなかったのですがanchorの使い方など
良い学びになりました。
今後も知らない分野についてもチャレンジしていきます。