ようへいの日々精進XP

よかろうもん

renovate と composer を用いて、WordPress のプラグイン運用をモダンにしたい 〜 モダンっていったい何だろう 〜

追記

WordPress 本体やプラグインは、管理画面で設定 (有効化) することで自動的に更新させることが出来る。

inokara.hateblo.jp

プラグインの場合には、Enable auto-updates をクリックすることで自動更新を有効化出来る。(WordPress 5.8.3 にて確認)

f:id:inokara:20220117082908p:plain

WordPress 本体の場合には、Switch to automatic updates for maintenance and security releases only. をクリックすることで、自動更新を有効化出来る。(WordPress 5.8.3 にて確認)

f:id:inokara:20220117083238p:plain

はじめに

YAMAP では、WordPress で構築されたサイトをいくつか運用している。WordPressWordPress 本体とその機能を拡張するプラグインで構成されており、これらのバージョンアップ等の運用をどのように簡素化していくかが課題となっていた。(WordPress だけで自動更新を有効化することが出来るが、勝手にバージョンアップされるのは怖いし、WordPress やそのプラグインは Dockerfile で管理されている為、自動更新の機能は利用しない前提)

この課題に対して、自前のシェルスクリプトと CircleCI のスケジュールビルドを利用した WordPress 本体やプラグインの最新バージョンリリースを自動的に検知して通知する仕組みが稼働している。この仕組みにより、最新のバージョンがリリースされたことを認知し、アップデートの作業を行うことが出来ている。

一方で、この仕組みは、独自のシェルスクリプトで実装されている為、このシェルスクリプトのメンテナンスが必要になり、近い将来、「負の遺産」となってしまうことから、もっと、メンテナンスフリーな実装が無いかを調査を進めていたところ、 mizzy さんより、renovate という、各種言語やライブラリを自動でアップデートしてくれるツールを教えて頂いた。

この renovate と PHP のパッケージ管理システムである composer を組み合わせて WordPressWordPress プラグインの管理を自動化してみることにした。尚、ここでの「自動化」とは、最新のバージョンがリリースされた際に、対象のリポジトリにて、バージョン更新のプルリクエストを作成されるまでを「自動化」とする。

renovate とは

github.com

renovate とは、ドキュメントの冒頭に以下のように解りやすく書かれているので、そのまま引用させて頂く。

Renovate (通称: Renovate Bot)は、自動化するためのオープンソースツールです。

* リポジトリ (Public/Private 問わず) 内の依存関係の検出
* アップデート可能な新しいバージョンがあるかどうかのチェック
* 変更を適用するためのコミットや Merge/Pull Request を作成し、リリースノートを表示する

Github Apps やコマンドラインツール、Docker イメージ等で提供されており、簡単に手元で試すことが出来る。

尚、renovate の datasource 以下に、各種パッケージの情報を取得する為の実装が収められており、サポートされていないパッケージがあれば独自に追加することが出来る。(はず)

composer とは

composer とは、PHP のライブラリマネージャである。

getcomposer.org

composer.json という定義ファイルに依存関係等を記載する。デフォルトのリポジトリ (https://packagist.org) 以外にもサードパーティ製のリポジトリを登録することが出来る。今回、WordPressプラグインやテーマを扱っている https://wpackagist.org といるリポジトリを利用することになる。

簡単に検証

WordPress

Dockerfile

WordPress は、Docker を利用して構築するものとして、まず、以下のような Dockerfile を利用した。

FROM wordpress:5.8.3

# 依存するコマンドをインストール
RUN apt-get update && apt-get -y install wget unzip

# composer.json で管理しているプラグインをインストールする
# composer のインストールについては省略
WORKDIR /usr/src
ADD composer.json /usr/src/composer.json
RUN composer install

尚、Docker イメージのタグについても、renovate によって検知することが可能なので、WordPress の Docker イメージがリリースされると renovate によって Pull Request (以後、PR) が作成される。

composer.json

WordPressプラグインについては、composer.json に定義する。

{
    "name": "example/example-wordpress",
    "description": "Example WordPress site",
    "repositories":[
        {
            "type":"composer",
            "url":"https://wpackagist.org",
            "only": [
                "wpackagist-plugin/*",
                "wpackagist-theme/*"
            ]
        }
    ],
    "require": {
        "wpackagist-plugin/classic-editor":"1.6.0"
    },
    "extra": {
        "installer-paths": {
            "/usr/src/wordpress/wp-content/plugins/{$name}/": ["type:wordpress-plugin"]
        }
    },
    "config": {
        "allow-plugins": {
            "composer/installers": true,
            "wpackagist-plugin/*": true
        }
    }
}

これらをリポジトリに push しておく。

renovate 側

Docker (docker-compose)

renovate は Docker イメージとしても提供されている為、以下のような docker-compose.yml を作成した。

version: "3.9"
    
services:
  renovate-development:
    image: renovate/renovate 
    tty: true
    command: bash

これを、以下のように実行して Docker 環境を起動する。

$ docker-compose up -d

renovate のバージョン番号を確認する。

$ docker-compose exec renovate-development renovate --version
31.26.1

プラグインの更新

renovate を以下のように実行する。

$ export PLATFORM=github
$ export GITHUB_COM_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ export GITHUB_REPO=your-account/repo
$ docker-compose exec renovate-development renovate \
  --platform $PLATFORM \
  --token $GITHUB_COM_TOKEN \
  $GITHUB_REPO

以下のように出力される。

 INFO: Repository started (repository=your-account/repo)
       "renovateVersion": "31.26.1"
 INFO: Dependency extraction complete (repository=your-account/repo)
       "baseBranch": "master",
       "stats": {
         "managers": {
           "composer": {"fileCount": 1, "depCount": 1},
           "dockerfile": {"fileCount": 1, "depCount": 1}
         },
         "total": {"fileCount": 2, "depCount": 2}
       }
 INFO: Branch created (repository=your-account/repo, branch=renovate/wpackagist-plugin-classic-editor-1.x)
       "commitSha": "2755501"
 INFO: PR created (repository=your-account/repo, branch=renovate/wpackagist-plugin-classic-editor-1.x)
       "pr": 9,
       "prTitle": "Update dependency wpackagist-plugin/classic-editor to v1.6.2"
 INFO: Repository finished (repository=your-account/repo)
       "durationMs": 31138

composerdockerfile が検出されており、今回は、WordPress プラグインclassic-editor のバージョンが最新のバージョンではない (最新バージョンは 1.6.2) 為、PR が作成されていることが分かる。

リポジトリを見ると、以下のような PR が作成されている。

f:id:inokara:20220116194416p:plain

Package 列の wpackagist-plugin/classic-editor をクリックすると classic-editor の公式サイトにアクセスされる。このあたりの情報収集は、renovate がよしなにやってくれている。

あとは、この PR を確認して、必要に応じてマージして、CI/CD 環境等で composer update することでプラグインが更新される。

また、今回は、WordPress の Docker イメージを利用しており、この Docker イメージの最新タグがリリースされると、先のプラグインと同様に、下図の通り、PR が作成される。

f:id:inokara:20220116194443p:plain

ということで

renovate を使うことで、リポジトリ内の各種パッケージの最新バージョンを検知して、必要な情報を収集し、プルリクエスト作成までを自動化出来ること解った。また、WordPressプラグインについても、従来は、パッケージマネージャを利用しておらず、一つずつ取得して unzip で展開ということをやっていたが、composer というエコシステムの肩に乗っかることで、プラグイン自体をコードで管理することが出来るようになり、更に renovate でバージョンを適切に管理出来るようになったのはとても良い体験だった。

最後に

「モダン」っていったい何だろう?