SVNで更新するWordPress開発環境を作る

個人的にwordpressをベースにしたサイトの開発をしたかったのですが、FTPでソースアップロードとかwordpress上での編集などが面倒で、かつバージョン管理もしたかった。

なので、ローカル上で編集したファイルをTortoiseSVNでバージョン管理しつつ閲覧用の環境へもコミット時に即反映される環境を作ってみた次第。

前提

Dockerコンテナ上にCentOS7を構築。
バージョンはそれぞれ以下の通り。

  • CentOS7 release 7.7.1908
  • Apache 2.4.6 (CentOS)
  • MariaDB 5.5.64
  • PHP 7.2.23
  • WordPress 5.2.3-ja

OS・DockerインストールはさくらVPSにて提供されているスタートアップスクリプトを使用したので割愛。

開発環境なのでデータベースも同じlocalhostへ設置。
負荷分散とかバックアップやらは本番環境ができてから考えます。

1.コンテナ作成

centos7のイメージを取得してコンテナ作成します。

作成時に8080番ポートへアクセスすればサイトへ接続されるように指定。
あと「privileged」オプションはコンテナ内で「systemctl」コマンドを実行できるようにするため。

①コンテナ作成
[root@DockerHOST ~]# docker pull centos:centos7
[root@DockerHOST ~]# docker run --privileged -d -p 8080:80 --name dev-wordpress centos:centos7 /sbin/init
[root@DockerHOST ~]# docker ps

②作成したコンテナへログインしてyumアップデート
[root@DockerHOST ~]# docker exec -it dev-wordpress /bin/bash
[root@dev-wordpress ~]# yum update

2.LAMP環境作成

Apache、MariaDB、PHPを導入していきます。

httpdインストール

[root@dev-wordpress ~]# yum install -y httpd httpd-devel

[root@dev-wordpress ~]# systemctl enable httpd
[root@dev-wordpress ~]# systemctl start httpd

mariadbインストール

[root@dev-wordpress ~]# yum install -y mariadb-server mariadb-client

[root@dev-wordpress ~]# systemctl enable mariadb
[root@dev-wordpress ~]# systemctl start mariadb

PHPインストール

特に制約なければ最新版をインストールしてもいいのですが、プラグインやベースにするテーマとの抱き合わせを考えたかったのでバージョン7.2でのインストールをします。

[root@dev-wordpress ~]# yum install epel-release
[root@dev-wordpress ~]# vi /etc/yum.repos.d/epel.repo
※各項目の「enabled=1」を「enabled=0」に変更。
[epel]
[epel-debuginfo]
[epel-source]

[root@dev-wordpress ~]# rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi
[root@dev-wordpress ~]# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[root@dev-wordpress ~]# yum install -y --enablerepo=epel,remi-php72 php php-mbstring php-pear php-fpm php-mcrypt php-mysql

[root@dev-wordpress ~]# php -v
PHP 7.2.23 (cli) (built: Sep 25 2019 07:38:48) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

[root@dev-wordpress ~]# systemctl start php-fpm
[root@dev-wordpress ~]# systemctl enable php-fpm

あと、URLで「index.php」を省略してアクセスできるようにする為に httpd.confを編集しておきます。
「AllowOverride」を「all」にしておかないとページにアクセスできなる (Not Found) 。

[root@dev-wordpress ~]# vi /etc/httpd/conf/httpd.conf
        :
<Directory "/var/www/html">
        :
    AllowOverride all(allへ変更)
        :
</Directory>
        :
<IfModule dir_module>
    DirectoryIndex index.html index.php(index.php追記)
</IfModule>
        :

SVN環境構築

[root@dev-wordpress ~]# yum -y install subversion mod_dav_svn
[root@dev-wordpress ~]# mkdir /var/www/svn

[root@dev-wordpress ~]# svnadmin create /var/www/svn/sample

[root@dev-wordpress ~]# svn mkdir file:///var/www/svn/sample/trunk file:///var/www/svn/sample/tags file:///var/www/svn/sample/branches -m 'Initial import.'
[root@dev-wordpress ~]# chown -R apache:apache /var/www/svn

Basic認証でアクセスするよう設定。
ここで設定するユーザ・パスワードを使ってTortoiseSVNとかRedmineによる管理を行います。

[root@dev-wordpress ~]# htpasswd -c /etc/httpd/.htpasswd user
New password:pass
Re-type new password:pass
Adding password for user user

[root@dev-wordpress ~]# vi /etc/httpd/conf.d/subversion.conf
<Location /repos>
  DAV svn
  SVNParentPath /var/www/svn
#  <LimitExcept GET PROPFIND OPTIONS REPORT>
#  SSLRequireSSL
      AuthType Basic
      AuthName "Authorization"
      AuthUserFile /etc/httpd/.htpasswd
      Require valid-user
#  </LimitExcept>
</Location>

[root@dev-wordpress ~]# systemctl restart httpd

ここまでできたらTortoiseSVNを開発用端末へ導入して「http://[ドメイン]:8080/repos/sample」をチェックアウト。
作った「trunk」「tags」「branches」があればOKです。

更新するディレクトリを配置する用の「trunk/upload」フォルダだけ作っときます。

WordPressインストール

データベース作成

rootユーザのパスワードは「password」、wordpress用のDB情報は以下。
任意の値に書き直してください。

  • データベース名:wpdb
  • ユーザ名:wpadmin
  • パスワード:password
  • ホスト:localhost
[root@dev-wordpress ~]# mysqladmin -u root password 'password'
[root@dev-wordpress ~]# mysql -u root -ppassword
MariaDB [(none)]> create database wpdb default character set utf8;
MariaDB [(none)]> create user 'wpadmin'@'localhost' identified by 'password';
MariaDB [(none)]> grant all on wpdb.* to 'wpadmin'@'localhost';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit

WordPress取得

[root@dev-wordpress ~]# cd /var/www/html

[root@dev-wordpress html]# wget https://ja.wordpress.org/latest-ja.tar.gz
[root@dev-wordpress html]# tar -xzvf latest-ja.tar.gz 

[root@dev-wordpress html]# chown -R apache:apache /var/www

「http://XXXXXXXXX:8080/wordpress」へアクセス。
先ほど設定したデータベースの情報を入力してwordpressをインストール。

post-commitスクリプト作成

SVNのコミットと同時にリポジトリからデータをチェックアウトして閲覧環境へ反映させるスクリプトを作成します。

[root@dev-wordpress ~]# vi /var/www/svn/sample/hooks/post-commit
#!/bin/sh

DIR_HTDOCS='/var/www/html/wordpress/wp-content'
DIR_SVN='file:///var/www/svn/sample/trunk/upload/wp-content'

if [ -e $DIR_HTDOCS ];
then
        LANG=en_US.UTF-8 svn update $DIR_HTDOCS
else
        mkdir $DIR_HTDOCS
        LANG=en_US.UTF-8 svn checkout $DIR_SVN $DIR_HTDOCS
fi
[root@dev-wordpress ~]# chmod +x /var/www/svn/sample/hooks/post-commit
[root@dev-wordpress ~]# chown apache:apache /var/www/svn/sample/hooks/post-commit

SVNで管理する「wp-content」を「trunk/upload」へ配置して、あとはコミット時にエラーを吐かないか確認。
試しにテーマの「page.php」などに追記してみて、コミット後に該当のサイトが更新されてればこれでOKです。

最後に

注意として、wordpress側のダッシュボード上で編集したソースやインストールしたプラグイン・テンプレートはコミット時に無くなってしまいます。
(記事なんかはDBに登録されてるから問題なし)

基本的にこれらの作業はソースを弄ってコミットするという流れという点だけ覚悟しときましょう。
……まぁいい勉強になるのでヨシとします。

はい、ではサイト開発頑張ります。