ロコガイド テックブログ

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの技術部ブログです。主にトクバイ・ロコナビのサービス開発について発信しています。

「地域のくらしを、かしこく、たのしく」する、株式会社ロコガイドの技術部ブログです。
主にトクバイ・ロコナビのサービス開発について発信しています。

テスト環境の自動ビルドで、アプリ開発をめちゃめちゃ楽にする!

こんにちわ。技術部でバックエンドエンジニアをしている金子です。
プログラミングとは関係のない某メーカからロコガイドに転職して早2年が経ちました。
最近、アプリ開発を加速させるために、テスト環境のCI構築を初めてやってみたので、今日はその紹介を行いたいと思います。

なぜ、必要だったのか?

今までのアプリの機能検証は、開発用アプリの向き先をAPI開発担当の個人開発環境へ変えることで行ってきました。
しかし、この方法だと複数のAPI開発が同時に進行した場合、

  • 開発用アプリでのエンドポイントを都度変える必要あり、手間
  • 複数機能の統合検証が行いにくい

などのデメリットが発生します。
これを解決するために、みんなが楽にデプロイ可能な「テスト環境」を構築してみようとチャレンジしました。

個人開発環境

本題の前に、個人開発環境についてちょっと紹介します。

ロコガイドでは、バックエンドエンジニアそれぞれに開発用のdocker環境が用意されており、以下の手順でデプロイが可能です。
※デプロイツールにはhakoを使用しています。

①ローカルでdocker imageの作成
②ECRへのpush
③ECRへpushしたイメージを使ってのデプロイ

以上の3つからなっています。

f:id:shuhei_kaneko:20190807095605p:plain
fig. 1 個人開発環境デプロイ概要図

テスト環境の構築

最終イメージとして、「あるブランチへのプッシュをトリガーにCIを動かし、デプロイしたい」と思い、ブランチ(staging)とCircleCIのワークフローを用意しました。

f:id:shuhei_kaneko:20190807095318p:plain
fig.2 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ブランチにプッシュするだけで、テスト環境へデプロイできるようになったので、元々の開発フローからかなり楽にできたかなと思います。
さらに、うれしいことにメンバーから以下のような意見もいただくことができて、やってよかったなと思いましたし  褒められて、めちゃめちゃうれしかった!

f:id:shuhei_kaneko:20190807095849p:plain

f:id:shuhei_kaneko:20190807095908p:plain

まとめ

今回、CircleCIもdockerもほとんど触ったことないところから、ワークフローを書き始めましたが、既存のワークフローがあったことや  同僚に聞ける環境があったおかげで、作成することができました。ありがとうございました。

また、CircleCIの制御方法やdockerのことやYAMLについても馴染みがあまりなかったのですがanchorの使い方など
良い学びになりました。

今後も知らない分野についてもチャレンジしていきます。