rcmdnk's blog

20150529_linkchecker_200_200

Travis CIを使ってブログのリンクチェックを自動化する で書いたように LinkChecker というツールを使ってリンク切れとか間違いをチェックしています。

これが最近不安定でネットワークエラーみたいなものが出るように なってきたのでそれに対する対処について。

Travis CIでLinkcheckerを動かしてブログのリンクを自動チェック

このブログは最終的にGitHubのGitHub Pagesとして公開されていますが、 そこに行くまでに次の様な手順を踏んでいます。

  • ソースの管理はBitbucket。
    • それをDropbox内にcloneしておく。(複数の端末で直接同期)

GitHub pages + Octopressの導入

  • 編集したらBitbucketにpush。
  • Bitbucketに新しい変更がpushされるとwerckerに送られて自動でビルド、 GitHubの公開用レポジトリにビルドしたものがデプロイされる。 (この時点で一旦最初の公開。)

werckerを使ってBitbucketのプライベートレポジトリからOctopressを自動デプロイする

  • GitHubのレポジトリにデプロイされるとそれを今度はTravis CIが感知して Linkcheckerをブログに対して走らせる。 その結果を取ってきたレポジトリのトップにlinkchecker.htmlとして新たに保存しpushする。

Travis CIを使ってブログのリンクチェックを自動化する

ということを行っています。 手元でやることは新しく更新して、必要なポストをpublished: true に変更してcommit & pushだけですが、 しばらくするとリンクチェックの結果も linkchecker.html に出るようになります。 (上のLinkcheckerでチェック中はPreparing in travis...というメッセージが出る。)

Travis CIではエラーが出た時にメールとかでお知らせしてくれる機能があるので、 Linkcheckerがエラー終了した時(何らかのリンクエラーが有る時) お知らせしてくれる様にしておくとリンクエラーがある時に直ぐに知ることが出来ます。

最近起こっている問題

昨年11月に設定してから結構便利に使ってたんですが、 たまにTravis CIから外にアクセスするのは結構ネットワークが不安定なのか、 単にページにアクセス出来なかった、というエラーが出る事がありました。 ただし、直ぐにそのリンクをチェックしてみると何も問題なく、 再びLinkcheckerを走らせるとエラーが消えます。

この様な事はたまーに起こる程度(毎日アップデートして週に1回あるかないか) だったので余り気にしていませんでしたが 最近

Error: ConnectionError: ('Connection aborted.', BadStatusLine('\x17\xcdx\x18\x80\xef$\xed\x91\xe7j\x8fw@\xce\xe6\x0f\x07\xf8\x0cO\x89\x17\xac\x81\xbd\xcc\x17\x9a\xfb\xccA\xce\x0c\xec%_\x10\x11gGP7\x87\xf4HND\x8ccK\x89R<\x99)\xb7\x96h\x92d}\xbe\x80...

みたいなエラーが頻発するようになりました。

linkchecker

このエラーは実際にURL https://rcmdnk.github.io/images/post/20150504_rightclickmenu.jpg に対して出たエラーですが、このファイルはきちんと見れますし、 一度入れてから変更されてません。

また、このエラーは一度に大量に出るのですが、 毎回違うリンクがエラーになります。

なので、それぞれ根本的な問題なわけではないので無視しています。

また、たまに新しいポストでリンクをミスってしまうことがありますが、 その時にはきちんと

Error: 404 Not Found

のエラーが出ます。

この様なエラーが出た時にきちんと対処したいわけですが、 このままでは常にエラーが出るのでTravis CIからの連絡で 本当に対処すべきエラーなのかどうか区別出来ません。

対処法

Linkcheckerの中で上のConnectionErrorが無視できる様になればよいのですが、 現在は出来ない模様。

BadStatusLine errors · Issue #563 · wummel/linkchecker

ソースを自分でいじっても良いのですが、 今回は取り敢えずTravis CIの中でlinkchecker自体のコマンドの返り値は無視して、 実際アウトプットファイルの中に ConnectionError以外のエラーがあるかチェックしてTravisジョブの 最終結果に渡す事にしました。

1
2
3
4
5
6
   - 'if [ "$TRAVIS_BRANCH" = master ];then git checkout $TRAVIS_BRANCH;else git checkout -b $TRAVIS_BRANCH origin/$TRAVIS_BRANCH;fi'
 script:
-  - linkchecker -o html --ignore-url=aaaaaaaaaaa --ignore-url=http://rcmdnk.github.io/en/wrong http://rcmdnk.github.io/  > linkchecker.html
+  - 'linkchecker -o html --ignore-url=aaaaaaaaaaa --ignore-url=http://rcmdnk.github.io/en/wrong http://rcmdnk.github.io/  > linkchecker.html || :'
+  - '! grep Result linkchecker.html |grep -q -v "ConnectionError"'
   - git add linkchecker.html

こんな感じで.travis.ymlを変更しました。

linkcheckerコマンド自体は後ろに|| :を加える事で 失敗した場合にはその後で何もせずに成功を返す:で終わる様に。

その後でアウトプットのlinkchecker.htmlを見て、 中に何らかのConnectionError以外の結果がある場合には Falseを返す結果になるようなコマンドを付け加えています。

とりあえずこれでConnectionErrorだけの結果の時には Travis CIから連絡が来ないようになり、 404 Not Foundな状態とかに直ぐに気づける様になりました。

Sponsored Links
Sponsored Links

« Unixで最後にリブートした時を確認する Analyticsに現れるスパムなURL達に関して »

}