GitHub Actions で Hugo のサイト生成と公開を自動化する

Hugo を導入してホームページ更新は楽になりました。

blog.kondoumh.com

ただ、「ビルド時の環境変数設定を忘れて Google Analytics のトラッキング ID が生成されてなかった」など凡ミスがあったり、生成したファイルをアップロードするのが面倒だったりと、まだ自動化の余地があります。

Netlify が使えれば超楽ですが、レンタルサーバーに配置してるので、ページの Markdown ファイルを編集して GitHub に push したら生成・公開してくれるとよいかなと。

自分のアカウントではすでに GitHub Actions が有効になっています。

blog.kondoumh.com

ということで、以下のステップからなるワークフローを追加してみました。

  • Hugo をインストール
  • サイトのコードを theme 用の submodule を含めて clone
  • hugo コマンドを実行して generate
  • 成果物を upload-artifact で保存
  • レンタルサーバーにアップロード

実際のワークフロー定義です。

name: Generate and publish site

on: [push]

jobs:
  build:

    runs-on: ubuntu-latest
    
    steps:
    - name: install hugo
      run: |
        curl -L https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz
        sudo mv hugo /usr/local/bin/hugo
      env:
        HUGO_VERSION: 0.57.2

    - name: checkout
      uses: actions/checkout@v1
      with:
        submodules: true

    - name: generate
      run: HUGO_ENV=production hugo

    - name: archive
      uses: actions/upload-artifact@master
      with:
        name: public
        path: ./public

    - name: publish
      run: |
        pushd ./public
        find . -type f -exec curl --ftp-create-dirs -T {} ftp://${{ secrets.FTP_USER }}:${{ secrets.FTP_PASSWD }}@${{ secrets.FTP_HOST}}/${{ secrets.ROOT_PATH}}/{} \;
        popd

Hugo のインストールは、curl でバイナリをダウンロードして、/usr/local/bin に配置するだけ。超シンプルです。sudo が必要だったので Action は non-root ユーザーで実行されるようですね。

インストールする Hugo のバージョンは 環境変数 HUGO_VERSION に設定してます。現状、環境変数は外部からは与えられないようです。

checkout action で submodules を true にすれば、clone 時に submodules も更新してくれます。

レンタルサーバーにアップロードするための秘密情報は、リポジトリに設定された secrets に設定してます。

f:id:kondoumh:20190914223552p:plain

${{ secrets.NAME_OF_ENV }} の形式で取得可能です。secrets を環境変数のように使えなくもないですが、一度設定してしまうと値を閲覧することすらできないのでやはり秘密情報専用に使う方がよいでしょう。

レンタルサーバが FTP しか受け付けないので、生成したファイルを curl で FTP アップロードするワンライナーを実行しています。

実行結果です。

f:id:kondoumh:20190914224518p:plain

うまくいきました。

これで、ホームページ更新のワークフローが自動化され GitHub リポジトリで完結するようになりました。