GitHub Actions で WordPress のプラグインを自動更新する方法

GitHubWordPress

GitHub Actions を使って WordPress のプラグインを自動的に更新する方法をご紹介します。

より正確に言うと「 Git でコードを管理している WordPress サイトのプラグインを GitHub Actions で更新する方法」というお話です。

前提

以下前提です。

  • サイトに WordPress を使っている
  • コードを Git + GitHub で管理している
  • リポジトリの wp_root ディレクトリに WordPress のルートがある
  • GitHub Actions のマシン ubuntu-latest が Ubuntu 18.04 を指す

GitHub Actions で WordPress のプラグインを自動更新する

GitHub Actions ワークフローを使って以下の流れでプラグインを実行します。

  1. コードをチェックアウトする
  2. PHP をセットアップする
  3. WP-CLI をインストールする
  4. MySQL を起動する
  5. MySQL のユーザーとデータベースを作成する
  6. WordPress の設定ファイルを作成する
  7. WordPress をインストールする
  8. プラグインを有効化する
  9. プラグインを更新する
  10. Pull Request を作成する

設定ファイルの全体像は次のとおりです。

.github/workflows/plugins-update.yml

name: Update plugins

on:
  schedule:
    # 毎日 14 時(= UTC 5 時)に実行する
    - cron: '0 5 * * *'

jobs:
  update:
    runs-on: ubuntu-latest
    env:
      MYSQL_DATABASE: wp
      MYSQL_USER: wp
      MYSQL_PASSWORD: wp
    steps:
      # 1. コードをチェックアウトする
      - name: Checkout
        uses: actions/checkout@v2
      # 2. PHP をセットアップする
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
        with:
          php-version: '7.4'
          extensions: gd, mbstring, mysqli, zip
      # 3. WP-CLI をインストールする
      - name: Install WP-CLI
        run: |
          curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
          chmod +x wp-cli.phar
          mv wp-cli.phar /usr/local/bin/wp
      # 4. MySQL を起動する
      - name: Start MySQL
        run: sudo systemctl start mysql.service
      # 5. MySQL のユーザーとデータベースを作成する
      - name: Create MySQL database
        run: >
          mysql --user=root --password=root -e "
          CREATE DATABASE \`$MYSQL_DATABASE\` ;
          CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;
          GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;
          FLUSH PRIVILEGES ;
          "
      # 6. WordPress の設定ファイルを作成する
      - name: Configure WordPress
        run: >
          wp config create
          --allow-root
          --dbname=$MYSQL_DATABASE
          --dbuser=$MYSQL_USER
          --dbpass=$MYSQL_PASSWORD
          --locale=ja
          --force
        working-directory: wp_root
      # 7. WordPress をインストールする
      - name: Install WordPress
        run: >
          wp core install
          --allow-root
          --url=localhost
          --title=WP
          --admin_user=admin
          --admin_email=example@example.com
          --admin_password=password
          --skip-email
        working-directory: wp_root
      # 8. プラグインを有効化する
      - name: Enable Plugins
        run: >
          wp plugin activate
          --allow-root
          --all
        working-directory: wp_root
      # 9. プラグインを更新する
      - name: Update Plugins
        run: >
          wp plugin update
          --allow-root
          --all
        working-directory: wp_root
      # 10. Pull Request を作成する
      - name: Create Pull Request
        uses: peter-evans/create-pull-request@v3

ポイント

name

name: Update plugins

name でワークフローの名前を指定します。 これは GitHub リポジトリの Actions のページに表示されます。

on

on:
  schedule:
    # 毎日 14 時(= UTC 5 時)に実行する
    - cron: '0 5 * * *'

on でワークフローの実行タイミングを指定します。 イベントが起こらなくても定期的にワークフローを実行したい場合はこの schedule というイベントを使用します。

参考: GitHub Actions ワークフローで処理を定期実行する方法

cron の値は crond 形式で指定します。 タイムゾーンは UTC です。 上の 0 5 * * * の場合は、毎日 UTC 5 時(日本時間で 14 時)に処理を実行するという意味になります。

jobs

jobs:
  update:

jobs で実行する処理を指定します。

一般にはひとつの YAML ファイルの中に複数のジョブを定義することができますが、ここでは WordPress のプラグインを実行するための update という名前のワークフローをひとつだけ定義しています。 尚 update という名前は私がわかりやすいと思ってこうしただけなので、別の名前にしても OK です。 これも GitHub リポジトリの Actions のページに表示されます。

jobs.<job_id>.runs-on

runs-on: ubuntu-latest

runs-on でジョブを実行するマシンのタイプを指定します。 今回は ubuntu-latest で指定できる Ubuntu 18.04 を使います。

ちなみに、本記事執筆時点では ubuntu-latest の他に以下のオプションが用意されています。

  • ubuntu-20.04
  • ubuntu-18.04
  • ubuntu-16.04
  • windows-latest / windows-2019
  • macos-latest / macos-10.15

jobs.<job_id>.env

env:
  MYSQL_DATABASE: wp
  MYSQL_USER: wp
  MYSQL_PASSWORD: wp

env で環境変数をセットします。 ここでは MySQL のデータベース名・ユーザー名・パスワードを設定しています。 値は適当です。 ここでセットした環境変数は update ジョブのすべてのアクションから利用できます。

jobs.<job_id>.steps

steps:

steps で順番に実行する処理を指定します。

事前準備

# 1. コードをチェックアウトする
- name: Checkout
  uses: actions/checkout@v2
# 2. PHP をセットアップする
- name: Setup PHP
  uses: shivammathur/setup-php@v2
  with:
    php-version: '7.4'
    extensions: gd, mbstring, mysqli, zip
# 3. WP-CLI をインストールする
- name: Install WP-CLI
  run: |
    curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
    chmod +x wp-cli.phar
    mv wp-cli.phar /usr/local/bin/wp
# 4. MySQL を起動する
- name: Start MySQL
  run: sudo systemctl start mysql.service
# 5. MySQL のユーザーとデータベースを作成する
- name: Create MySQL database
  run: >
    mysql --user=root --password=root -e "
    CREATE DATABASE \`$MYSQL_DATABASE\` ;
    CREATE USER '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD' ;
    GRANT ALL ON \`$MYSQL_DATABASE\`.* TO '$MYSQL_USER'@'%' ;
    FLUSH PRIVILEGES ;
    "

steps 以下では最初に事前準備を行います。

インラインのコメントに書かれているとおり、ここでは、まずリポジトリのコードをチェックアウトしてから PHP をセットアップし、続いて WP-CLI をインストール、そして MySQL を起動してデータベースの作成を行っています。

PHP のセットアップには shivammathur/setup-php アクションを使っています。

MySQL については、 services を使ってサービスコンテナとして用意するという選択肢もありますが、サービスコンテナの MySQL を利用する場合いろいろとハマりどころが多いので、ここでは GitHub Actions の Ubuntu 18.04 にデフォルトで入っている MySQL を使います。

記事執筆時点では MySQL は初期状態で停止しているので、 sudo systemctl start mysql.service で起動する必要があります。

MySQL を起動したら、 WordPress で利用するデータベースとユーザーを作成します。 この処理にはユーザー root を使用します。 記事執筆時点での root のパスワードは root です。

ちなみに、 GitHub Actions の runs-on で指定できるマシンにどのようなソフトウェアが含まれているかは actions/runner-images リポジトリで確認することができます(追記: リポジトリが actions/virtual-environments から actions/runner-images に変更されたのにあわせてリンク更新しました):

本処理

# 6. WordPress の設定ファイルを作成する
- name: Configure WordPress
  run: >
    wp config create
    --allow-root
    --dbname=$MYSQL_DATABASE
    --dbuser=$MYSQL_USER
    --dbpass=$MYSQL_PASSWORD
    --locale=ja
    --force
  working-directory: wp_root
# 7. WordPress をインストールする
- name: Install WordPress
  run: >
    wp core install
    --allow-root
    --url=localhost
    --title=WP
    --admin_user=admin
    --admin_email=example@example.com
    --admin_password=password
    --skip-email
  working-directory: wp_root
# 8. プラグインを有効化する
- name: Enable Plugins
  run: >
    wp plugin activate
    --allow-root
    --all
  working-directory: wp_root
# 9. プラグインを更新する
- name: Update Plugins
  run: >
    wp plugin update
    --allow-root
    --all
  working-directory: wp_root
# 10. Pull Request を作成する
- name: Create Pull Request
  uses: peter-evans/create-pull-request@v3

一連の事前処理の後にプラグイン更新のための本処理を実行します。

WordPress のセットアップとプラグインの有効化・更新まではすべて WP-CLI を利用しています。 今回は WordPress のルートがリポジトリの wp_root ディレクトリにある想定なので、 WP-CLI を使うときは必ず working-directory で実行ディレクトリを指定しています。

プラグインの更新が無事に完了したら、最後に peter-evans/create-pull-request アクションを使って Pull Request を作成しています。

コミット対象外のファイルの指定

プラグインを有効化あるいは更新したときに生成されるファイルの中には Git にコミットしたくないファイルもあります。 それらのファイルを除外したい場合は、 peter-evans/create-pull-request アクションで個別に除外することはできないため .gitignore を使います。 .gitignore での対処がどうしても難しい場合は、スクリプトを書いて対応します。

ポイントは以上です。

この .github/workflows/plugins-update.yml ファイルをコミットして GitHub にプッシュしたら、指定したタイミングでプラグインの自動更新が行われ Pull Request が作成されます。 設定が間違っている可能性もあるので、最初のうちは特にコミットの中身をしっかりチェックしてから受け入れるようにするとよいと思います。

ちなみに、最初から on.schedule を使うとデバッグに時間がかかるので、作成中やデバッグ中は push 等を対象イベントに追加しておくと捗ります。

まとめ

ということで、 GitHub Actions を使って WordPress サイトのプラグインを自動的に更新する方法についてでした。

今回は最後のところを Pull Request を出して終了にしていますが、必要に応じてテスト → コミット → デプロイ等に差し替えてもよいと思います。

記事中の YAML とほぼ同じ内容のものを GitHub に置いたので興味がある方はそちらもご覧ください:

参考

GitHub Actions のワークフローの YAML シンタックスについて詳しく知りたい方は公式のドキュメントをご覧ください:


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら