rcmdnk’s blog

Posted in Blog Tagged as Octopress, TravisCI

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

Link Check Free 1.3

ブログの中でリンクが間違ってたりしないかとかリンク切れしてないかとかを 検索するツールは沢山ありますが、 LinkChecker というのが使い勝手が良いのでたまにGUIで使っていました。

LinkCheckerコマンドラインでも使えるので、 これを使ってリンクチェックをTravis CI上で自動化してみます。

ここではOctopressをGitHubにデプロイしてる場合の方法ですが、 GitHub Pagesを使ってる様な場合であれば同じような事ができるかと思います。

スポンサーリンク

GitHub側での準備

まず、GitHub Pagesに使ってるレポジトリに対して Travis CI側からpush出来る様に鍵を登録します。

下に従って鍵を作って公開鍵をGitHub側に登録しておきます。

Travis CIのテストの中でGitHubのレポジトリへpushする)]

適当なディレクトリに行って、

$ ssh-keygen -t rsa -C "linkchecker with Travis CI"

鍵の場所を聞かれたら./.travis_rsa を出力先として指定して鍵を作ります。 ここで作られた.travis_rsa.pubの中身がGitHub側に登録するものです。 さらに作られた.travis.rsaを暗号化します。

$ travis encrypt-file -r rcmdnk/rcmdnk.github.io .travis_rsa

travis encrypt-fileで出てくるopenssl...というメッセージはあとで .travis.ymlに加えるのでメモっておきます。

さらに.travis_rsa.encが出来ているはずで、これを下に書く様に Octopressの中に持っていきます。

秘密鍵の.travis.rsaはもう必要ないので漏らさないようにきっちり消しておきます。 (決してこれをOctopressに入れてはダメです。 うっかり消し忘れる可能性があるので、上の作業はOctopressのディレクトリ以外で やった方が安全。)

Travis CI側での準備

次にTravis CI側で該当レポジトリをテスト対象として設定します。 このページはrcmdnk.github.ioレポジトリを使ってるのでそれを設定。

レポジトリの設定ではBuild Only if .travis.yml is present という設定だけONにしておきます。

Travis CIを使ってみた: GitHubのレポジトリにバッジを貼りたかったから)]

Octopressでの設定

最初にGitHubへ鍵を登録する所で作った鍵を暗号化したものを (.travis_rsa.encとします)をsource/ディレクトリに持ってきます。

さらにsource/ディレクトリに以下の様な.travis.ymlを作ります。

.travis.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
language: python
env:
  global:
    - GIT_COMMITTER_NAME=rcmdnk
    - GIT_COMMITTER_EMAIL=rcmdnk@gmail.com
    - GIT_AUTHOR_NAME=rcmdnk
    - GIT_AUTHOR_EMAIL=rcmdnk@gmail.com
before_install:
  - openssl aes-256-cbc -K $encrypted_ee14946e6582_key -iv $encrypted_ee14946e6582_iv -in .travis_rsa.enc -out .travis_rsa -d
  - cp .travis_rsa ~/.ssh/id_rsa
  - chmod 600 ~/.ssh/id_rsa
  - git config --global push.default simple
install:
  - curl -L -O https://pypi.python.org/packages/source/L/LinkChecker/LinkChecker-9.3.tar.gz
  - tar xzf LinkChecker-9.3.tar.gz
  - cd LinkChecker-9.3
  - pip install LinkChecker
  - cd ../
  - 'if [ "$TRAVIS_BRANCH" = master ];then git checkout $TRAVIS_BRANCH;else git checkout -b $TRAVIS_BRANCH origin/$TRAVIS_BRANCH;fi'
script:
  #- linkchecker -o html http://rcmdnk.github.io/  > linkchecker.html
  - 'linkchecker -o html http://rcmdnk.github.io/  > linkchecker.html || :'
  - git add linkchecker.html
  - git commit -m "Added linkchecker.html [ci skip]"
  - git remote set-url --push origin git@github.com:rcmdnk/rcmdnk.github.io
  - git push
#notifications:
#    email:
#      #on_success: change
#      #on_failure: always
#      on_success: never
#      on_failure: never
  • globalの所にあるGitHubのアカウント設定適時変更。
  • before_installopenssl...は上で鍵を暗号化する時に表示されるメッセージに出るものをコピー。
  • git cloneしてくるものも適時設定。

そんな感じの変更で使える様になると思います。

上でlanguageをpythonにしてるのは Linkcheckerのインストールにpip installを使うのですが、 これがlanguageがpython以外の時には インストール途中でPermission deniedが出てしまうので それを回避するためです。

実行する時には特定の言語のバージョンが必要だったりするわけではないので 上の理由でpython指定で。

Travis CIでは最初にrcmdnk.github.ioレポジトリをcloneしてくるわけですが、 git://github.com/...といったgitプロトコルを使うので sshを使ったpushが出来ません。

なので、pushのremote hostをgit@github.com:...としてsshプロトコルへ変更しています。

またTravis CIではcloneした後に、実際にトリガーをかけたコミット状態をチェックアウト するので、それを一度現状のブランチに戻しています。 (ここではmasterがメインブランチになってると仮定。)

後はlinkcheckerでURLをチェック。 -o htmlでHTML形式で結果を出力してくれるのでそれをそのまま レポジトリのトップにlinkchecker.htmlとして置いてそれを 加えてコミットします。

コミットメッセージには必ず[skip ci](もしくは[ci skip])を入れてください。 これが入っているとTravisはそのコミットが入ったpushに対しては ジョブを実行しなくなります。

入れておかないとTravisでのpush自体がトリガーとなって無限にチェックし続けてしまいます。

今のところ結構リンク間違いや切れが多かったので、 上ではlinkcheckerの終了コードが0出ない場合もエラーにならないよう || :を加えています 1

notification部分も好き好きですが、取り敢えず、 今はlinkcheckerの部分は必ず成功する様になってるので、 それ以外でおかしいことが起こったらメールを送るようにデフォルトにしておきます 2

きちんとリンク処理が出来て通常はエラーにならなくなったら linkcheckerコマンド部の|| :を外して エラーが出たらメッセージが来るようにしておけば完璧になります。

また、リンク切れでもそのまま残しておきたい場合や テスト様に敢えて間違ったリンクを書いてあるなどすでに理解していて チェックの必要がない場合、

linkchecker --ignore-url=http://example.com ...

みたいに--ignore-urlを使うとその文字列を含むURLは無視するようになります。 ここで指定するものは含む物を無視するようになるので、 例えば上だとexampleだけでもhttp://example.comの全てのURLを無視する様になります。 また、^などの正規表現も使えます。

--ignore-urlは複数指定できるので、必要ないものを全てこれで加えておくことで 余計なエラーを見ずに済むように出来ます。

Man page of LINKCHECKER

結果を見る

上の結果はhttp://rcmdnk.github.io/linkchecker.html で見られる様になります。

敢えて公開しなくても良いものですが、敢えて隠す必要も無いので 簡単に見れるのでそのまま同じサイトにおいてあります。

取り敢えず見ると 英語版ブログ の方で、/enの階層が余計に加わってたりきちんと処理できてない物が沢山。。。 テーマでいじった所が悪い部分もあるしOctopressデフォルトでも問題がありそうな ところもありますが、 取り敢えず、チェックが常にアップデートされる様になったので、 少しずつ改善していきます。。。

スポンサーリンク
  1. linkcheckerの返り値が0以外なら:を実行。 :は何もしないコマンドなのでそのまま返り値0。 結果、何があろうとこの文は成功になります。

  2. デフォルトでは成功時(on_success)ではchange、つまり前まで失敗してたのが 成功した時、 また、失敗時(on_failure)にはalwaysで常に送る様になっています。

Related Posts Plugin for WordPress, Blogger...