結構前に開発したツールですが、まだ記事にしてなかったので紹介します。

https://github.com/suzuki-shunsuke/durl

ファイル中の URL が壊れていないかチェックするツールです。 ファイル中の URL を抽出し、HTTPリクエストを投げてステータスコードが 2xx でないものがあった場合、異常終了します。

なお、ページ内リンク(アンカー)が壊れているものについては検知できません。

インストール

Go製で、バイナリを GitHub Releases で公開しています。

https://github.com/suzuki-shunsuke/durl/releases

Docker イメージ

https://quay.io/repository/suzuki_shunsuke/durl

busybox ベースの Docker イメージも提供しています。 CI で使うのに便利です。

使い方

durl init で設定ファイル .durl.yml を生成します。

$ durl init

durl check に対象ファイルパスのリストを標準入力として渡してください。 find コマンドなどと組み合わせると良いです。

https://github.com/suzuki-shunsuke/go-errlog/blob/v0.9.0/scripts/durl.sh#L9

find . \
  -type d -name node_modules -prune -o \
  -type d -name .git -prune -o \
  -type d -name vendor -prune -o \
  -type f -print | \
  grep -v package-lock.json | \
  grep -v Gopkg.toml | \
  grep -v Gopkg.lock | \
  durl check || exit 1

壊れた URL が見つかったら ファイルのパス、URL、HTTPのステータスコードを標準エラー出力します。

$ echo bar.txt | durl check
[bar.txt] https://github.com/suzuki-shunsuke/dead-repository is dead (404)

無視するドメイン

https://github.com/suzuki-shunsuke/durl/issues/11

これらは無視します。

  • example.com, example.org, example.net
  • localhost

設定

https://github.com/suzuki-shunsuke/durl#configuration

  • ignore_urls: 無視するURL(完全一致)のリスト
  • ignore_hosts: 無視するドメイン(完全一致)のリスト
  • http_method: HTTPリクエストのメソッド
    • head,get: HEADリクエストに失敗したらGETリクエスト
    • head: HEADリクエスト
    • get: GETリクエスト
  • max_request_count: 同時に並列でリクエストする最大数
  • max_failed_request_count: 最大の失敗URL数。これを超えると即時異常終了する
  • http_request_timeout: HTTPリクエストのタイムアウト

CI に組み込む

ドキュメントやブログをGitHubなどでホスティングしている場合、CIに組み込むことも出来ます。