Travis CIを使ってブログのリンクチェックを自動化する で書いたように LinkChecker というツールを使ってリンク切れとか間違いをチェックしています。
これが最近不安定でネットワークエラーみたいなものが出るように なってきたのでそれに対する対処について。
Travis CIでLinkcheckerを動かしてブログのリンクを自動チェック
このブログは最終的にGitHubのGitHub Pagesとして公開されていますが、 そこに行くまでに次の様な手順を踏んでいます。
- ソースの管理はBitbucket。
- それをDropbox内にcloneしておく。(複数の端末で直接同期)
- 編集したらBitbucketにpush。
- Bitbucketに新しい変更がpushされるとwerckerに送られて自動でビルド、 GitHubの公開用レポジトリにビルドしたものがデプロイされる。 (この時点で一旦最初の公開。)
- GitHubのレポジトリにデプロイされるとそれを今度はTravis CIが感知して Linkcheckerをブログに対して走らせる。 その結果を取ってきたレポジトリのトップにlinkchecker.htmlとして新たに保存しpushする。
ということを行っています。
手元でやることは新しく更新して、必要なポストを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...
みたいなエラーが頻発するようになりました。
このエラーは実際にURL https://rcmdnk.github.io/images/post/20150504_rightclickmenu.jpg に対して出たエラーですが、このファイルはきちんと見れますし、 一度入れてから変更されてません。
また、このエラーは一度に大量に出るのですが、 毎回違うリンクがエラーになります。
なので、それぞれ根本的な問題なわけではないので無視しています。
また、たまに新しいポストでリンクをミスってしまうことがありますが、 その時にはきちんと
Error: 404 Not Found
のエラーが出ます。
この様なエラーが出た時にきちんと対処したいわけですが、 このままでは常にエラーが出るのでTravis CIからの連絡で 本当に対処すべきエラーなのかどうか区別出来ません。
対処法
Linkcheckerの中で上のConnectionErrorが無視できる様になればよいのですが、 現在は出来ない模様。
ソースを自分でいじっても良いのですが、
今回は取り敢えずTravis CIの中でlinkchecker
自体のコマンドの返り値は無視して、
実際アウトプットファイルの中に
ConnectionError以外のエラーがあるかチェックしてTravisジョブの
最終結果に渡す事にしました。
1 2 3 4 5 6 |
|
こんな感じで.travis.ymlを変更しました。
linkchecker
コマンド自体は後ろに|| :
を加える事で
失敗した場合にはその後で何もせずに成功を返す:
で終わる様に。
その後でアウトプットのlinkchecker.html
を見て、
中に何らかのConnectionError以外の結果がある場合には
Falseを返す結果になるようなコマンドを付け加えています。
とりあえずこれでConnectionErrorだけの結果の時には Travis CIから連絡が来ないようになり、 404 Not Foundな状態とかに直ぐに気づける様になりました。