WordPress × CIWordPressで行う継続的インテグレーションのススメ
キタジマタカシ
長崎のフリーランスWebデザイナー/プログラマー。
Plugin:「MW WP Form」 「Smart Custom Fields」
Theme :「Kotetsu」「Habakiri」
Toro_Unit(占部 紘)
長野県ではたらくフロントエンドエンジニア。
Plugin: 「Custom Post Type Permalinks」 「 Simple Post Type Permalinks」
堀家隆宏
Engineer at Digitalcube Co. Ltd.
4.2 Core Contributor
Plugin:「Trust Form」 「Simpe GA Ranking」
目標
CIを回すメリットを理解してもらう
WordPressでCIを行う方法を ハンズオンを通して持ち帰ってもらう
WordPress.orgにあげて公開
ここから先は プラグインメンテの長い旅路
追加開発やバグ修正を 繰り返した結果…
バージョンを上げるたびに 複雑になっていくコード
忘れてしまう仕様
こんな機能つくったっけ
あなたのプラグイン、バージョンあげたらバグったわよ!!
申し訳ございません!!
こうならないためにどうするべきか?
ドキュメント書くのは大変。 書きたくない。メンテ出来ない
“アプリケーション開発において品質改善や納期の短縮のための取り組みを 継続して実行していくこと”
開発
テスト
Git、Svnへの反映
デプロイ
開発
テスト
Git、Svnへの反映
デプロイ
開発
この流れを 自動化する ことが重要
“最初にテストを書き(これをテストファーストと言う)、そのテストが動作する必要最低限な実装をとりあえず行った後、コードを洗練させる”
(wikipedia引用)
https://phpunit.de/
PHPUnit
PHPUnit
・PHPのテスティングフレームワーク
・ユニットテストを記述できる
・多機能で老舗
テストコードを書く
プラグインのコードを書く
phpunitコマンドでテストを実行
PHPUnitを使った開発の流れ
アサーション
テストの期待値と実際の結果を比較してテストの成否を判定するメソッド
アサーション
・第1引数があるべき値・第2引数が実際の実行結果
アサーション
https://phpunit.de/manual/current/ja/appendixes.annotations.html
アノテーション
PHPのコメントの形式でテスト実行時のオプションを記述
アノテーション
・「@アノテーション名 引数」の形式で書く・@afterだとテストケースクラス内の各テストメソッドを実行した後に呼ぶメソッドを指定
アノテーション
https://phpunit.de/manual/current/ja/appendixes.annotations.html
WordPressで PHPUnitを使う
wp scaffold plugin <プラグイン名>
WP_UnitTestCaseというクラスを継承
テストの例
タイトルがHello!の投稿を作成
投稿のタイトルがHello!が返るかテスト
テストの例
[hello_world]というショートコードを実行
ショートコードの実行結果を検証
テストの例
テストの前にパーマリンクを設定
・go_toメソッドで/feedヘアクセス・is_feedでtrueが返るか検証
Test as a Document
Test as a Document
テストコードをメンテすることで同時にドキュメントにもなる
・PHPUnitによるテストを継続的に実施することで品質が担保される
・ドキュメントの代わりにもなるので仕様を忘れない
Travis CI
https://travis-ci.org/
Travis CI
・GitHubのアカウントがあれば使用可能なCIサービス
・GitHubへのpush時にhookしてテストを実行
・テストの設定を.travis.ymlに記載
.travis.yml
複数のPHP及びWordPressのバージョンでテストが可能
テストを実行して通ってますよという証
GitHub上にbadgeを追加
・pushのタイミングでテストを通すことが担保できる
・PHP及びWordPressの複数バージョンでの自動テスト
・テストして品質が担保されていることをGitHub上に記載できる
Travis CIのメリット
通常のデプロイ
サーバへファイルのアップ
通常のデプロイ
サーバへファイルのアップ
データベースの置換
通常のデプロイの問題点
・手作業による作業の煩雑さ
・データベースの置換で心が折れる
WordMove
https://github.com/welaika/wordmove
WordMove
・Rubyで作られたWordPress専用のデプロイツール
・DB内のURLをステージングと本番で自動で置換
・Movefileというファイルにデプロイの情報を記述