LoginSignup
0
0

More than 3 years have passed since last update.

Laravel7をGCP Google App EngineへデプロイしてDBマイグレーションしてプロモートする

Posted at

やりたいこと

  • デプロイとDBマイグレーションとプロモート(サイト公開)をコマンドで実行したい

ソース

composer.json

  • composer gcloud-deploy コマンドを登録する
  • chmod 744 gcloud-deploy.bash で実行権限を付与しておく
    "scripts": {
        "gcloud-deploy": [
            "./gcloud-deploy.bash"
        ],

gcloud-deploy.bash

  • jsonのパースにjqを使うのでインストールしておくこと
#!/bin/bash
#set -eu

# proxy実行しているかチェックする
proxyCommand="cloud_sql_proxy -instances=foo-bar-apps:asia-northeast1:foo-bar-mysql=tcp:3306"
ps auxww|grep "$proxyCommand"|grep -v grep
if [ "$?" = "1" ];then
    echo "You must run proxy to do db migrate."
    echo ""
    echo $proxyCommand
    echo ""
    exit 1
fi

npm run prod

# DBマイグレーションはlocalで実行しproxy経由でproductionに接続されるので
# 設定ファイルを.env.productionからコピーする
# 現在使用中の.envはバックアップしておく
rand=$RANDOM && cp .env .env.backup.$rand && cp .env.production .env
message=`php artisan migrate --pretend`
cp .env.backup.$rand .env

# DBマイグレーションが必要かチェックする
if [ "$message" = "Nothing to migrate." ]; then
    # DBマイグレーションが不要なら通常のデプロイ
    echo "Youd don't need to do db migrate."
    echo "Laravel artisan said: $message"
    gcloud app deploy --quiet --project=foo-bar --verbosity=info
else
    # DBマイグレーションが必要ならデプロイオプションで--no-promote(公開しない)
    echo "Youd need to do db migrate."
    echo "Laravel artisan said: $message"
    gcloud app deploy --quiet --project=foo-bar --verbosity=info --no-promote --format=json | tee gcloud-version.json

    # DBマイグレーションする
    rand=$RANDOM && cp .env .env.backup.$rand && cp .env.production .env
    php artisan migrate --force
    cp .env.backup.$rand .env

    # --promote(公開する)
    appVersion=`jq -r '.versions[0].id' gcloud-version.json`
    gcloud app deploy --promote --quiet --version=$appVersion
fi

.gcloudignore

gcloud-version.json
.env.backup.*

ほか

  • コマンドひとつで実行できるようにはなったが課題はある
    • .env.production.env.localの管理したくない
    • というか、現在使用中の.envを上書きされたくない...
  • マイグレーションの必要がないなら通常のgcloud app deployを実行したい
    • migrate --pretendを判定して分岐してみた
  • デバッグ用にdeploy.logとか出力するとsha mismatchエラーでbuildがコケた
    • .gcloudignoreに追加すると解決したような気がする
Step #0 - "fetcher": Failed to fetch gs://staging.foo-bar-hoge.appspot.com/xxxx, will no longer retry: fetching "gs://staging.foo-bar-hoge.appspot.com/xxxx" with timeout 1h0m0s to temp file "/workspace/.download/xxxx": deploy.log SHA mismatch, got "xxxx", want "xxxx"

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0