HugoをGitHub ActionsでビルドしてArgo CD Image UpdaterでKubernetesクラスタにデプロイした話

Twitterでは長文書きがちのくせにブログの記事ぐらい長い文章を書くのが億劫なので、その中間ぐらいの日記・雑記を書く場所を https://diary.homi.run に用意することにした。

最初はここと同じくWordPressにしようと思っていたのだが、よく考えてみると別にWordPressじゃないと困るような複雑なことはしていないので、ちょくちょく名前の聞くHugoを利用してみることにした。

やるならそれなりにしようと思ったので、HugoをビルドしたイメージをGitHub Actionsで作成し、すでに自宅で稼働しているk0sクラスタにArgo CD Image Updaterを導入して自動でデプロイするみたいなものを作った。今回はそれについて軽くまとめておこうと思う。

GitHub ActionsでHugoから静的ファイルを作成してイメージビルド

Actionsはこんな感じ。

on:
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  push:
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: diary
    steps:
      - name: checkout
        uses: actions/checkout@v3
        with:
          submodules: true
          fetch-depth: 0
      - name: Setup Hugo
        uses: peaceiris/actions-hugo@v2
        with:
          hugo-version: '0.110.0'
          extended: true
      - name: Build hugo
        run: |
          hugo --minify
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: setup metadata 
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ghcr.io/homirun/diary
          tags: type=sha,format=long
      - name: Build and Push
        uses: docker/build-push-action@v4
        with:
          context: ./
          push: true
          tags: ${{ steps.meta.outputs.tags }}

特筆するとすればpeaceiris/actions-hugo@v2を利用していることだろうか。最初はGoとHugoをaptで落としてきていたのだが、バージョンが古かったりHugoの追加のもろもろが入らなかったりして面倒だったところに便利Actionを見つけたので利用させてもらった。

他は見たまんまでHugoから静的ファイルを出力させて、それをnginxをベースイメージにしたDockerfileでドキュメントルートにコピーしてイメージを作成しghcr.ioにpushする。

Argo CD Image Updaterの利用

Argo CD Image Updaterは、雑に説明すると定期的にコンテナレジストリを見に行って更新があればその新しいイメージを利用してDeploymentなどを作り直してくれる君。

雰囲気はこんな感じ。

公式ドキュメントに沿ってインストールした上でArgo CD Image Updaterを利用したいApplicationリソースに特定のannotationをつけるだけで良いので便利。

今回は以下のようなannotationをつけた。

annotations:
    argocd-image-updater.argoproj.io/image-list: diary-image=ghcr.io/homirun/diary
    argocd-image-updater.argoproj.io/diary-image.update-strategy: latest

update-strategyはlatestにした。latestはイメージがbuildされた日時が最新のものを選択するような設定である。pushされた日時じゃないので注意。

最終的にはこんな感じでよしなにIMAGESが更新されるようになる。

Argo CD Image Updaterでハマった点

この記事を書いている2023/3/2現在、Argo CD Image Updaterのstableは0.12.0なのだが、このバージョンでghcr.ioにあるイメージを監視させようとすると、うまくmetadataを引っ張ってこれずエラーになるようだった。

ERRO[0001] Error fetching metadata for homirun/diary:latest - neither V1 or V2 or OCI manifest returned by registry: manifest unknown: OCI index found, but Accept header does not support OCI indexes  application=test image_alias= image_name=ghcr.io/homirun/diary registry_url=ghcr.io

このバグ自体はすでにISSUE化された上で修正されていたため、https://raw.githubusercontent.com/argoproj-labs/argocd-image-updater/v0.12.2/manifests/install.yaml を利用してインストールし直したところ、うまく動くことが確認できた。

そんな感じで楽に運用できるようにしたので、飽きずにどうにか更新できることを願う。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA