GitHub Actionsを使うとCloud Runへのデリバリが最高に捗るぞ🚀

GitHub Actions使ってますか？ 最高に便利ですね、CI/CDが捗ります。
GCPのCloud Runも便利ですね。GAEも良いですがCloud Runも最高です。

さて、この記事ではGitHub Actionsを使って、GCPのCloud Runにデプロイする方法を紹介します。

## ユースケース

シンプルなユースケースとして、masterブランチにpushするとActionsが動いて、コンテナがCloud Runにデプロイされるようなデリバリを例に扱います。

流れはこんな感じです。

1. masterブランチへのpushをトリガーにActionsが発火
1. リポジトリをチェックアウトする
1. Google Cloud SDKをセットアップする(SDKにgcloudが含まれる)
1. gcloudをDocker認証ヘルパーとして設定
1. DockerイメージをBuildする
1. Google Container Registryにイメージをpushする
1. Cloud Runにデプロイする

このワークフローを動かすためには**事前準備が必要**ですが、先にymlを見ておきましょう。IMAGE環境変数は適宜変更してください。

```yaml:.github/workflows/delivery.yml
name: Delivery

on: 
  push:
    branches:
      - master

env:
  GCP_PROJECT: ${{ secrets.GCP_PROJECT }}
  GCP_REGION: ${{ secrets.GCP_REGION }}
  IMAGE: asia.gcr.io/${{ secrets.GCP_PROJECT }}/foobar:${{ github.sha }}

jobs:
  delivery:

    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout the repository
        uses: actions/checkout@v1

      - name: GCP Authenticate
        uses: GoogleCloudPlatform/github-actions/setup-gcloud@master
        with:
          version: '273.0.0'
          service_account_email: ${{ secrets.GCP_SA_EMAIL }}
          service_account_key: ${{ secrets.GCP_SA_KEY }}

      - name: Configure docker to use the gcloud cli
        run: gcloud auth configure-docker --quiet

      - name: Build a docker image
        run: docker build . -t $IMAGE

      - name: Push the docker image
        run: docker push $IMAGE

      - name: Deploy to Cloud Run
        run: |
            gcloud run deploy foobar \
              --image $IMAGE \
              --project $GCP_PROJECT \
              --region $GCP_REGION \
              --platform managed \
              --quiet
```


ちなみに、gcloudを使うための方法として、以前は[Github公式のActions](https://github.com/actions/gcloud)も提供されていましたが現在は**Deprecated**です。

[GCP公式のActions](https://github.com/GoogleCloudPlatform/github-actions/tree/master/setup-gcloud)が**推奨されています**のでそちらを使いましょう。


## 事前準備

このデプロイフローを動かすためには、事前準備が必要です。

### GCPでやること

* [Cloud Run API を有効にしておく](https://cloud.google.com/run/docs/setup?hl=ja)
* [GitHubActions用のサービスアカウントを発行する](https://cloud.google.com/iam/docs/creating-managing-service-accounts?hl=ja)
* [サービスアカウントのキーを発行する](https://cloud.google.com/iam/docs/creating-managing-service-account-keys?hl=ja)
* サービスアカウントに、GCRとCloud Runに対する権限を付与する
 * [このリンク](https://cloud.google.com/run/docs/reference/iam/roles#additional-configuration)を参考に、roles/run.admin(Cloud Run管理者)を元に以下権限を付与したカスタム権限を作るのが簡単です。（が、できるだけ最小権限で管理することをオススメします）
   * iam.serviceAccounts.actAs
   * storage.buckets.get
   * storage.objects.create

### GitHubでやること

* [GitHub Secrets に Actionsで使う変数を設定する](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets)
  * 
このworkflowではSecretsに以下を設定しています。GCP側で行った内容を反映させましょう。
      * GCP_PROJECT (GCPプロジェクトID)
      * GCP_REGION (リージョン)
      * GCP_SA_EMAIL (サービスアカウント メールアドレス)
      * GCP_SA_KEY (サービスアカウントキー)

## 実行する

あとは、上記ymlをリポジトリに含めてmasterブランチにpushしてみましょう。

うまくいくとこんな感じになります。**めっちゃ捗るわー🚀**

<img width="1080" alt="スクリーンショット 2019-12-25 15.03.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18114/c4502b60-8da6-732b-817c-65c1825dcf1d.png">