1699 文字
8 分

WordPressテーマのCI/CDをGitHub Actionsで構築する

はじめに#

この記事では、GitHub Actions を活用した WordPress テーマの CI/CD 構築について解説する。安全かつ効率的な運用を実現するための方法を紹介する。

背景:WordPress運用における課題#

WordPress は手軽にブログや Web サイトを始められる便利な CMS だが、DevOps の観点からはいくつかの課題がある。

  • 開発環境、ステージング環境、本番環境の運用が煩雑になりがち。
  • テーマファイルの管理が難しい。
    • ファイルを直接編集するとバージョン管理ができない。
    • etckeeperを使っても、ステージング環境と本番環境のファイルを同期するきれいな方法がない。
  • バージョン管理ができない。
    • 更新するたびに ZIP ファイルを作成してアップロードするのは手間がかかる。
  • DB 内のデータ(記事、ページ)とファイル(プラグイン、テーマ、アセット)が密接に連携しているため、コードレベルでのスナップショットが取りづらい。

解決策:GitHub ActionsによるCI/CD#

これらの課題を解決するために、GitHub Actions を活用して WordPress テーマの CI/CD を構築する。

  • テーマファイルを GitHub リポジトリで管理する
  • GitHub Actions で、develop ブランチへの push をトリガーにステージング環境へデプロイする
  • GitHub Actions で、main ブランチへの push をトリガーに本番環境へデプロイする
  • CI で PHP の構文チェックを行い、本番環境でのエラーを未然に防ぐ

システム設計#

このシステムでは、以下の要素を組み合わせて WordPress テーマの CI/CD を実現します。

  • GitHub リポジトリ:テーマファイルのソースコードを管理する。
  • GitHub Actions:CI/CD のワークフローを定義し、実行する。
  • SSH:GitHub Actions から WordPress サーバーへ安全にファイルを転送する。
  • rsync:効率的にファイルを同期する。

設定手順#

1. GitHubリポジトリの準備#

まず、WordPress テーマのファイルを GitHub リポジトリに登録する。

2. GitHub Actionsのワークフロー設定#

次に、GitHub Actions のワークフローを設定する。

ステージング環境へのデプロイ#

.github/workflows/deploy-staging.yml

name: Deploy to Staging
on:
push:
branches: [ develop ]
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: PHP Syntax Check
uses: ./.github/actions/php-syntax-check
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up SSH
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_STAGING }}
# known_hosts: ${{ secrets.KNOWN_HOSTS_STAGING }} # よりセキュアにする場合は有効化
- name: Ensure target theme directory exists on remote
run: |
SSH_HOST="${{ secrets.STAGING_SERVER_HOST }}"
SSH_USER="${{ secrets.STAGING_SERVER_USER }}"
THEME_PATH="${{ secrets.STAGING_THEME_PATH }}"
ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${SSH_HOST}" "mkdir -p \"${THEME_PATH}\""
- name: Rsync theme files to Staging
run: |
SSH_HOST="${{ secrets.STAGING_SERVER_HOST }}"
SSH_USER="${{ secrets.STAGING_SERVER_USER }}"
THEME_PATH="${{ secrets.STAGING_THEME_PATH }}"
rsync -avzc --delete --exclude='.*' --exclude README.md -e "ssh -o StrictHostKeyChecking=no" ./ "${SSH_USER}"@"${SSH_HOST}":"${THEME_PATH}"

このワークフローは、develop ブランチへのpushをトリガーに、以下の処理を行う。

  1. コードをチェックアウトする
  2. PHPの構文チェックを行う
  3. SSHでWordPressサーバーに接続し、テーマファイルをrsyncで同期する

このrsyncを実行する際のオプションは重要である。特に重要なオプションを以下に示す。

-c オプション:ファイルのチェックサムで比較し、同一ファイルであれば変更しない。GitHub Actionsでコピー元のファイルが準備される際、タイムスタンプがcheckout時のものになるため、更新日時がサーバと異なることを避けるために使用する。

-u オプション:サーバに新しいファイルが存在する場合、上書きしない。今回はすべてのファイルを上書きするため、このオプションは使用しない。

--exclude:機密情報を含まないように、ドキュメントやGit関連ファイルを除外する。

本番環境へのデプロイ#

.github/workflows/deploy-production.yml

name: Deploy to Production
on:
push:
branches: [ main ]
workflow_dispatch:
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: PHP Syntax Check
uses: ./.github/actions/php-syntax-check
deploy:
needs: test
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up SSH
uses: webfactory/[email protected]
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_PRODUCTION }}
# known_hosts: ${{ secrets.KNOWN_HOSTS_PRODUCTION }} # よりセキュアにする場合は有効化
- name: Ensure target theme directory exists on remote
run: |
SSH_HOST="${{ secrets.PRODUCTION_SERVER_HOST }}"
SSH_USER="${{ secrets.PRODUCTION_SERVER_USER }}"
THEME_PATH="${{ secrets.PRODUCTION_THEME_PATH }}"
ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${SSH_HOST}" "mkdir -p \"${THEME_PATH}\""
- name: Rsync theme files to PRODUCTION
run: |
SSH_HOST="${{ secrets.PRODUCTION_SERVER_HOST }}"
SSH_USER="${{ secrets.PRODUCTION_SERVER_USER }}"
THEME_PATH="${{ secrets.PRODUCTION_THEME_PATH }}"
rsync -avzc --delete --exclude='.*' --exclude README.md -e "ssh -o StrictHostKeyChecking=no" ./ "${SSH_USER}"@"${SSH_HOST}":"${THEME_PATH}"
- name: Clear WordPress Cache
run: |
SSH_HOST="${{ secrets.PRODUCTION_SERVER_HOST }}"
SSH_USER="${{ secrets.PRODUCTION_SERVER_USER }}"
ssh -o StrictHostKeyChecking=no "${SSH_USER}"@"${SSH_HOST}" "wp w3-total-cache flush all"
release:
needs: deploy
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Release Drafter
uses: release-drafter/release-drafter@v6
with:
publish: true
version: ${{ steps.version.outputs.version-without-v }}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

このワークフローは、main ブランチへのpushをトリガーに、以下の処理を行う。

  1. コードをチェックアウトする
  2. PHPの構文チェックを行う
  3. SSHでWordPressサーバーに接続し、テーマファイルをrsyncで同期する
  4. WordPressのキャッシュをクリアする
  5. リリースノートを自動生成する

PHP構文チェック#

.github/actions/php-syntax-check/action.yml

name: PHP Syntax Check
description: Checks PHP syntax for errors.
runs:
using: "composite"
steps:
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
- name: Run PHP Syntax Check
shell: bash
run: |
find . -name "*.php" -print0 | xargs -0 -n1 php -l

このアクションは、PHPの構文チェックを行います。

リリースノート自動生成#

.github/release-drafter.yml

name-template: 'v$RESOLVED_VERSION 🌈'
tag-template: 'v$RESOLVED_VERSION'
categories:
- title: '🚀 Features'
labels:
- 'feature'
- 'enhancement'
- title: '🐛 Bug Fixes'
labels:
- 'fix'
- 'bugfix'
- title: '🧰 Maintenance'
label: 'chore'
change-template: '- $TITLE @$AUTHOR (#$NUMBER)'
change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks.
version-resolver:
major:
labels:
- 'major'
minor:
labels:
- 'minor'
patch:
labels:
- 'patch'
default: patch
template: |
## Changes
$CHANGES

このファイルは、リリースノートの自動生成に関する設定を記述します。

3. GitHub Secretsの設定#

GitHub ActionsからWordPressサーバーへSSH接続するために、GitHub Secretsを設定します。

  • SSH_PRIVATE_KEY_STAGING: ステージング環境へのSSH接続に使用する秘密鍵
  • SSH_PRIVATE_KEY_PRODUCTION: 本番環境へのSSH接続に使用する秘密鍵
  • STAGING_SERVER_HOST: ステージング環境のホスト名
  • STAGING_SERVER_USER: ステージング環境のユーザー名
  • STAGING_THEME_PATH: ステージング環境のテーマファイルのパス
  • PRODUCTION_SERVER_HOST: 本番環境のホスト名
  • PRODUCTION_SERVER_USER: 本番環境のユーザー名
  • PRODUCTION_THEME_PATH: 本番環境のテーマファイルのパス

4. WordPressサーバーの設定#

WordPressサーバーに、GitHub ActionsからWordPressサーバーへSSH接続できるように設定します。

  • WordPressを運用しているホストにはGithub Actionsからsshで接続できるようにしておく必要があります。
    • Github actionsのIPアドレスの空間が膨大なのでligthsailだと制限をかけるのが不可能です。
    • Github actionsのsource IP addressはAPIで公開されています。

sshキーペアの作り方はこんな感じです。生成された秘密鍵をGithub Actionsのsecretsに登録し、公開鍵をwordpressの.ssh/authorized_keysに追加します。

% ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/github_actions_deploy_key_staging
% ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/github_actions_deploy_key_production

実行結果#

GitHub Actions のワークフローを実行すると、ステージング環境と本番環境へテーマファイルが自動的にデプロイされます。

ステージングは 1 分程度で完了します。

本番も 1 分程度で完了します。

今後の展望#

  • WordPress を SSG(Static Site Generator)に移行することで、より高速かつ安全な Web サイトを構築できる可能性があります。
  • カオスになりやすい WordPress の運用に少しでも秩序を導入できたのでこれでしばらくは延命できます。

まとめ#

GitHub Actions を活用することで、WordPress テーマの CI/CD を簡単に構築できます。 これにより、開発効率が向上し、安全な運用を実現できます。

WordPressテーマのCI/CDをGitHub Actionsで構築する
https://blog.teraren.com/posts/wordpress-theme-ci-cd/
作者
Yuki Matsukura
公開日
2025-05-21
ライセンス
CC BY-NC-SA 4.0
この記事が役に立ったら
GitHub Sponsorsで応援できます

コメント