CircleCIからCloudRunへ自動的にデプロイする


この記事は、CircleCIを使って、Google Cloud Platform(GCP)のサービスであるCloudRunへシステムをデプロイをする方法をまとめたものです。

CircleCIを使えばgithubにpushしたソースコードを自動的にテスト、ビルド、デプロイすることができます。
なおこの記事内では、githubとCircleCIの連携方法やCircleCIの利用方法については省略しています。

ポイント

・ CircleCIのCloudRun用Orbsを利用する
・ GCPに接続するための接続情報を環境変数に設定する

構成

全体のイメージはこんな感じ。

GitHubの構成はこんな感じ。
言語はGo1.13です。

github
/.circleci
  |-config.yml
/sample-app
  |-Dockerfile
  |-main.go
  |-... (他アプリソース群)

手順

  1. CircleCIのジョブ設定 (設定ファイルを作成)
  2. CircleCIからContainerRegistry、ClourRunに接続するための環境変数を設定
  3. githubに対してソースコードをpushする

CircleCIのジョブ設定

CircleCIのジョブ設定は、上記のようにgithubのリポジトリにconfig.ymlを追加するだけです。
CircleCIからCloudRunにデプロイするためのOrbsが提供されているのでそれを利用します。
今回はマネージドのCloudRunの方にデプロイするようにします。

ちなみにOrbsというのは、いわゆるライブラリのようなもので、他のymlファイルをインポートしています。
自分で書くのが難しい部分を使いやすくして提供してくれています。

下記の設定は、githubにpushされたソースコードをテスト、ビルド、デプロイする設定になっています。

config.yml
version: 2.1 # use CircleCI 2.1

orbs:
    gcp-cloud-run: circleci/[email protected]

executors:
    build:
        docker:
            - image: circleci/golang:1.13 #

jobs:
    # テスト時はgo1.13のdockerイメージを使ってgo testを実行
    test-job:
        executor:
            name: build
        steps:
            - checkout
            - run:
                name: Run unit tests
                command: | 
                    cd sample-app
                    go test -v ./...
    # デプロイ時はContainerRegistoryにビルドしたイメージを保管し、CloudRunへのデプロイを実行
    # リポジトリのDockerfileに従ってビルドされる
    # プロジェクトID test-project-hogehogeは変更する
    deploy-job:
        docker:
            - image: 'cimg/base:stable'
        steps:
            - checkout
            - run:
                command: cd sample-app
            - gcp-cloud-run/init
            - gcp-cloud-run/build:
                source: ./sample-app
                tag: 'asia.gcr.io/test-project-hogehoge/sample-app:${CIRCLE_SHA1}'
            - gcp-cloud-run/deploy:
                image: 'asia.gcr.io/test-project-hogehoge/sample-app:${CIRCLE_SHA1}'
                platform: managed
                region: asia-northeast1
                service-name: sample-app
                unauthenticated: true

#テスト用ジョブ(テストのみ)とデプロイ用ジョブ(ビルド、デプロイ)に分けて実行
workflows:
    test-and-deploy:
        jobs:
            - test-job
            - deploy-job

CircleCIの環境設定

CircleCIからGCPへ接続するためにはサービスアカウント情報が必要になります。
なのでアクセス権限を持ったサービスアカウント(のJSONキー)をGCP上で作成しておいてください。
※よくわからなければCloudBuildとCloudRunの管理者権限を付与すれば権限上は大丈夫

CircleCIでは下記を環境変数として設定することでGCPへの接続が可能になります。
・GCLOUD_SERVICE_KEY
・GOOGLE_PROJECT_ID
・GOOGLE_COMPUTE_ZONE

これらを下記のようにCircleCIプロジェクト設定画面で設定すればOK

※GCLOUD_SERVICE_KEYにはJSONキーをそのまま入れています

CloudRunの設定

CloudRun側では特に設定は必要ありません。
CircleCIが完了すれば自動的にデプロイされます。

CircleCIの実行

githubにソースコードをpushしてCircleCIを実行してみてください。
CircleCIでテストが実行され、ビルドしたコンテナイメージがCloudRunにデプロイするまでを自動的に実現することができます。

参考

https://circleci.com/orbs/registry/orb/circleci/gcp-cloud-run
https://circleci.com/docs/ja/2.0/google-auth/