コマンド一発で WordPress のデプロイ・同期ができるツールをつくりました

WordPress をデプロイしたり、ローカル・リモート間で同期できるツールというと Wordmove がよく知られています。LT で紹介しちゃうくらい僕も Wordmove はよく使っていたのですが、何かの折につけよく動かなくなっていて、多分 ruby のアップデートとかそういうのだと思うのですが、忙しいときにデプロイできなくなったりするとまぁめんどくさくて、もっと簡単に導入できて可用性も高いツールがほしいなということで WP-CLI と rsync を使ってデプロイ・同期させるツールをつくりました。

bash-wp-deploy

bash-wp-deploy というツールです。名前からわかるとおりシェルスクリプトです。Mac でしか動作確認していませんが、bash で書いているので Linux とかでも普通に動くと思います。Windows はわかりません。WP-CLI と rsync を使って同期させるのでローカル・サーバーでそれらが動くようにしておく必要があります。WP-CLI はインストールしなければいけないとして、rsync や SSH は今どき普通に動くと思うので、WP-CLI さえインストールできればレンサバでも多分使えると思います。あと設定ファイルが json なので、ローカルには jq をインストールする必要があります。

導入方法

Mac ならWP-CLI も jq も Homebrew でちゃちゃっとインストールできます。

$ brew install wp-cli jq

WP-CLI と jq がインストールできたら bash-wp-deploy を GitHub からダウンロードし、設定ファイルをつくりましょう。

$ git clone https://github.com/inc2734/bash-wp-deploy.git
$ cd bash-wp-deploy
$ cp config-sample.json config.json
$ vi config.json

config.json が設定ファイルです。

config.json

見ればなんとなくわかると思いますが、ちょっと抜粋して説明します。環境はローカル環境(local)と、リモート環境を複数定義できます。デフォルトではリモート用に production という環境を定義しています。

{
  "production": {
    "mysql": {
      "host": "localhost",
      "name": "",
      "user": "",
      "password": ""
    },
    "server": {
      "path": "/var/www/html",
      "host": "example.com",
      "port": "",
      "protocol": "http"
    },
    "ssh": {
      "user": "user",
      "host": "example.com",
      "port": "22"
    }
  },

例えば production として本番環境を、staging としてテスト環境を定義、ということができます。今のところ ssh は公開鍵認証にしか対応していません(なので ssh.password の設定が config.json にはありません)。ssh 使っているのにパスワード認証というのもアレなので、公開鍵認証を使っていない方はこの機会に公開鍵認証にしましょう!SSH_CONFIG には特に対応していないというかテストもしていないので、多分 SSH_CONFIG をつかって接続している環境の場合には調整が必要かもしれません…。プルリクよろしくお願いします。

また、ignore というセクションも定義されていて、そこに記述したものは同期から除外されるようになっています。

  "ignore": [
    ".git/",
    ".gitignore",
    ".sass-cache/",
    "wp-config.php",
    "node_modules/",
    ".DS_Store",
    "*.sql",
    ".ht*",
    "*.log"
  ]

ダウンロード

リモートからローカルにファイルやデータベースをダウンロードしてくるには次のようなコマンドを実行します。

$ ./pull.sh -e production -a

上記は production として定義されたリモート環境からデータベースとすべてのファイルをダウンロード(同期)する、というコマンドです。./pull.sh の部分は GitHub からダウンロードした bash-wp-deploy/pull.sh が実行されるようにパスを指定してください。

-a が「データベースとすべてのファイル」という意味です。他にもオプションが用意されていて、必要なものだけ同期することができます。-d でデータベースを、-t でテーマを、-p でプラグインを、-u で uploads ディレクトリを、-w で WordPress コアファイル( wp-content 以外のすべてのファイル)を同期できます。これらのオプションは組み合わせ可能なので、例えば

$ ./pull.sh -e production -t -p

として production 環境からテーマとプラグインをダウンロード(同期)する、といったことができます。

アップロード

ローカルのファイルやデータベースをリモートにアップロードするには次のようなコマンドを実行します。

$ ./push.sh -e production -a

-e とか -a などのオプションは pull.sh と全く同じです。

マルチサイト対応

Wordmove を使っているときに困っていたのがマルチサイトに対応していない、という点です。もう1年くらい使っていないのでもしかしたら最新バージョンでは対応したりしているかもしれませんがどうなんでしょう?使っている方がいらっしゃたら教えてください。

ということで bash-wp-deploy はマルチサイトに対応させました。手持ちの環境ではちゃんと動いているっぽかったのですが、マルチサイトはシングルサイトよりちょっと対応がむずかしかったりするので、もしこの記事を読んで bash-wp-deploy をマルチサイトで使ったよーという方がいらっしゃれば動作報告いただけると嬉しいです!

シェルスクリプトはド素人で普通はどう書くというのが全然わからずググりながらとりあえず動くという感じで作ったのでコード的にはあまりきれいではないかもしれません…。あ、あと一応テストはしていますが、ファイルもデータベースもどーんと同期しちゃうので、とりあえず最初は FTP なり何なりでバックアップをとってから実行されたほうが良いかもしれません。オープンソースなのであくまで自己責任ということで…。