0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

本番・テスト環境へ差分アップロード

Posted at

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 環境へのアップロード完了。"
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?