productionでHTTP serverが起動するかどうか、Heroku Release Phaseで確認する
色々あってesbuildのpluginを自作したのだが、どうしても不安なのでチェック機構を追加したshokai.icon CIが通って、productionでのビルドが成功しても、サーバーが起動できなくてデプロイ失敗する事はありえる
import文での読み込みが失敗する
新機能が新たな環境変数を要求する事は、わりとよくある
デプロイ先が複数あると設定漏れがありえる
esbuildのpluginがimport pathの書き換えを失敗した場合 デプロイ失敗すると
サーバーを一旦起動し、healthcheck用APIのGET /api/healthにアクセスして、status 200が返る事を確認する 実装
code:Procfile
release: bash test/release-smoke-test.sh
web: npm start
code:test/release-smoke-test.sh
set -eo pipefail # エラーが発生したら即座に終了
echo "--- Starting Release Phase Smoke Test ---"
echo "Attempting to boot the application..."
npm start &
SERVER_PID=$!
sleep 15
# プロセスがまだ実行中か確認。起動時にクラッシュした場合、PIDは存在しない。
if ! kill -0 $SERVER_PID > /dev/null 2>&1; then
echo "🔴 Server process failed to start or crashed immediately."
exit 1
fi
# HOSTとPORTはリリースdynoの環境で利用可能。
# Herokuのone-off dynoではPORTが動的に割り当てられるため、localhost:$PORTでアクセスする。
# 10秒毎にcurlを10回繰り返し、status 200が返ってきたら起動確認完了
for i in {1..10}; do
echo "Health check attempt $i/10..."
echo "✅ Health check passed with status 200."
# 結果に関わらずサーバープロセスを終了させる
kill -TERM $SERVER_PID
exit 0
fi
# 最後の試行でない場合は10秒待機
sleep 10
fi
done
echo "🔴 Health check failed after 10 attempts. Last status: $response"
kill -TERM $SERVER_PID
exit 1
動作確認
例えば、esbuildの自作pluginにわざとbugを仕込んで、import文のpath修正に失敗させた場合
https://scrapbox.io/files/687c86398a549dcfc0e5247c.png
app serverがファイルをrequireできなくて起動に失敗し、status 200が返らなくなって、release phaseのsmoke testが失敗する
https://scrapbox.io/files/687c863ac308f010437dcfd2.png
デプロイされない