背景

以下でActを利用してローカルで動かそうとしました。しかし、自分で解決できなさそうなエラーが出力されたので、いったん諦めました。

調べると、セルフホストランナーの存在を知りました。自分の環境でGitHub Actionsが動くというではないですか。これは素晴らしいと思い、次はこれに挑戦してみることにしました。

以下のGitHubのドキュメントに書いてありますね。

自分のランナーをホストする - GitHub Docs

セルフホストランナーを動かす環境

使用している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上でセルフホストランナーを動かすことができるようなことが書いてました。これも試してみたいです。

GitHub Actions のデバッグをローカルで行う