xserver で管理しているWEBサイトの場合
コマンド
VS CODEのプロジェクトからターミナルで実行させるというのをイメージしてどこかにスクリプトを格納しエイリアスで実行できるようにします。
# テスト環境にアップする dryはテスト
wpdeploy test dry
wpdeploy test
# 本番環境にアップする
wpdeploy prod dry
wpdeploy prod
.bash_profile
alias wpdeploy='sh ~/xxx/wordpress-deploy.sh'
無視ファイルの指定(rsync で無視して欲しいファイル)
.git
node_modules/
.env
*.log
storage/
.DS_Store
test.*/
stg.*/
wp-config.php
.rsyncignore
tmp
package-lock.json
*.sql.gz
.htaccess
.env.deployに環境データなどの変数
# .env.deploy
# SSH設定(~/.ssh/config の Host 名)
SSH_ALIAS=xxxxx
# サーバーアカウント
REMOTE_USER=example_user
# ドメイン
DOMAIN=example.com
# サブドメイン(テスト用)
SUBDOMAIN=test.example.com
# 転送対象のローカルディレクトリ
LOCAL_DIR=wordpress/
スクリプト
#!/bin/bash
# -------- .env ファイルの読み込み --------
ENV_FILE=".env.deploy"
if [ ! -f "$ENV_FILE" ]; then
echo "❌ $ENV_FILE が見つかりません。プロジェクトルートに作成してください。"
exit 1
fi
# export をつけて source で読み込めるように
set -a
source "$ENV_FILE"
set +a
# -------- 引数処理 --------
TARGET_ENV=$1
MODE=$2
# -------- プロジェクトルート --------
PROJECT_ROOT="$(pwd)"
# SUBDOMAINが定義されていない場合、testは使用不可
if [[ "$TARGET_ENV" = "test" && -z "$SUBDOMAIN" ]]; then
echo "❌ このプロジェクトでは 'test' 環境は定義されていません(SUBDOMAIN が未設定)"
exit 1
fi
if [[ "$TARGET_ENV" != "prod" && "$TARGET_ENV" != "test" ]]; then
echo "❌ 使用方法: $0 [prod|test] [dry|real]"
exit 1
fi
# dry-run 判定(第2引数)
case "$MODE" in
dry|test|dry-run|preview|d)
DRY_RUN="--dry-run"
echo "🧪 dry-run モードで実行(実際にはアップロードしません)"
;;
*)
DRY_RUN=""
;;
esac
echo "📦 デプロイ対象環境: $TARGET_ENV"
cd $LOCAL_DIR
# -------- 現在のブランチ確認 --------
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD)
if [[ "$CURRENT_BRANCH" != "develop" && "$CURRENT_BRANCH" != "master" ]]; then
echo "🚫 現在のブランチ '$CURRENT_BRANCH' は対象外です。'develop' または 'master' ブランチでのみ実行されます。"
exit 0
fi
echo "🌿 現在のブランチ: $CURRENT_BRANCH"
# 引数に応じて比較元ブランチを切り替える
if [[ "$TARGET_ENV" == "test" ]]; then
COMPARE_BRANCH=origin/develop
EXPECTED_BRANCH=develop
elif [[ "$TARGET_ENV" == "prod" ]]; then
COMPARE_BRANCH=origin/master
EXPECTED_BRANCH=master
else
echo "🚫 不正な環境名です。'test' または 'production' を指定してください。"
exit 1
fi
# ブランチが一致しない場合は警告
if [[ "$CURRENT_BRANCH" != "$EXPECTED_BRANCH" ]]; then
echo "🚫 '$TARGET_ENV' 環境へのデプロイは '$EXPECTED_BRANCH' ブランチからのみ実行できます。"
exit 1
fi
echo "✅ '$TARGET_ENV' 環境へのデプロイ準備OK(比較対象: $COMPARE_BRANCH )"
# -------- 差分の確認 --------
echo "🔍 '$COMPARE_BRANCH' との変更差分を取得中..."
git fetch origin "$COMPARE_BRANCH" > /dev/null 2>&1
FILES=$(git diff --name-only "$COMPARE_BRANCH...HEAD")
if [[ -z "$FILES" ]]; then
echo "✅ 差分ファイルがありません。アップロードはスキップされました。"
exit 0
fi
echo "⬆️ 差分ファイル一覧(rsyncはディレクトリ単位のため参考表示):"
echo "$FILES"
echo "📁 プロジェクトルート: $PROJECT_ROOT"
cd "$PROJECT_ROOT"
# -------- 接続先ディレクトリ --------
if [ "$TARGET_ENV" = "prod" ]; then
REMOTE_DIR="/home/$REMOTE_USER/$DOMAIN/public_html/"
else
REMOTE_DIR="/home/$REMOTE_USER/$DOMAIN/public_html/$SUBDOMAIN/"
fi
# -------- SSH接続確認 --------
echo "🔌 SSH接続をテスト中..."
if ssh -o BatchMode=yes -o ConnectTimeout=5 "$SSH_ALIAS" 'echo "✅ 接続成功"' ; then
echo "✅ SSH接続に成功しました。"
else
echo "❌ SSH接続に失敗しました。"
exit 1
fi
# -------- ファイルアップロード --------
echo "📤 ファイルをアップロード中(rsync)..."
rsync -avz $DRY_RUN --delete \
--exclude-from="./$LOCAL_DIR.rsyncignore" \
-e ssh "$LOCAL_DIR" "$SSH_ALIAS:$REMOTE_DIR"
# -------- 結果確認 --------
# echo "📁 サーバー上のファイル確認:"
# ssh "$SSH_ALIAS" "ls -l $REMOTE_DIR"
echo "✅ $TARGET_ENV 環境へのアップロード完了。"