productionでHTTP serverが起動するかどうか、Heroku Release Phaseで確認する
色々あってesbuildのpluginを自作したのだが、どうしても不安なのでチェック機構を追加したshokai.icon
CIが通って、productionでのビルドが成功しても、サーバーが起動できなくてデプロイ失敗する事はありえる
実行時に必要なライブラリがdependenciesではなくdevDependenciesに入っている場合
import文での読み込みが失敗する
必要な環境変数がセットされていない場合
新機能が新たな環境変数を要求する事は、わりとよくある
デプロイ先が複数あると設定漏れがありえる
esbuildのpluginがimport pathの書き換えを失敗した場合
これもimport文の読み込みが失敗する
Cosenseのserver sideのTypeScriptコンパイルをesbuildに移行したでshokai.iconが実装したpluginが壊れてないか確認できる
デプロイ失敗すると
無惨にもH10 - App crashedになる
手動でheroku rollbackするまで、このままである
解決方法:Heroku Release Phaseでsmoke testする
指定したコマンドがstatus 0以外でexitした場合、deployは中止される
サーバーを一旦起動し、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
#!/usr/bin/env bash
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でアクセスする。
echo "Performing health check on http://localhost:$PORT/api/health"
# 10秒毎にcurlを10回繰り返し、status 200が返ってきたら起動確認完了
for i in {1..10}; do
echo "Health check attempt $i/10..."
response=$(curl --silent --max-time 10 --output /dev/null --write-out '%{http_code}' "http://localhost:$PORT/api/health")
if "$response" -eq 200 ; then
echo "✅ Health check passed with status 200."
# 結果に関わらずサーバープロセスを終了させる
kill -TERM $SERVER_PID
exit 0
fi
# 最後の試行でない場合は10秒待機
if $i -lt 10 ; then
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
デプロイされない