やりたいこと
- デプロイと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"