WordPressオリジナルテーマをGitHub Actionsで自動デプロイする方法

WordPressオリジナルテーマをGitHub Actionsで自動デプロイする方法

目次

はじめに

WordPressサイトの運用において、テーマファイルの更新を毎回FTPで手動アップロードするのは時間がかかり、ミスも起きやすい作業です。本記事では、GitHubへのプッシュと同時に自動的にレンタルサーバーへデプロイする仕組みの構築方法を、実際の設定例を交えながら詳しく解説します。

想定環境

本記事では以下の環境を想定しています:

  • ローカル開発環境: Local (Local by Flywheel)
  • OS: Windows + VSCode
  • バージョン管理: Git + GitHub
  • レンタルサーバー: お名前ドットコム(SSH接続可能プラン)
  • デプロイ対象: WordPressオリジナルテーマ

自動デプロイの仕組み

今回構築する自動デプロイは、以下の流れで動作します:

  1. ローカル環境でテーマを開発
  2. GitHubにプッシュ
  3. GitHub Actionsが自動起動
  4. SSH経由でrsyncを実行し、サーバーにファイルを同期

この仕組みにより、FTPクライアントを起動することなく、Gitプッシュだけでデプロイが完了します。

事前準備

サーバー情報の確認

まず、お名前ドットコムのサーバーにSSH接続して、必要な情報を確認します。

# SSH接続
ssh -i {SSH鍵のパス} -p 8022 username@your-server.onamae.ne.jp

# WordPressのインストールパスを確認
find ~/ -name "wp-config.php" -type f 2>/dev/null

# テーマディレクトリのパスを確認
find ~/ -name "themes" -type d -path "*/wp-content/*" 2>/dev/null

SSHバージョンの確認

ssh -V
# 出力例: OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

SSH鍵の生成と設定

デプロイ用SSH鍵の生成

GitHub Actionsからサーバーに接続するための専用SSH鍵をローカル上で生成します。

# RSA 4096ビットで生成(互換性重視)
ssh-keygen -t rsa -b 4096 -C "github-actions-deploy" -f ~/.ssh/deploy_key -N ""

Note: Ed25519形式の方がセキュアですが、私が契約しているレンタルサーバーでは対応していなかったため、今回はRSA形式で作成します。

公開鍵をサーバーに登録

生成された公開鍵(deploy_key.pub)の内容をサーバーに登録します。

  1. レンタルサーバーコントロールパネルにログイン
  2. 左側のメニュー「サーバー」をクリック
  3. 画面中央上部の「SSH」をクリック
  4. Key 一覧の「SSH Key を追加」ボタンをクリック
  5. 「インポート」を選択し、「情報入力する」をクリック
  6. Key名とパブリックキー情報を入力し、「確認する」をクリック

接続テスト

# ローカルから秘密鍵を使って接続テスト
ssh -i ~/.ssh/deploy_key -p 8022 username@your-server.onamae.ne.jp

Gitリポジトリの設定

ディレクトリ構造

Local環境では、通常app/public配下がドキュメントルートになります。

your-local-site/
└── app/
    └── public/              ← Gitリポジトリのルート
        ├── .gitignore
        ├── wp-content/
        │   └── themes/
        │       └── your-theme/  ← オリジナルテーマ
        └── README.md

.gitignoreの設定

効率的なバージョン管理のため、必要なファイルのみを管理対象にします。

# ==================================================
# ルートディレクトリの設定
# ==================================================
/*
!/.gitignore
!README.md
!wp-content/

# ==================================================
# wp-content ディレクトリの設定
# ==================================================
wp-content/*
!wp-content/themes/
!wp-content/plugins/

# ==================================================
# テーマの設定
# ==================================================
# デフォルトテーマを除外
wp-content/themes/twenty*/

# ==================================================
# プラグインの設定
# ==================================================
wp-content/plugins/*
# カスタムプラグインがある場合はコメントアウトを解除
#!wp-content/plugins/your-custom-plugin/

# ==================================================
# 開発環境・エディタ関連
# ==================================================
# VSCode
.vscode/
*.code-workspace

# Windows
Thumbs.db
Desktop.ini

# ==================================================
# その他
# ==================================================
node_modules/
*.log
*.sql
*.sqlite
.env
.DS_Store

GitHubリポジトリとの連携(未連携の場合のみ)

# Localのテーマディレクトリに移動
cd ~/Local\ Sites/your-site/app/public

# Gitリポジトリの初期化
git init

# リモートリポジトリの追加
git remote add origin https://github.com/yourusername/your-repo.git

# 初回コミット
git add .
git commit -m "Initial commit"

# mainブランチにプッシュ
git branch -M main
git push -u origin main

GitHub Secretsの設定

GitHub Actionsから使用する機密情報を安全に管理します。

設定手順

  1. GitHubリポジトリのSettingsタブを開く
  2. 左メニューから「Secrets and variables」→「Actions」を選択
  3. 「Repository secrets」タブで「New repository secret」をクリック
  4. 以下の情報を一つずつ登録

登録する情報

NameSecret説明
SSH_PRIVATE_KEYdeploy_keyファイルの内容全体BEGIN/END行も含めてコピー
SSH_HOSTyour-server.onamae.ne.jpサーバーのホスト名
SSH_USERr999999などSSHユーザー名
SSH_PORT8022SSHポート番号
DEPLOY_PATH/home/username/public_html/domain/wp-content/themesテーマディレクトリのパス

GitHub Actions ワークフローの作成

ワークフローファイルの配置

.github/workflows/deploy.ymlを作成します。

app/public/
├── .github/
│   └── workflows/
│       └── deploy.yml
├── wp-content/
└── .gitignore

deploy.ymlの内容

name: Deploy Theme to Production

on:
  push:
    branches:
      - main
    paths:  # テーマファイルが変更された時のみ実行
      - 'wp-content/themes/**'
      - '.github/workflows/deploy.yml'
  workflow_dispatch:  # 手動実行も可能

jobs:
  deploy:
    runs-on: ubuntu-latest
    
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      
      - name: Setup SSH
        run: |
          # SSH設定
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/deploy_key
          chmod 600 ~/.ssh/deploy_key
          
          # known_hostsの設定(初回接続時の確認を回避)
          ssh-keyscan -p ${{ secrets.SSH_PORT }} -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts
      
      - name: Test SSH connection
        run: |
          echo "Testing SSH connection..."
          ssh -p ${{ secrets.SSH_PORT }} -i ~/.ssh/deploy_key \
            ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \
            "echo 'SSH connection successful'"
      
      - name: Deploy theme files
        run: |
          echo "Starting deployment to ${{ secrets.DEPLOY_PATH }}..."
          
          # rsyncでテーマファイルを同期
          rsync -avz --delete \
            --exclude='.git/' \
            --exclude='.github/' \
            --exclude='.gitignore' \
            --exclude='node_modules/' \
            --exclude='.DS_Store' \
            --exclude='Thumbs.db' \
            --exclude='*.log' \
            --exclude='*.map' \
            --exclude='.sass-cache/' \
            --exclude='README.md' \
            -e "ssh -p ${{ secrets.SSH_PORT }} -i ~/.ssh/deploy_key" \
            ./wp-content/themes/ \
            ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DEPLOY_PATH }}/
          
          echo "Deployment completed"
      
      - name: Set correct permissions
        run: |
          echo "Setting file permissions..."
          ssh -p ${{ secrets.SSH_PORT }} -i ~/.ssh/deploy_key \
            ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} \
            "find ${{ secrets.DEPLOY_PATH }} -type f -exec chmod 644 {} \; && \
             find ${{ secrets.DEPLOY_PATH }} -type d -exec chmod 755 {} \;"

rsyncオプションの説明

  • -a: アーカイブモード(権限やタイムスタンプを保持)
  • -v: 詳細な出力
  • -z: 転送時に圧縮
  • --delete: 送信元にないファイルを削除先から削除

動作確認とトラブルシューティング

手動実行でのテスト

  1. GitHubリポジトリの「Actions」タブを開く
  2. 「Deploy Theme to Production」を選択
  3. 「Run workflow」ボタンをクリック
  4. 実行ログを確認

よくあるエラーと対処法

Permission denied

# サーバー上で権限を確認
ls -la ~/.ssh/
# drwx------ (700) であることを確認

ls -la ~/.ssh/authorized_keys
# -rw------- (600) であることを確認

No such file or directory

デプロイパスが正しいか確認:

find ~/ -name "themes" -type d -path "*/wp-content/*" 2>/dev/null

Host key verification failed

known_hostsにホストが登録されていない場合に発生。ワークフロー内でssh-keyscanを実行しているか確認。

運用のベストプラクティス

ブランチ戦略

  • mainブランチ: 本番環境へ自動デプロイ
  • developブランチ: 開発用(将来的にステージング環境へ)

コミットメッセージの規則

明確なコミットメッセージで変更履歴を管理:

git commit -m "feat: カスタム投稿タイプを追加"
git commit -m "fix: モバイル表示の崩れを修正"
git commit -m "style: ヘッダーのデザインを更新"

デプロイ前のバックアップ

初回デプロイ前や大きな変更前には必ずバックアップ:

# サーバー上でバックアップ
tar -czf themes-backup-$(date +%Y%m%d).tar.gz themes/

監視と通知

GitHub Actionsの実行結果を通知する設定を追加することも可能:

- name: Slack Notification
  if: always()
  uses: 8398a7/action-slack@v3
  with:
    status: ${{ job.status }}
    webhook_url: ${{ secrets.SLACK_WEBHOOK }}

セキュリティの考慮事項

1. SSH鍵の管理

  • デプロイ専用の鍵を使用
  • 定期的な鍵の更新(3-6ヶ月ごと)
  • 秘密鍵は絶対に公開リポジトリにコミットしない

2. 最小権限の原則

可能であれば、デプロイ専用のユーザーアカウントを作成し、テーマディレクトリのみへのアクセス権限に制限。

3. GitHub Secretsの安全性

  • Repository secretsは暗号化されて保存
  • 一度設定すると値は表示されない
  • ログにも出力されない

まとめ

この自動デプロイシステムを導入することで、以下のメリットが得られます:

  • 効率化: FTP作業が不要になり、開発に集中できる
  • ミスの削減: 手動アップロードのミスがなくなる
  • 履歴管理: すべての変更がGitで管理される
  • ロールバック: 問題があればGitで簡単に前のバージョンに戻せる

初期設定には少し時間がかかりますが、一度構築すれば開発効率が大幅に向上します。特に頻繁に更新するサイトでは、その効果は絶大です。

継続的インテグレーション/継続的デプロイ(CI/CD)の導入により、より品質の高いWebサイト運用を実現できます。