やりたいこと

lycheeというRust製のリンク検査ツールがある。

今回はHugoで作成したブログのデッドリンクをlycheeで検出するためのシェルスクリプトを作る。

環境

  • Hugo 0.146.6
  • PaperMod (commit 7cf752f8644fea1fc3dc7299352718d492c55182)
  • lychee 0.18.1

lycheeのインストール

詳細は公式のGitHubを参照。

自分はbrewでインストールした。

brew install lychee

シェルスクリプト

まずは実際に作成したシェルスクリプトを見てみる。

lychee/check.sh
#!/bin/bash

rm -rf public/

hugo server -p 13131 &
HUGO_PID=$!

while ! nc -z localhost 13131; do
    sleep 0.5
done

lychee public/ --base="http://localhost:13131" --exclude="amzn.to" --exclude="a.r10.to"

kill $HUGO_PID

一行ずつ見ていこう。

1. rm -rf public/

public/ディレクトリを削除する。

Hugoはビルドした結果をpublic/に格納する。

もし記事を削除しても、public/にビルドファイルが残っている可能性がある。

そのような記事はリンク検査の対象にしたくないので、一旦public/を削除してから次のステップ2でもう一度ビルドする。

2. hugo server -p 13131 &

ポート13131でHugoのサーバを起動する。このとき同時に再ビルドも行われる。

&をつけることで処理をバックグラウンドで実行することができる。

bashではプロセスが終わらない限り次の処理へ進まないので、サーバのようなずっと起動し続ける処理は&をつけてバックグラウンドで実行する必要がある。

ポートは13131を指定しているが、これはデフォルトの1313を避けるためである。

ポートが衝突するとエラーが出てしまうので使わなそうなポートを適当に指定している。

3. HUGO_PID=$!

あとからサーバを終了するためにプロセスIDを取得しておく。

4. while ! nc -z localhost 13131; do sleep 0.5; done

ncコマンドを使って、ポート13131が開いているか確認する。

HugoはGo製の高速なツールだが、とはいえサーバの起動にはわずかに時間がかかる。

サーバが起動する前にlycheeを実行してしまうと、エラーが返ってしまうのでポートを確認することでサーバが起動するまで待機する。

5. lychee public/ --base="http://localhost:13131" --exclude="amzn.to" --exclude="a.r10.to"

lycheeを実行する。

public/を指定することで、ビルドしたファイルを検査する。

--baseオプションでベースURLを指定する。

--baseを付加することで相対パスがある場合にベースURLを付加してくれる。

たとえばビルドされたファイルに/assets/css/~~のような相対パスがあれば、これをhttp://localhost:13131/assets/css/~~のように変換してからリンク検査をしてくれる。

--excludeオプションでは除外するURLを指定する。

lycheeは実際にHTTPリクエストを投げてリンクを検査する。

amzn.toa.r10.toのようなアフィリエイトに何度もリクエストをすると自作自演を疑われてBANされる可能性があるので(実証したわけではないので本当にBANされるかは不明)、念のために除外しておく。

6. kill $HUGO_PID

サーバを終了する。

まとめ

実際に実行したら以下のような感じになった。

Issues found in 1 input. Find details below.

[public/posts/hugoで外部リンクを新規タブで開くようにする/index.html]:
     [404] https://github.com/gohugoio/hugo/blob/master/tpl/tplimpl/embedded/templates/_markup/render-link.html | Network error: Not Found

🔍 1155 Total (in 3s)1146 OK 🚫 1 Error 👻 8 Excluded
   [WARN ] There were issues with GitHub URLs. You could try setting a GitHub token and running lychee again.

HugoのGitHubのリンクが1つ死んでいた。

Hugoは破壊的変更が多いっすな。