背景
以下でActを利用してローカルで動かそうとしました。しかし、自分で解決できなさそうなエラーが出力されたので、いったん諦めました。
調べると、セルフホストランナーの存在を知りました。自分の環境でGitHub Actionsが動くというではないですか。これは素晴らしいと思い、次はこれに挑戦してみることにしました。
以下のGitHubのドキュメントに書いてありますね。
セルフホストランナーを動かす環境
使用しているM1のMacBookAirで動かすことを考えましたが、作業が重くなるのは避けたいこともあり、Ubuntu22.04のサーバーを使用することにしました。
手順
GitHubでの設定
以下の画面の矢印で示した「New self-hosted runner」をクリックします。これだけです。
ローカルサーバーでの設定
あとは、画面に表示されるコマンドをその通りに入力すればOKです。
この手順に従ってコマンドを入力するだけです。以下のコマンドのトークンは適当なものに書き換えてます。
./config.sh --url https://github.com/yamadatt/hugo-luna-photo --token AAAAAAAAAAAAAAAAA
このコマンドで以下のように出力されます。入力を求められますので、デフォルトの意味で全てにお解答にエンターキーを押しました。
```--------------------------------------------------------------------------------
| ____ _ _ _ _ _ _ _ _ |
| / ___(_) |_| | | |_ _| |__ / \ ___| |_(_) ___ _ __ ___ |
| | | _| | __| |_| | | | | '_ \ / _ \ / __| __| |/ _ \| '_ \/ __| |
| | |_| | | |_| _ | |_| | |_) | / ___ \ (__| |_| | (_) | | | \__ \ |
| \____|_|\__|_| |_|\__,_|_.__/ /_/ \_\___|\__|_|\___/|_| |_|___/ |
| |
| Self-hosted runner registration |
| |
--------------------------------------------------------------------------------
# Authentication
√ Connected to GitHub
# Runner Registration
Enter the name of the runner group to add this runner to: [press Enter for Default]
Enter the name of runner: [press Enter for ubuntu2204]
This runner will have the following labels: 'self-hosted', 'Linux', 'X64'
Enter any additional labels (ex. label-1,label-2): [press Enter to skip]
√ Runner successfully added
√ Runner connection is good
# Runner settings
Enter name of work folder: [press Enter for _work]
√ Settings Saved.
セルフホストランナーを起動します。
./run.sh
なお、sudoを使用しての起動はできません。以下のように"Must not"と怒られます。
sudo ./run.sh
Must not run interactively with sudo
Exiting runner...
ubuntu-latestからself-hostedに変更
runn-onをself-hostedに変更します。これでセルフホストランナーで動くようになります。
jobs:
deploy:
env:
HUGO_VERSION: ${{ github.sha }}
TZ: Asia/Tokyo
# runs-on: ubuntu-latest
runs-on: self-hosted
対応したエラー
これだけで動くと思っていた自分が浅はかでした。というのも、GitHub Actionsでそれなりに動いていたので、セルフホストランナーに変わったとしても動くだろうと思っていたためです。
そんなことはなく、出てきたエラーを解析しながら少しずつ解決して動かしました。
ディレクトリのパーミッションが不足している
以下のエラーメセージが出力されます。
Hugoのビルド時、ローカルの/tmp/hugo_cache/配下にディレクトリを作成して、それを削除するという動きがあります。ここでパーミッションがないとエラーになるのです。
Run echo "HUGO_VERSION -> $HUGO_VERSION" && hugo --gc --minify --cleanDestinationDir
HUGO_VERSION -> 449e1b767cdb82d9307fe5eb4a6464d6b369a1cb
Start building sites …
hugo v0.104.3-58b824581360148f2d91f5cc83f69bd22c1aa331+extended linux/amd64 BuildDate=2022-10-04T14:25:23Z VendorInfo=gohugoio
WARN 2022/11/05 14:56:39 Content directory "/home/yamadatt/git/hugo-luna-photo/actions-runner/_work/hugo-luna-photo/hugo-luna-photo/content/ja/posts" have both index.* and _index.* files, pick one.
Error: failed to prune cache "getcsv": remove /tmp/hugo_cache/hugo-luna-photo/filecache/getcsv: permission denied
Total in 50222 ms
Error: Process completed with exit code 255.
パーミッションを与えればいいのですが、パーミッション変更はsudoが必要です。
最初に試したのが、sudoで./run.shすることです。が、上述したようにsudoは使えませんでした。
ということで、
HugoのBuild直前にこのコマンドを追加しました。
- name: change permission
run: sudo chown -R $USER:$USER /tmp/hugo_cache/
これでパーミッションのエラーは回避されるのですが、./run.shしている画面でsudoのパスワードを聞かれます。
$ ./run.sh
√ Connected to GitHub
Current runner version: '2.298.2'
2022-11-05 21:20:02Z: Listening for Jobs
2022-11-05 21:20:06Z: Running job: deploy
[sudo] yamadatt のパスワード:
追記。
/tmp/hugo_cache/はOSをリブートすると消えてしまうので、ディレクトリがないというエラーが出力された。そのため/tmp/にパーミッションを与えた。
Netlifyへのデプロイができない
Netlifyへのデプロイは以下を使用しました。
Netlify Actions · Actions · GitHub Marketplace
上記ページのサンプルをそのまま使用しました。
そのまま使用すると期待通りに動かないので、以下を変更しています。
変更点1
publish-dir:
をhugoコマンドで静的ファイルが作成される'./public'
に変更しました。
変更点2
production-branch:
をmaster
からmain
に変更しました。
これはmasterだとproduction用のURLに静的ファイルが公開されなかったためです。
応答がなくなる
./run.shが固まって、応答がなくなりました。その際は以下のメッセージが出力されていました。
Runner connect error: The HTTP request timed out after 00:01:00.. Retrying until reconnected.
Ctrl+Cで終了させようとしましたが、これができません。そこで、killしました。
kill -9
すると以下のメッセージが出力されて、強制的に終了させることができました。
Runner listener exit with 0 return code, stop the service, no retry needed.
## 試してみたい
以下の記事にDokder上でセルフホストランナーを動かすことができるようなことが書いてました。これも試してみたいです。