Azure PipelinesからGCP App Engineへデプロイする　Laravel編

# 概要
以下のフローを試す。
Azure Devops Repos → Azure Pipelines → Cloud Build → App Engine

App Engineでは特定のディレクトリ以外の書き込みが禁止されているためLaravelのキャッシュ生成でエラーが出てしまう。
Azure PipelinesのHosted Agentにバンドルされているgcloudコマンドにはbetaが入っていないので `--no-cache` オプションが使えなかった。
Azure Pipelines上でComposer等一通りのインストールを済ませた状態にしてCloud Buildへ投げることにした。
Hosted Agentは実行するたびに初期化されているはずなので
gcloudの認証解除は必要ない気がするけど一応やってある。
※12/12追記：secure filesという便利機能があったのでgcloud認証処理を直しました。

# GCP

## サービスアカウント作成
メニューからIAMと管理 → サービスアカウント
ここでAzure Pipelines用のサービスアカウントを作ります。
権限はプロジェクトの「編集者」にします。

json形式で鍵を出力します。

## App Engine
App EngineとApp Engine Admin APIを有効にしてください。

# Azure Pipelines

## Devops
今回はWebAppという名前で作りました。

DevopsにFile Creatorをインストールします。
https://marketplace.visualstudio.com/items?itemName=eliostruyf.build-task

## app.yaml

```yaml:app.yaml
service: laravel-test
runtime: php72
instance_class: F4
env_variables:
  APP_DEBUG: true
  APP_ENV: development
  APP_KEY: YOUR_APP_KEY
  APP_STORAGE: /tmp
  VIEW_COMPILED_PATH: /tmp
  SESSION_DRIVER: cookie
  LOG_CHANNEL: stackdriver
```

## Laravelの調整
Laravelのストレージとログの処理を多少いじる必要があるので公式ページを参考に追記します。
https://cloud.google.com/community/tutorials/run-laravel-on-appengine-standard?hl=ja

## GCPサービスアカウントの鍵ファイル(JSON)をSecure filesに登録
Pipelines → Library → Secure files

![azure_app_engine_deploy7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178991/2ebc4f25-5c64-063c-052d-de50fe564f63.png)

## ここからJobの解説

### Linux Agent

![azure_app_engine_deploy1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178991/4689d934-d15c-7e0b-af58-bc6ecfa9514c.png)

### ソース一式はAzure Devops Reposから取得

![azure_app_engine_deploy2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178991/c61f9df7-e561-9a4a-65ab-752b5264fe30.png)

### Secure filesから鍵ファイルをダウンロード（Download secure file）

Output Variablesで変数名を入れる。「gcloud」と入れました。
これでダウンロードした時のファイルパスが変数「gcloud.secureFilePath」に格納されます。

![azure_app_engine_deploy9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178991/c2bee870-8c0e-a566-b8e5-b3e43dbc3054.png)

### サービスアカウントで認証する（gcloud auth）

```sh:gcloud-auth
gcloud auth activate-service-account $(gcp_client_email) --key-file=$(gcloud.secureFilePath) --project=$(gcp_project_id)
```

### Composer installを実行（composer install）

```sh
php composer.phar install --no-dev
```

### LaravelのAPP_KEYを生成して差し替え（generate APP_KEY）

```sh

sed -i "s#YOUR_APP_KEY#$(php artisan key:generate --show --no-ansi)#" app.yaml
```

### gcloud デプロイ（gcloud App Deploy）

```sh
gcloud app deploy app.yaml -q --project=$(gcp_project_id)
```

### gcloud 認証解除（gcloud auth revoke）

```sh
gcloud auth revoke $(gcp_client_email)
```

Jobを実行して成功したらApp Engineを確認してください。
![azure_app_engine_deploy5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178991/681e2dd0-1b97-84eb-0b47-9f8bb145fdf3.png)

## Azure PipelinesからのSlack通知
Slackアプリがあるのでこれを使います。
https://docs.microsoft.com/en-us/azure/devops/pipelines/integrations/slack?view=azure-devops
ページ内の[Azure Pipelines Slack app]リンクからSlackにアプリ（Azure Pipelines）を登録します。
アプリを登録したチャネルで

```
/azpipelines subscribe [pipeline url]
```

を送信
※[pipeline url]はAzure Pipelinesで作ったCIのURL
送信するとAzure Pipelinesへの認証を求められるので
接続したいアカウントで認証して発行されたコードを入力する

has added subscription to Build completed notification for pipeline [CI Name]
というメッセージが帰ってきたら設定完了
これでAzure PipelinesでCIを実行するたびに結果が通知されます。
特に自分でコードを書く必要はありません。

![azure_app_engine_deploy6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178991/1a63ae5d-9e07-d9f2-8ca1-137626a66188.png)

## Azure PipelinesのHosted Agentにインストールされているもの
公式ページで確認できます。
https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops
このページの「Use a Microsoft-hosted agent」
確認したいImageのIncluded SoftwareのLinkを押す。