これはなに

今までポートフォリオサイトとして作成していたサイトをリニューアルしました。

今まではお手製のHTML/CSSだったので、面倒になってきたためHugoへと移行しました。

やったこと

  • 開発用のDockerfileとか作る
  • Hugoへの移行
  • GitHub Actionsの設定

Docker開発環境の作成

公式によるイメージが落ちていないようなので golang:1.14.6-alpine3.11 を使った。

これは新しめのバージョンでモジュールを使う場合は、Go言語を含んだ方がいい(要出典)という情報を見たので Alpine Linuxのイメージを採用した。

FROM golang:1.14.6-alpine3.11 AS hugo_builder

イメージにHugo に必要なものをゴニョゴニョ持ってこさせる。 (Hugoの依存等わからなかったので半ばコピペだが…)

WORKDIR /hugo
SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
RUN apk add --no-cache --virtual .build-deps wget && \
    apk add --no-cache \
    git \
    ca-certificates \
    libc6-compat \
    libstdc++ && \
    wget --quiet "${HUGO_URL}" && \
    wget --quiet "${HUGO_CHECKSUM_URL}" && \
    grep "${HUGO_NAME}.tar.gz" "./hugo_${HUGO_VERSION}_checksums.txt" | sha256sum -c - && \
    tar -zxvf "${HUGO_NAME}.tar.gz" && \
    mv ./hugo /usr/bin/hugo && \
    apk del .build-deps && \
    rm -rf /hugo

この Dockerfile を指定して、 port: 1313 を掴んで、Hugo用の ./hugo をマウントさせるように docker-compose.yml を作成した。

雰囲気で普段から Dockerを使ってるので、 image: 指定しないやり方が新鮮に感じた。

version: '3'
services:
  hugo_app:
    container_name: hugo_app
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - 1313:1313
    tty: true
    volumes:
      - ./hugo:/hugo

Hugoへの移行

これはめっちゃ楽だった。

> hugo new site

これで雛形が自動生成される。

その後お好きなテーマを ここ から探す。

これを theme/ いかに配置すればいいのだが、インターネットに転がってるように単純にgit cloneするとGitHub Actionsの時にこけるからちゃんとサブモジュールにしましょう。

hugo/theme > git submodule add YOUR_THEME.git

この後、Hugoの設定ファイルである config.toml でテーマを変更する。

ついでに言語やベースURLも変更すると良いだろう

baseURL = "http://hoge.fuga/"
languageCode = "ja-ja"
title = "TITLE_NAME"
theme = "THEMA_NAME"

GitHub Actionsの設定 CI編

これは .github/workflow 直下に設定yaml作ればいい感じにしてくれる。

これもイメージが必要なのだが、面倒なので人様が作成してるのを拝借する。

今回は、peaceiris/actions-hugoを使った。

ちなみに GitHub Actionのyamlもサンプルが公開されているのでそれを用いれば良い。

ただ、ビルドオプションに --minify がついているがこのままだとテーマによっては怒られが発生するので、自分は外した。

GitHub Actionsの設定 Deploy編

自分はさくらインターネットのレンタルサーバを利用しているため、masterへのcommit(本当はPRのmergeのみにブロックしたい)をトリガーに自動でデプロイしてくれるように設定を行う。

と言っても hugo コマンドで public/ 直下に静的ファイルが生成されるのでそれらを全部サーバーへとrsyncで送るだけで済む。 便利。令和最高。(GitHub Actionsは平成から存在するが)

が問題なのは sshを通したり、デプロイ用のユーザーが見えないように保護しないといけないことである。

がこれも簡単で、リポジトリ設定の中に Secrets というのがあり、定数定義ができる。

これに秘密鍵から全部入れ込んで仕舞えば問題ない。

      - name: Generate ssh key
        run: echo "$SSH_PRIVATE_KEY" > key && chmod 600 key
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          
      - name: Deploy
        run: rsync -rlptgoD --delete --exclude ".git/" -e "ssh -i ./key -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null " hugo/public/ $SSH_USER@$SSH_HOST:$DEPLOY_PATH
        env:
          SSH_USER: ${{ secrets.SSH_USER }}
          DEPLOY_PATH: ${{ secrets.DEPLOY_PATH }}
          SSH_HOST: ${{ secrets.SSH_HOST }}

secrets.HOGE で設定してある文字列を参照できる。これを env: で再定義し、runコマンドで参照する。

また自分は Hugo階層を1つ組んだのでちゃんとパスは考えないといけない。(1敗)

恐らく全てリポジトリのカレントで実行する感じになってる。

まとめ

数時間で大体できた。 インターネットは偉大。

自分で書けないCSSを触らないで済むのが嬉しい。 うまくmasterブランチの保護設定ができたら、public リポジトリに変更しないなぁ…