こんにちは。那須野です。
生成AIがものすごい勢いで進化して、AI製の文章であふれる中で、人が書く意味を問われるようになってきました。
人が書くのだとしても、多くの人がXやnoteで長文を書くようになったこの時代、WordPressでブログを運営することのメリットは何なのかも考える必要が出てきました。
でも私の答えはシンプル。そういった時代になってきたからこそ、なおさら自分でサーバーを触れること、自分で文章を考えて書けることは人間として特異な能力になっていくので、鍛えることの価値がどんどん高まっていくのではないかと感じます。
ということで少し脱線しましたが、とある件でWordPressテーマをGitHub経由で管理・更新したくなりまして、かなり久しぶりだったのでせっかくなので作業手順をまとめておこうと思います。
WordPressでオリジナルテーマを運用する場合、PHPなどでテーマファイルを作成し、それをサーバーのテーマフォルダに格納することでサイトに反映できます。
実際のところ、多くの方はテーマファイルの作成をVisual Studio Codeなどローカルの開発ツールで行い、ファイルの格納はWinSCPなどのFTPクライアントを利用してドラッグ&ドロップで反映する手動更新をするケースだと思います。
これは、もちろん今動けばよいだけのサイトであればこれでも全然良いですが、例えば
などを実現したいとしたら、この手動更新ではなかなかに骨の折れる作業になるでしょう。
こういったケースでコードをしっかり管理したい場合は、やはりGitHubを使うのが常套手段です。GitHubは、プログラミングコードをWeb上で管理・共有できるサービスで、一定以内の利用であれば無料で使うこともできます。
GitHubの使い方としては、もちろんサーバー反映とは別にGitHubにCOMMITして記録だけ残すこともできますが、これでは本番反映したがGitHubが更新されていないとか、GitHubに反映したがサーバー反映されていないなどの漏れが出てきます。これだとイマイチですよね。
やはり、やるならGitHubに反映したらサーバーにも自動反映されるような一方向の運用であれば、漏れがなくなって理想的です。
具体的な作業としては、ローカルで開発→LocalやXAMPPによってローカルのdev環境で確認→GitHubのdevリポジトリにPUSH→stgリポジトリへのプルリク→stgリポジトリにマージ→stg環境で確認→mainにプルリク→mainにマージ→本番環境に反映という流れですね。
GitHubではアクション機能(GitHub Actions)を使うことで、リポジトリにマージされた内容(追加・編集・削除)をサーバーにあるWordPressのテーマフォルダに自動反映することができるので、今回はこれを使って設定していきます。
ちなみに自分の場合、作業する環境は以下のとおりです。
この環境では、すでにバーチャルホストを設定して複数のサイトを運用しており、/var/www/html/{YOUR_DOMAIN}ディレクトリにてサイトコンテンツを管理して、Let's EncriptのSSL証明書発行をcertbotで自動更新設定しているものとします。
それでは、具体的な手順をまとめていきましょう。
大きな流れとしては、①Gitのインストール→②GitHubリポジトリの作成→③Gitローカル作業フォルダの準備→④SSH鍵の作成→⑤サーバー側のデプロイユーザーの作成→⑥GitHubのEnvironments設定→⑦ワークフローファイルの作成→⑧GitHubへのPUSH、という手順で進めます。
一連の運用をPCで行うには、PCにGitをインストールしている必要があります。Windowsの場合はGit for Windowsになるので、もしまだの場合は公式サイトからダウンロードのうえ、インストールしておきましょう。
ソフトとしては、コマンドラインツールであるGit BASHと、GUIで操作できるGit GUI、その他ソフトがインストールされますが、この記事ではGit BASHの方を使っていくことにします。
初めて使う場合は、Git BASHにてユーザー情報だけは登録しておきます。
|
1 2 |
git config --global user.name "{YOUR_NAME}" git config --global user.email "{YOUR_EMAIL}" |
今回のプロジェクトを管理するリポジトリを立てていない場合は、GitHubにてリポジトリを新規作成します。
デフォルトのブランチ名は、今回は特に明確な意図があるわけではないので、mainのままで行きます。
Gitのローカン作業フォルダの準備は、GitHubリポジトリにすでにファイルがあるかどうかで作業が変わってきます。
GitHubリポジトリがまっさらな状態から始まる場合、今ある作業フォルダにoriginを設定するだけでよいです。
|
1 2 3 4 5 |
# 今ある作業フォルダにoriginだけ設定 cd "{THEME_DIRECTORY}" git init git remote add origin https://github.com/{USER_NAME}/{RIPOSITORY_NAME}.git git status |
一方、すでにGitHubリポジトリに何らかのファイルが反映されている場合、コンフリクトを防ぐため、GitHubリポジトリのコードを正としてローカルにコードをPULLしてくることで同期させます。
|
1 2 3 4 5 6 7 |
# 今のローカルファイルを退避 mv "{THEME_DIRECTORY}" "{THEME_DIRECTORY}_old" # GitHubリポジトリから作業フォルダを作成 git clone -b dev https://github.com/{USER_NAME}/{RIPOSITORY_NAME}.git "{THEME_DIRECTORY}" cd "{THEME_DIRECTORY}" git status |
これで、Gitのローカルの作業フォルダを準備できました。
サーバー側のデプロイユーザーのためのSSH鍵(’秘密鍵と公開鍵のセット)を作ります。秘密鍵をGitHub側に登録し、公開鍵をサーバー側に登録することで、GitHub側がサーバー側にアクセスしたときに鍵を照合して認証が通るようにするためです。環境ごとに鍵は分けたいので、本番用とステージング用で別の鍵を作ります
なお、鍵を作る際にキーフレーズを聞かれますが、キーフレーズを入力するとGitHubからの自動アクセス時に失敗するので、何も登録せずENTERで先に進みましょう。
|
1 2 |
ssh-keygen -t ed25519 -C "{SITE_NAME}_stg" -f {SITE_NAME}_stg ssh-keygen -t ed25519 -C "{SITE_NAME}_prod" -f {SITE_NAME}_prod |
続いて、GitHubリポジトリが更新されたときにその差分内容をサーバーに反映するデプロイユーザーを、サーバー側で作成します。
今回は、本番環境のサイトを{YOUR_DOMAIN}で作り、ステージング環境のサイトをstg.{YOUR_DOMAIN}で作るのですが、デプロイユーザーは共通にしつつ、最低限のセキュリティを担保したいので鍵はそれぞれ別に登録します。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# ユーザー作成 sudo adduser {DEPLOY_USER_NAME} sudo usermod -aG apache {DEPLOY_USER_NAME} # ディレクトリ権限設定 sudo chown -R {DEPLOY_USER_NAME}:apache /var/www/html/{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} sudo chown -R {DEPLOY_USER_NAME}:apache /var/www/html/stg.{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} sudo chmod -R g+rwX /var/www/html/{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} sudo chmod -R g+rwX /var/www/html/stg.{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} # 権限が適切に反映されたことを確認 id {DEPLOY_USER_NAME} ls -ld /var/www/html/{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} ls -ld /var/www/html/stg.{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} # 公開鍵の配置 mkdir -p /home/{DEPLOY_USER_NAME}/.ssh chmod 700 /home/{DEPLOY_USER_NAME}/.ssh touch /home/{DEPLOY_USER_NAME}/.ssh/authorized_keys chmod 600 /home/{DEPLOY_USER_NAME}/.ssh/authorized_keys chown -R {DEPLOY_USER_NAME}:{DEPLOY_USER_NAME} /home/{DEPLOY_USER_NAME}/.ssh |
続いて、公開鍵を追記します。
|
1 2 |
# 公開鍵の追記 vim /home/{DEPLOY_USER_NAME}/.ssh/authorized_keys |
中身は、本番用とステージング用に作った2つの公開鍵に改行を入れて登録するわけですが、悪用されないよう最低限の縛りを入れます。以下のようなイメージです。
|
1 2 |
no-port-forwarding,no-agent-forwarding,no-X11-forwarding {PUBLIC_KEY_FOR_STG} no-port-forwarding,no-agent-forwarding,no-X11-forwarding {PUBLIC_KEY_FOR_PROD} |
ちなみに、私の場合はログインユーザーをsshd_configで縛っているので、漏れなく以下のコマンドでAllowUsersに半角スペースを空けて{DEPLOY_USER_NAME}を追記し、SSHDを再起動しておきます。
|
1 2 3 |
vim /etc/ssh/sshd_config sshd -t systemctl reload sshd |
最後に、デプロイユーザーで実際にログインできることを、本番用とステージング用の鍵で確認できたらユーザー作成が完了です。
|
1 2 |
ssh -i {SECRET_KEY_FOR_PROD_PATH} -p {PORT_NUMBER} {DEPLOY_USER_NAME}@{IP_ADDRESS} ssh -i {SECRET_KEY_FOR_STG_PATH} -p {PORT_NUMBER} {DEPLOY_USER_NAME}@{IP_ADDRESS} |
続いて、GitHub側での連携設定を進めます。GitHubリポジトリにてSettings→Environmentsを開き、本番用とステージング用のシークレットを登録していきます。
具体的には新しいEnvironmentをprod, stgにて作成し、それぞれ以下のようなシークレットを登録します。
|
1 2 3 4 5 6 7 8 9 10 11 |
# prod用シークレット SSH_PRIVATE_KEY : {PRIVATE_KEY_FOR_PROD} REMOTE_HOST:{IP_ADDRESS} REMOTE_USER:{DEPLOY_USER_NAME} REMOTE_PATH:/var/www/html/{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} # stg用シークレット SSH_PRIVATE_KEY : {PRIVATE_KEY_FOR_STG} REMOTE_HOST:{IP_ADDRESS} REMOTE_USER:{DEPLOY_USER_NAME} REMOTE_PATH:/var/www/html/stg.{YOUR_DOMAIN}/wp-content/themes/{THEME_NAME} |
GitHubのブランチにPUSHしたらサーバーに反映されるよう、コードの中にワークフローを定義します。具体的には、作業フォルダに.github/workflowsフォルダを作り、環境ごとにyamlのワークフローファイル(deploy-prod.yml, deploy-stg.yml)を作成します。
|
1 2 3 |
mkdir -p .github/workflows vim .github/workflows/deploy-stg.yml vim .github/workflows/deploy-prod.yml |
実際に書き込む内容は、以下のような内容です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
name: Deploy to PROD on: push: branches: [main] jobs: deploy: runs-on: ubuntu-latest environment: production steps: - uses: actions/checkout@v4 - name: Start ssh-agent uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Add known_hosts run: | mkdir -p ~/.ssh ssh-keyscan -H ${{ secrets.REMOTE_HOST }} >> ~/.ssh/known_hosts - name: Rsync theme to server run: | rsync -az --delete \ --exclude ".git/" \ --exclude ".github/" \ --exclude ".gitignore" \ ./ ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}:${{ secrets.REMOTE_PATH }}/ |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
name: Deploy to STG on: push: branches: [stg] jobs: deploy: runs-on: ubuntu-latest environment: stg steps: - uses: actions/checkout@v4 - name: Start ssh-agent uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }} - name: Add known_hosts run: | mkdir -p ~/.ssh ssh-keyscan -H ${{ secrets.REMOTE_HOST }} >> ~/.ssh/known_hosts - name: Rsync theme to server run: | rsync -az --delete \ --exclude ".git/" \ --exclude ".github/" \ --exclude ".gitignore" \ ./ ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}:${{ secrets.REMOTE_PATH }}/ |
ワークフローファイルを作ったので、これを実際にGitHubに反映します。まずはdevにPUAHをします。
|
1 2 3 4 |
git status git add -A git commit -m "deploy.ymlを修正" git push origin dev |
その後、GitHubリポジトリを開き、devからstgにプルリクを出してマージすると、ステージング環境のWordPressテーマが自動更新されます。さらに、stgからmainにプルリクを出してマージをすると、本番環境のWordPressテーマが自動更新されます。
これでバッチリですね!
このプロセスは、実際にやってみると思わぬところでエラーに遭遇したりします。
例えば、SSH鍵にパスフレーズを設定していたためにGitHub Actionsが途中で止まってしまったり、Envionmentsに逆の鍵(stg用であるべきなのにprod用、秘密鍵であるべきなのに公開鍵など)を設定してしまっていたり、stgとstagingなど表記揺れで失敗したり、作ったデプロイユーザーのログインが許可されていなかったりなど…
ただ、一度設定できれば後はすごく効率的に運用できるので、そこは良いですね。
以上、WordPressテーマをGitHub経由で管理・更新する作業手順の備忘録でした。この投稿が、いつか誰かの役に立ったら幸いです。
