追記
WordPress 本体やプラグインは、管理画面で設定 (有効化) することで自動的に更新させることが出来る。
プラグインの場合には、Enable auto-updates
をクリックすることで自動更新を有効化出来る。(WordPress 5.8.3 にて確認)
WordPress 本体の場合には、Switch to automatic updates for maintenance and security releases only.
をクリックすることで、自動更新を有効化出来る。(WordPress 5.8.3 にて確認)
はじめに
YAMAP では、WordPress で構築されたサイトをいくつか運用している。WordPress は WordPress 本体とその機能を拡張するプラグインで構成されており、これらのバージョンアップ等の運用をどのように簡素化していくかが課題となっていた。(WordPress だけで自動更新を有効化することが出来るが、勝手にバージョンアップされるのは怖いし、WordPress やそのプラグインは Dockerfile で管理されている為、自動更新の機能は利用しない前提)
この課題に対して、自前のシェルスクリプトと CircleCI のスケジュールビルドを利用した WordPress 本体やプラグインの最新バージョンリリースを自動的に検知して通知する仕組みが稼働している。この仕組みにより、最新のバージョンがリリースされたことを認知し、アップデートの作業を行うことが出来ている。
一方で、この仕組みは、独自のシェルスクリプトで実装されている為、このシェルスクリプトのメンテナンスが必要になり、近い将来、「負の遺産」となってしまうことから、もっと、メンテナンスフリーな実装が無いかを調査を進めていたところ、 mizzy さんより、renovate という、各種言語やライブラリを自動でアップデートしてくれるツールを教えて頂いた。
この renovate と PHP のパッケージ管理システムである composer を組み合わせて WordPress と WordPress プラグインの管理を自動化してみることにした。尚、ここでの「自動化」とは、最新のバージョンがリリースされた際に、対象のリポジトリにて、バージョン更新のプルリクエストを作成されるまでを「自動化」とする。
renovate とは
renovate とは、ドキュメントの冒頭に以下のように解りやすく書かれているので、そのまま引用させて頂く。
Renovate (通称: Renovate Bot)は、自動化するためのオープンソースツールです。 * リポジトリ (Public/Private 問わず) 内の依存関係の検出 * アップデート可能な新しいバージョンがあるかどうかのチェック * 変更を適用するためのコミットや Merge/Pull Request を作成し、リリースノートを表示する
Github Apps やコマンドラインツール、Docker イメージ等で提供されており、簡単に手元で試すことが出来る。
尚、renovate の datasource 以下に、各種パッケージの情報を取得する為の実装が収められており、サポートされていないパッケージがあれば独自に追加することが出来る。(はず)
composer とは
composer とは、PHP のライブラリマネージャである。
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
composer
や dockerfile
が検出されており、今回は、WordPress プラグインの classic-editor のバージョンが最新のバージョンではない (最新バージョンは 1.6.2
) 為、PR が作成されていることが分かる。
リポジトリを見ると、以下のような PR が作成されている。
Package 列の wpackagist-plugin/classic-editor
をクリックすると classic-editor の公式サイトにアクセスされる。このあたりの情報収集は、renovate がよしなにやってくれている。
あとは、この PR を確認して、必要に応じてマージして、CI/CD 環境等で composer update
することでプラグインが更新される。
また、今回は、WordPress の Docker イメージを利用しており、この Docker イメージの最新タグがリリースされると、先のプラグインと同様に、下図の通り、PR が作成される。
ということで
renovate を使うことで、リポジトリ内の各種パッケージの最新バージョンを検知して、必要な情報を収集し、プルリクエスト作成までを自動化出来ること解った。また、WordPress のプラグインについても、従来は、パッケージマネージャを利用しておらず、一つずつ取得して unzip
で展開ということをやっていたが、composer というエコシステムの肩に乗っかることで、プラグイン自体をコードで管理することが出来るようになり、更に renovate でバージョンを適切に管理出来るようになったのはとても良い体験だった。
最後に
「モダン」っていったい何だろう?