Jekyll を使ったブログのプレビューと CI を Docker 上で行う


このブログで新しい記事を作成する際の preview サーバ起動や CI 上での記事コンパイルを Docker 上で行えるようにした。

image は envygeeks/jekyll-docker を使用。以下のような docker-compose.yml を blog ディレクトリ直下に用意してローカルプレビューできるようにしてる。

version: "3.8"
services:
  jekyll-build:
    command: jekyll serve --incremental --future --unpublished --watch --force_polling --livereload
    environment:
      TZ: Asia/Tokyo
    image: jekyll/minimal
    ports:
      - 4100:4000
      - 35729:35729
    volumes:
      - $PWD:/srv/jekyll

CI (GitHub Actions) 上では以下のコマンドで本番用にサイトをコンパイルし HTML ファイルを生成する。

docker-compose run -e JEKYLL_ENV=production -e JEKYLL_UID=1001 -e JEKYLL_GID=116 --rm jekyll-build jekyll build

コンパイルした HTML ファイルはマウントしたホストディレクトリ側 (GitHub Actions 上)に書き出されるため、UID/GID を適切に設定しないと書き込み権限エラーが発生する。

/usr/local/lib/ruby/2.7.0/fileutils.rb:250:in `mkdir': Permission denied @ dir_s_mkdir - /srv/jekyll/.jekyll-cache (Errno::EACCES)

id コマンドを叩いて GitHub Actions 上にファイル作成する際必要な UID/GID を確認する。

# Run id
uid=1001(runner) gid=116(docker) groups=116(docker),4(adm),101(systemd-journal)

jekyll-docker は README にもあるように、JEKYLL_UIDJEKYLL_GID(それぞれ初期値 1000)2 つの環境変数の値でユーザ作成とファイル書き込みをしている。 CI で実行する際はここで確認した UID/GID をセットしておく。
https://github.com/envygeeks/jekyll-docker#configuration