コードを更新するたびに手動でサーバーに反映するのが面倒、そんな作業をシェルスクリプトで自動化します。
基本的なデプロイスクリプト
#!/bin/bash
set -e
APP_DIR="/var/www/myapp"
BRANCH="main"
log() { echo "[$(date "+%Y-%m-%d %H:%M:%S")] $1" | tee -a /var/log/deploy.log; }
log "デプロイ開始"
cd "$APP_DIR"
git pull origin "$BRANCH"
log "コード更新: $(git log -1 --oneline)"
sudo systemctl restart myapp
log "サービス再起動完了"
sleep 3
curl -sf http://localhost:3000/health > /dev/null && log "デプロイ成功" || { log "ヘルスチェック失敗"; exit 1; }
set -e の重要性
set -e をスクリプト先頭に書くと、コマンドが失敗した時点でスクリプトを終了します。デプロイスクリプトでは途中のエラーを見逃さないために重要です。
デプロイスクリプトの改善ポイント
ロールバック機能の追加
デプロイが失敗したときに前のバージョンに戻せるようにすることは実務で非常に重要です。git pull の前に現在のコミットハッシュを変数に保存しておき、ヘルスチェック失敗時に git checkout 保存したハッシュ でコードを戻してサービスを再起動する処理を追加します。
通知機能の追加
デプロイの成功・失敗をSlackやメールに通知する機能を追加するとチームでの運用がしやすくなります。Slackへの通知は Incoming Webhook URL に curl でJSONを POST するだけで実現できます。
実行ユーザーの権限設計
デプロイスクリプトをrootで実行するのはセキュリティ上危険です。アプリ専用のデプロイユーザーを作成し、そのユーザーが必要なディレクトリへの書き込み権限と systemctl restart の sudo 権限だけを持つように /etc/sudoers で設定するのがベストプラクティスです。
デプロイスクリプトの安全なオプション一覧
| オプション | 意味 | 推奨 |
|---|---|---|
set -e | コマンド失敗で即終了 | ✅ 必須 |
set -u | 未定義変数参照でエラー | ✅ 推奨 |
set -o pipefail | パイプ途中のエラーも検知 | ✅ 推奨 |
set -x | 実行コマンドをデバッグ出力 | デバッグ時のみ |
まとめ
set -eでエラー発生時に即停止する安全なスクリプトになるset -uとset -o pipefailを合わせて使うとより堅牢になるgit pullでコードを更新しsystemctl restartでサービスを再起動する- ヘルスチェックで実際にサービスが正常動作しているか必ず確認する
- ロールバック機能・通知機能を追加することで本番運用に耐えるスクリプトになる



コメント