Wordpressでリンクが壊れていて機会損失した経験はありますか?
海外からアクセスしたWordpressのパフォーマンスが悪すぎて機会損失した経験はありますか?
この記事では、Wordpressや任意のサイトを自動でテストして、それらの機会損失を予防する方法をご紹介します。
自動テストの発想
Jekyll、Hugoなどの静的ファイルジェネレータやNuxt.jsはサイトas codeになっているので、CircleCIで自動テストしやすいですよね。
WordpressはDBで管理されているので、同じようにはいきませんが、本番環境のWordpressをCircleCIでチェックすれば良いです。
Wordpressのなんらかの更新からCircleCIをトリガーできれば、デプロイ前のチェックができないこと以外は、実質同じような状態にできます。
リンクチェックプラグインは漏れる
内部でリンクチェックしてくれるツールはありますが、
プラグインをいろいろ使っていると、
チェックはパスしても、外部から見て破綻していることがあります。
テスト実行用のDocker image
イメージ名: contribu/webtester
dockerhub: https://hub.docker.com/r/contribu/webtester
リポジトリ: https://github.com/contribu/webtester
CircleCIから使う方法
CircleCI用のリポジトリを作り、
以下のようなconfig.ymlを配置。
version: 2
jobs:
build:
docker:
- image: contribu/webtester
environment:
- LANG: ja_JP.UTF-8
- LANGUAGE: ja_JP.UTF-8
- LC_ALL: C.UTF-8
working_directory: ~/repo
steps:
- checkout
- run:
name: run tests
command: |
cd /app
mkdir -p /tmp/test_results
bundle exec ruby main.rb test \
--seed_urls=https://example.com/ \
--allowed_url_patterns="https://example\.com" \
--interval=1 \
--timeout=60 \
> /tmp/test_results/result.html
- store_test_results:
path: /tmp/test_results
- store_artifacts:
path: /tmp/test_results
destination: test_results
結果の見方
/tmp/test_results/result.html に出力しています。
CircleCIならアーティファクトから見れます。
- Size: バイト数
- Total Time: リクエストを開始してからダウンロードが完了するまでの時間
- From Link Count: 被リンクページ数 (allowed_url_patternsに含まれるもののみカウント)
動作
seed_urlsで与えられたURLを起点に、allowed_url_patternsで与えた正規表現パターンに一致するURLをクロールし、最後にレポートを出力します。
intervalについて
allowed_url_patternsで与えた正規表現パターンに一致しないURLはリクエストを飛ばしません。
allowed_url_patternsが自分で管理するサーバーのみの場合は、intervalは小さめで大丈夫だと思います。
allowed_url_patternsに自分で管理するサーバー以外のサーバーが含まれる場合は、intervalが違法にならないように注意してください。
CircleCIのサーバーの場所
少なくとも日本以外っぽいです
https://discuss.circleci.com/t/where-are-the-build-servers-located-geographically/20571
テスト
--tests=/path/to/test1.rb /path/to/test2.rb
このようにしてテストを追加できます。デフォルトで、not foundとinterval server errorをチェックするテストがついています。
テストは以下のように書きます。インターフェースはtestのみです。
以下の変数を組み合わせてテストし、エラーにする場合は{ error: "error message" }を返します。
result[:url]
result[:status]
result[:total_time]
result[:size]
result[:from_urls]
result[:to_urls]
register_test(
test: lambda do |result|
if result[:status] >= 400 && result[:status] < 500
{
error: 'Not Found'
}
end
end
)
ライセンス
この記事に掲載されたコードのライセンスはCC0