Hugo + CircleCIでブログを作った

前の記事の続き。
最終的にHugoにすることになった。

  • やりたいのは「記事集」みたいなやつ
    • 静的ページとフィードアイテム?みたいな区別はそこまで必要ではない
    • まして立派なトップページとかはいらないんだよなぁ〜
  • Docusaurusは寧ろstaticな「サイト」を主眼としている印象。実際、「トップにfeed並べたいなあ・・」というところで手が止まってしまった
  • 「静的サイトジェネレータ」ってスコープでいくと、(ちょっと古い記事だけど)すげーたくさんあるw
  • その中で、hugo良さそうかな〜と思っていたら会社の人にも「hugoはいいぞ〜」って聞いたので選択

という流れで。

整備にあたって、主にここら辺の記事を参考にさせていただきました。

circleci.com hori-ryota.com chroju.github.io

で、実際に書いたcircleciの設定はこんな感じ。*1

version: 2
jobs:
  build:
    docker:
      - image: felicianotech/docker-hugo:latest
    steps:
      - checkout
      - run: git config --global user.email (ここにemail)
      - run: git config --global user.name (ここに名前)
      - run: echo "machine github.com login (ここにgithub id) password $GITHUB_TOKEN" > ~/.netrc
      - run: git submodule sync
      - run: git submodule update --init --recursive
      - run: git worktree add -B gh-pages public origin/gh-pages
      - run: rm -rf public/*
      - run: hugo
      # ユーザページサイトにPushする
      - deploy:
          command: cd public && git add . && git diff --cached --exit-code --quiet || git commit -m "Rebuilding site" && git push origin gh-pages

workflows:
  version: 2
  build:
    jobs:
      - build:
          filters:
            branches:
              only: master

ちょっと無駄がありそうな気もするんだけど・・・ machine github.com login とかは要らないのかもな?ひとまず調べても試してもいないです。

  1. hugo作れる〜なdocker imageがあるのでそのまま使わせてもらう
  2. themeをsubmoduleで入れているので、checkoutしたらsyncして
  3. 今回は gh-pagesブランチを使ってるので publicディレクトリをsubtreeで gh-pagesブランチ化して*2
  4. hugo コマンドで public ディレクトリ(= gh-pagee ブランチのroot)にサイトを生成して
  5. publicディレクトリに移動して、add & commit & push
  6. workflowsで「マスターの更新があった時だけ実行」というfilterを掛けて
    • master merge時にサイトが更新されるようにする

という流れ。
もうちょいスッキリさせられる気はするけど、とりあえずこれで動く。

しかしながら感動したのは、「hugoって何やってるの?」みたいなところを理解しなくてもそのまま動いた!!という点。
多少コマンドや設定周りでドキュメントを読みはしたものの、ソースコード読んだり〜とかは全くしていない。
よいツールだなぁ〜という印象。。golangだとこんな感じでポータビリティの高いソフトを作りやすいのかな?とか思ったり。

*1:鍵の設定とか環境変数の設定は、以前に済んでいたので。

*2:公開用ディレクトリの中身を一旦rmってるのは、当初のブランチの状態が面倒くさそうだったから。