wordmoveのMovefileのエラーを解決してみた in さくらレンタルサーバ

## wordmoveとは？
VCCWを使ってwordpress向けの開発環境を作る場合、wordmoveというツールが組み込まれています。
これを使うとpull/pushで環境のバックアップやデプロイができるようになりますが、そのために必要なMovefileの作成およびpullで詰んだのでメモ。

なお、さくらインターネットの人は特にDBで詰むと思いますのでMovefile内でcharsetの設定が必要です。この設定はwordmove initした時にも記載されていないので見逃しがちです（後述）。

## 利用までの手順

まず、開発環境に入ります。

```zsh
vagrant ssh # ローカルでssh-addしている状態で入る
```

そしてwordmoveのインストールを確認します。

```zsh
wordmove
```

これで下記の表示が出ればパスが通っているのでひとまずOK

```zsh
Commands:
  wordmove help [COMMAND]  # Describe available commands or one specific c...
  wordmove init            # Generates a brand new Movefile
  wordmove pull            # Pulls WP data from remote host to the local m...
  wordmove push            # Pushes WP data from local machine to remote host
```

wordmoveで手元にバックアップするためには下記のコマンドを打ちます。

```zsh
wordmove init # 新しいMovefileができる
vim Movefile # Movefileの内容を編集する
wordmove pull --all # 本番環境からpullしてくる
```

ここで、wordmove initした直後のMovefileは下記の通り。

```yaml:Movefile(default)
local:
  vhost: "http://wordpress.local/"
  wordpress_path: "/var/www/wordpress/" # use an absolute path here

  database:
    name: "wordpress"
    user: "wordpress"
    password: "wordpress"
    host: "localhost"

staging:
  vhost: "http://example.com"
  wordpress_path: "/var/www/your_site" # use an absolute path here

  database:
    name: "database_name"
    user: "user"
    password: "password"
    host: "localhost"

  exclude:
    - ".git/"
    - ".gitignore"
    - ".sass-cache/"
    - "bin/"
    - "tmp/*"
    - "Gemfile*"
    - "Movefile"
    - "wp-config.php"
    - "wp-content/*.sql"

  # paths: # you can customize wordpress internal paths
  #   wp_content: "wp-content"
  #   uploads: "wp-content/uploads"
  #   plugins: "wp-content/plugins"
  #   themes: "wp-content/themes"
  #   languages: "wp-content/languages"
  #   themes: "wp-content/themes"

  # ssh:
  #   host: "host"
  #   user: "user"
  #   password: "password" # password is optional, will use public keys if available.
  #   port: 22 # Port is optional
  #   rsync_options: "--verbose" # Additional rsync options, optional
  #   gateway: # Gateway is optional
  #     host: "host"
  #     user: "user"
  #     password: "password" # password is optional, will use public keys if available.

  # ftp:
  #   user: "user"
  #   password: "password"
  #   host: "host"
  #   passive: true

# production: # multiple environments can be specified
#   [...]
```

何も考えずsshの前の#をとってしまうと下記のエラーメッセージが出ます。。。

```zsh
▬▬ ✓ Using Movefile: ./Movefile ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
/usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:370:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 12 column 3 (Psych::SyntaxError)
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:370:in `parse_stream'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:318:in `parse'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/2.1.0/psych.rb:245:in `load'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/deployer/base.rb:58:in `fetch_movefile'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/deployer/base.rb:20:in `deployer_for'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/lib/wordmove/cli.rb:45:in `pull'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor/command.rb:27:in `run'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor/invocation.rb:126:in `invoke_command'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor.rb:359:in `dispatch'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/thor-0.19.1/lib/thor/base.rb:440:in `start'
	from /usr/local/rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/wordmove-1.2.0/bin/wordmove:6:in `<top (required)>'
	from /usr/local/rbenv/versions/2.1.2/bin/wordmove:23:in `load'
	from /usr/local/rbenv/versions/2.1.2/bin/wordmove:23:in `<main>'
```

sshの記載のある階層が合ってないのが問題なので、スペースにより下記のような階層に合わせます。念のため作成後に[Yaml lint](http://www.yamllint.com/)を通しておくと安心です。

なお、パスワードをコメントアウトしているのはsshログインをエージェントフォワードで解決できるためです。事前にVagrantfileで` config.ssh.forward_agent = true`のように設定しておきましょう。

```yaml:Movefile(一部抜粋)
staging:
  vhost: "http://XXX.example.com" # http://XXX.example.comなど本番ドメインを記載
  wordpress_path: "/home/XXX/www/" # use an absolute path here

  database:
    name: "Wordpress用の本番DBname"
    user: "本番ユーザ名"
    password: "本番DBのパスワード"
    host: "mysqlXXX.db.sakura.ne.jp" # さくらレンタルサーバの場合
    charset: "utf8" # ←dumpファイルの文字コードをutf8に固定。initにはないのでこの行を追記します

  exclude:
    - ".git/"
    - ".gitignore"
    - ".sass-cache/"
    - "bin/"
    - "tmp/*"
    - "Gemfile*"
    - "Movefile"
    - "wp-config.php"
    - "wp-content/*.sql"

  # paths: # you can customize wordpress internal paths
  #   wp_content: "wp-content"
  #   uploads: "wp-content/uploads"
  #   plugins: "wp-content/plugins"
  #   themes: "wp-content/themes"
  #   languages: "wp-content/languages"
  #   themes: "wp-content/themes"

  ssh:
    host: "XXXXX.sakura.ne.jp"
    user: "XXXXX"
  #  password: "passward" # password is optional, will use public keys if available.
  #  port: 22 # Port is optional
    rsync_options: "--verbose" # Additional rsync options, optional
  #   gateway: # Gateway is optional
  #     host: "host"
  #     user: "user"
  #     password: "password" # password is optional, will use public keys if available.
```

わかってしまうと単純なのですが、#のあるところが基準になっているんですね。yamlに慣れていないと単なるコメントアウトかなくらいの体だと思い、案外詰んでしまうというお話でした。

### おまけ
vagrant ssh後のMovefileを外部エディタでサクッと触りたい場合は、ローカルのwww/wordpress/に置いておけばすぐ編集できます。vagrant内だとvar/www/wordpress/がそれに対応します。

## wordmoveの詳しい使い方で参考になるサイト
WordMoveを使ってVagrant内のWordPressと本番環境を同期する！
http://firegoby.jp/archives/5644

wordmoveでローカルのWordPressを速攻デプロイ
http://tanshio.net/wordmove/

なお、Pulling Databaseの所でwp-configの文字コード、テーブル内の文字コードでエラーが出る事があります。その場合は対象がUTF−8になっているかを確認するのも大事です。さくらサーバで動かしている場合はDBをUTF−8で作っていると思いますのでMovefileの設定さえ行っていれば問題ありません。

invalid byte sequence in UTF-8 (ArgumentError) #65
https://github.com/welaika/wordmove/issues/65

Invalid byte sequence in UTF-8 on db synchronize #74
https://github.com/welaika/wordmove/issues/74

Problem when trying to push/pull database #90
https://github.com/welaika/wordmove/issues/90

# ＊追記＊さくらレンタルサーバ（VPSではなく）スタンダード以上の場合

さくらのmysqldumpの初期設定はujisですが、rootのないレンタルサーバでは設定できません。なので、dumpファイルがutf8にならずエラーするという罠があります。
wordmoveの中身を見るとcharsetオプションが準備されているため、Movefileへcharsetの設定を追記してクライアント側で解決しています

参考：[wordmove / lib / wordmove / deployer / base.rb](https://github.com/welaika/wordmove/blob/3d6932ce001410fa408efbc9152922e0ad83ccb7/lib/wordmove/deployer/base.rb#L193)