WordPressサイトをGit管理し、無料レンタルサーバーに自動デプロイ
WordPressのオリジナルテーマ開発も進んで来て、そろそろGitでソースコードや変更履歴を管理したくなりました。
せっかくならレンタルサーバーに自動デプロイするまで設定することにしました。
前提条件は、以下のようにしました。
- Git、Viscodeの基本操作は省略
- シンフリーサーバー(https://www.xfree.ne.jp/)でwordpressを運用中
.gitignoreファイルの作成
WordPressでは膨大なファイルが存在しており、全てをGitの監視対象にしたりリモートにPushすると拒否される可能性が高いです。
Worpressやインストール済プラグインのアップデートがあると、都度差分が発生しコミットが大変になることも問題です。
調べてみると、基本は自作したテーマやプラグインをGit監視対象とし、それ以外のファイルは本番サイト管理画面からバックアップをエクスポートし、ローカル環境と同期させるようです。
最小限の内容で.gitignoreを作成し、都度編集していくことにします。
現在のローカル環境は、ルートにwordpressフォルダ、docker-compose.ymlファイルがあります。
ルートに.gitignoreファイルを作成します。

.gitignore
# WordPressのコアを無視
wordpress/wp-admin/
wordpress/wp-includes/
wordpress/wp-content/*
# 自作テーマとプラグインは追跡する
!wordpress/wp-content/themes/
wordpress/wp-content/themes/*
!wordpress/wp-content/themes/mytemplate/
!wordpress/wp-content/plugins/
wordpress/wp-content/plugins/*
!wordpress/wp-content/plugins/myplugin/
# WordPressルートの一部ファイルを無視
wordpress/index.php
wordpress/license.txt
wordpress/readme.html
wordpress/xmlrpc.php
wordpress/wp-*.php
# 一般的なファイル
.DS_Store
Thumbs.db
*.log
*.tmp
.idea/
.vscode/
node_modules/
vendor/
wordpress/.htaccess
なるべく下のようにシンプルに記述したかったのですが、試しにmypluginフォルダを作成し中にファイルを入れても、下記の内容では監視にあがってきませんでした。
失敗例
wordpress/wp-admin/
wordpress/wp-includes/
wordpress/wp-content/*
!wordpress/wp-content/themes/mytemplate/
!wordpress/wp-content/plugins/myplugin/
.gitignoreでは、一度ディレクトリやファイルを無視対象にすると、そのサブディレクトリやファイルも自動的に無視されるため、親ディレクトリを再帰的に無視解除してから、目的の監視対象にしたいディレクトリやフォルダを除外指定し直す必要があるようです。
リモートリポジトリにpush
ローカル環境にGitを取り込むため、Viscodeのソース管理から「リポジトリを初期化する」を実行したのち、コミット&pushします。
github actionsの設定
deploy.ymlの作成
ルートに.github/workflows/という階層でフォルダを作り、その中にdeploy.ymlを以下の内容で作成します。
/プロジェクトフォルダ/.github/workflows/deploy.yml

name: deploy to remote
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3 # v3 を使用
- name: Verify build output
run: |
ls -al ./ # 必要に応じて確認したいディレクトリを指定
- name: ssh key generate
run: |
echo "$SSH_PRIVATE_KEY" > key
chmod 600 key
env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Test SSH connection
run: |
ssh -v -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p ${{ secrets.SSH_PORT }} ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "echo Connected"
env:
SSH_USER: ${{ secrets.SSH_USER }}
SSH_HOST: ${{ secrets.SSH_HOST }}
SSH_PORT: ${{ secrets.SSH_PORT }}
- name: rsync deploy
run: |
rsync -auzrv --exclude '.htaccess' ./wordpress/ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DEPLOY_PATH }}/ -e "ssh -i key -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p ${{ secrets.SSH_PORT }}"
env:
SSH_USER: ${{ secrets.SSH_USER }}
SSH_HOST: ${{ secrets.SSH_HOST }}
DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
SSH_PORT: ${{ secrets.SSH_PORT }}
注意点は2つあります。
1つはローカルの階層をレンタルサーバーのデプロイ先にしっかり連携させることです。
私の場合「wordpress」ディレクトリを書いていなかったため、デプロイしたい階層の一階層上に展開してしまい、慌ててレンタルサーバーのバックアップ機能を実行し事なきを得ました。。
皆さんの環境に合わせて、WordPressが入っているディレクトリを繋ぐようにご注意ください。

もう1つは、普段他の案件で記述している下記部分から、「–delete」を削除することで、レンタルサーバー上に存在しているものは削除されないようにします。
このオプションは、リモートリポジトリに存在するものとレンタルサーバー上に存在するものを全く同じにするので、Git監視していないものはレンタルサーバー上から消されてしまうからです。
今後の管理については、リモートに残ってしまった不要ファイルが多くなってきた場合、手動で削除するか、必要に応じて –delete オプションを一時的に戻してクリーンアップすることも検討します。まずはこの方法でいきたいと思います。
シンフリーサーバーでSSHキーを作成
サーバーパネルへログインし、(https://secure.wpx.ne.jp/wpxapanel/login/cloudfree/server/)「SSH設定」をクリックします。
サーバー → SSH設定から、
- SSH設定: ON
- 国外アクセス制限:OFF(ONにして無事に自動デプロイが確認されたら、OFFでなくても良いかと思います。)

下方へスクロールし「公開鍵の登録・更新」から、秘密鍵をダウンロードします。
パスフレーズを設定するとエラーになるという記事を見かけたので、「設定しない」を選び、「登録して秘密鍵をダウンロードする」を押下すると、ローカルに秘密鍵がダウンロードされます。

GitHubに秘密鍵・サーバログイン情報を登録する
pushしたリポジトリのページ>Settings>Secrets and variables>Actionsから「Actions secrets and variables」へ移動し、
「New repository secret」を押下し以下の内容の5つの項目を作成します。
シンフリーサーバーのSSHアカウント情報は以下になります。
- DEPLOY_PATH : /home/サーバーID/サーバーID.cloudfree.jp(初期ドメイン)/public_html
- SSH_HOST : サーバーID.cloudfree.jp
- SSH_PORT : 10022
- SSH_PRIVATE_KEY : レンタルサーバーで作成しダウンロードした秘密鍵を開いて中身をコピー&ペースト
- SSH_USER : サーバーID

Pushして自動デプロイを実行
Git対象のファイルを追加、変更、削除などしコミット&pushします。
無事にgithub actionsが走り、サーバーに反映されているかを確認できたら成功です。