CircleCIでWordpressとかのモニタリングしようぜ?


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