Google App EngineにLaravel 8をGithub Actionsでデプロイする

インスタンスバージョンとLaravelのバージョンアップをしてからしばらく手動アップばっかりやってたのですが、いいかげんCICDを組まなければということで、Github Actionsで組んでみました。まだ途中ですがつまづきポイントを忘れないうちにメモしておきます。
対象読者としては手元のローカル環境でAppEngineにシンプルなPHPアプリ（Hello Worldとか）を手作業でデプロイしたことがあるくらいの方です。

# 公式の手順がなくなっている

LaravelをGoogle App Engine Standard環境で実行するには、公式？ガイドがありました

~~https://cloud.google.com/community/tutorials/run-laravel-on-appengine-standard~~

しかしいまはなくなって別ページにリダイレクトしてしまいます。

そこで、いくつかのサイトをもとにメモしていこうと思います。

# 環境変数の設定、とにかく/tmpに書き込ませる

App Engineの基本は、とにかく書き込み可能ディレクトリが/tmpのみなので、そこに各種設定を行うことです。

```app.yaml
runtime: php81
handlers:
- url: /assets
  static_dir: public/assets
（略）
- url: .*
  script: auto

env_variables:
　（略）
  APP_STORAGE: /tmp
  VIEW_COMPILED_PATH: /tmp
  APP_SERVICES_CACHE: /tmp/services.php
  APP_PACKAGES_CACHE: /tmp/packages.php
  APP_CONFIG_CACHE: /tmp/config.php
  APP_ROUTES_CACHE: /tmp/routes.php
```

なお、末尾がphpで終わるものも、事前に作成したりはしなくてだいじょうぶです。
また、bootstrap/app.phpの下から2行目にstoragePathの設定を追記します。

```php
$app->useStoragePath(env('APP_STORAGE', base_path() . '/storage')); # ここ
return $app;
```

livewireを使う場合は、そちらも変更する必要があるのですが、少し面倒です。まず最初にconfigファイルをpublishします。

```bash
$ php artisan livewire:publish --config
```

そして、適当な環境変数を用意し、以下のパスを設定します。

```yaml
LIVEWIRE_MANIFEST_PATH: /tmp/storage/bootstrap/cache/livewire-components.php
```

環境変数をconfigに書き込みます。

```config/livewire.php
'manifest_path' => env('LIVEWIRE_MANIFEST_PATH'),
```

# composerはApp Engine側でinstallしてくれるのでignoreする

Googleのデプロイ時に無視するファイルを設定できる、`.gcloudignore`というファイルがあります。ここに不要なものを設定します。いま自分が使っているサンプルです。`node_modules`もいらないの？と思われがちですが、デプロイ時にビルドして必要なファイルはpublic配下に設置しているはずなので、問題ないと思われます。これらをやらないとファイル数制限にひっかかってデプロイできない場合があります。

```
/node_modules
/storage/debugbar
/storage/framework/cache/data/*
/storage/debugbar
/storage/logs/*
/vendor/
.env
.github
.git
.gitignore
.idea
```

# Github Actionsに落とし込んでいく

本番環境はsecret.yamlを用意してリポジトリにアップし、kms出でコードしたりするのですが、開発用なので横着してGithub Secretにべちゃっと貼り付けます。

```deploy.yaml
name: Deploy

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ dev ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  deplay-staging:
    name: GAE deplay
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        name: "checkout"
      - uses: actions/setup-node@v3
        with:
          node-version: 16
        run: npm install
      - run: npm run production

      - name: Create app_dev.yaml file
        run: echo "${{ secrets.ENV_APPENGINE_YAML_DEV }}" > app_dev.yaml

      - name: Set current datetime as env variable
        env:
          TZ: 'Asia/Tokyo' # 
        run: echo "CURRENT_DATETIME=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV

      - name: Deploy an App Engine app
        id: deploy-app
        uses: google-github-actions/deploy-appengine@v0
        with:
          project_id: ${{ secrets.GCP_DEV_PROJECT_ID }}
          deliverables: app_dev.yaml
          credentials: ${{ secrets.GCP_DEV_SA_KEY }}
          version: v${{ env.CURRENT_DATETIME }}
```

ここでは、バージョン文字列にYmdHisを設定しています。ENV_APPENGINE_YAML_DEVには手元で管理してる開発用のapp.yamlを丸ごと貼り付けて、それをechoで書きだしています。Github Actionsのログにも残らないので、権限管理さえちゃんとしておけば開発メンバーにも渡すものなのでまぁよいかなと。

GCP_DEV_SA_KEYはサービスアカウントでの認証方式だったのですが、こちらdeplicatedになっているので、時間を見て新しい方法に差し替えたいと思います。

https://qiita.com/ucan-lab/items/80dbf7d31cacf8a624d1


# 参考サイト

https://qiita.com/Baisel/items/2280aefb2727d9690444

https://qiita.com/yuki2006/items/bef132274cb97d7e1c56