UPSIDER Tech Blog

レビュー効率アップ!Pull RequestごとにKotlin/KtorをCloud Runにプレビューデプロイする

こんにちは!花粉で苦しんでいる支払い.com EMの大聖寺谷です!

今回は支払い.com バックエンドチームで運用しているPull RequestごとにKotlin/KtorをCloud Runにプレビューデプロイする方法について紹介したいと思います。

🔍 背景

機能開発時、ユニットテストがokでコードレビューでも問題なし!と思ったが実際に動かしてみたら想定外の仕様漏れや不具合が見つかったということはありませんか?

また大きい機能開発の時は実際に動く環境で確認したいがローカルだとそもそもDBに必要な十分なデータが入っていなくて満足な確認ができない(用意すればいいが面倒)・・・といったこともないでしょうか?

そこで、弊チームでは GitHub Actions と Google Cloud Run を活用した自動プレビュー環境デプロイ を構築しました。この仕組みにより、PR 作成時に自動でStaging環境のDBにつながるAPIがCloud Runにデプロイされ、レビュアーが簡単に動作を確認できるようになりました。

Cloud Runのトラフィックタグ機能を利用してこれを実現しています。

🌟 Cloud Run のトラフィックタグ機能

Cloud Runにはリビジョンに対してタグをつけることができます。タグをつけることで専用のURLが発行されてCloud Runにアクセスできるようになります。 公式ドキュメントにはこの機能のユースケースは以下であるとされており、今回のユースケースにはドンピシャな機能でした👍

  1. 開発中にコンテナで統合テストを行います。
  2. ステージングにのみ使用する Google Cloud プロジェクトにコンテナをデプロイし、トラフィックを処理せずに、タグ付きリビジョンをテストします。
  3. トラフィックを処理せずに本番環境にデプロイし、本番環境でタグ付けされたリビジョンに対してテストします。
  4. タグ付きリビジョンにトラフィックを移行します。

URLは以下のようなフォーマットでサービス名(web-api-preview)とタグ名(preview-123)によって決定されます。

https://preview-123---web-api-preview-abcdef.a.run.app

この機能を使ってPull Requestごとにタグをつけることで、Pull Request単位でのCloud Runデプロイ & アクセスを実現しています。

参考: https://cloud.google.com/run/docs/rollouts-rollbacks-traffic-migration?hl=ja#tags

🔧 GitHub Actions の設定

現在プロジェクトで使っているGithub Actionsは以下のようなものになっています。

  1. Pull Request の作成または更新
    1. PR 作成または更新時に GitHub Actions が自動でトリガーされます。
  2. コンテナのビルド
    1. Jib を使用して Kotlin アプリケーションをビルドし、Artifact Registry にコンテナイメージをプッシュします。
  3. Cloud Run へのデプロイ
    1. コンテナイメージを Cloud Run にデプロイします
    2. この時 各PRごとにユニークなタグで公開します。
  4. プレビュー URL の提供
    1. デプロイが完了すると、生成された URLをPRに自動でコメントしています
    2. レビュー担当者は簡単にプレビュー環境へアクセスし、動作確認が行えます。

.github/workflows/deploy.yml

name: Deploy to Cloud Run

on:
  pull_request:
    branches:
      - 'feature/**'
      - 'fix/**'

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout code
        uses: actions/checkout@v3  # リポジトリのコードをチェックアウト

      - name: Set up JDK
        uses: actions/setup-java@v3  # Kotlin 用の JDK をセットアップ
        with:
          java-version: '17'

      - name: Build and push to Artifact Registry
        run: |
          ./gradlew clean build
          ./gradlew jib \          -Djib.to.image="asia-northeast1-docker.pkg.dev/YOUR_PROJECT_ID/YOUR_REPOSITORY/web-api-preview:${{ github.event.pull_request.number }}"

      - name: Find Comment
        uses: peter-evans/find-comment@v3
        id: fc
        with:
          issue-number: ${{ github.event.pull_request.number }}
          comment-author: github-actions[bot]
          body-includes: "Preview (backend)"

      - id: "deploy"
        uses: "google-github-actions/deploy-cloudrun@v1"
        with:
          service: "web-api-preview"
          image: "asia-northeast1-docker.pkg.dev/YOUR_PROJECT_ID/YOUR_REPOSITORY/web-api-preview:${{github.event.pull_request.number}}"
          region: asia-northeast1
          tag: preview-${{github.event.pull_request.number}}

      - name: Get datetime for now
        id: datetime
        run: echo "::set-output name=value::$(date)"
        env:
          TZ: Asia/Tokyo

      - name: Create or update comment
        uses: peter-evans/create-or-update-comment@v1
        with:
          comment-id: ${{ steps.fc.outputs.comment-id }}
          issue-number: ${{ github.event.pull_request.number }}
          body: |
            Visit the :eyes: **Preview (backend)** :eyes: for this PR (updated for commit ${{ github.event.pull_request.head.sha }}):
            <https://preview-${{github.event.pull_request.number}}---web-api-preview-abcdef.a.run.app>
            <sub>(:fire: updated at ${{ steps.datetime.outputs.value }})</sub>
          edit-mode: replace

ポイント

  • Cloud Runへのデプロイは google-github-actions/deploy-cloudrun を利用しています
    • tag: preview-${{github.event.pull_request.number}}のように指定することでデプロイ時にタグを付与することができます
  • またプレビュー用のURLは peter-evans/create-or-update-comment を使ってPullRequestにコメントしています (地味に便利です!)
    • Staging環境にデプロイされているフロントエンドアプリケーションにはlocalstorage経由でAPIエンドポイントを切り替える仕組み提供してもらっているので、それを使って実機確認を行うことができます👏

さいごに

今回は支払い.comバックエンドチームで活用しているCloud Runのプレビュー環境デプロイについて紹介しました。

コードレビューする際にちょっとこの機能は実機で動作確認しないと怖いかもなって時にも数秒で実機確認できるのでめちゃくちゃ便利です!

We Are Hiring !!

支払い.comをはじめUPSIDERでは現在積極採用をしています。 ぜひお気軽にご応募ください。

herp.careers

カジュアル面談はこちら!

https://herp.careers/v1/upsider/NZVy179O5E08 herp.careers

Culture Deckはこちら📣