CloudBuildでブログの自動公開

こんにちは松原です。

このEngineer blogですが、HugoというGo言語で実装された静的ファイル作成ツールによってページ作成をしています。
このブログを公開するまでの流れとしては、gitリポジトリからローカルへcloneを行い、Markdown記法でファイルを作成し、HugoコマンドにてHTMLファイルに変換、その後にGCSへとアップロードを行なっています。
今回はCloudBuildを使い、ビルドから公開までを自動化していきたいと思います。

Hugoのイメージを作成

Hugoの公式のDockerイメージはないため、Dockerイメージを作成していきます。

FROM alpine:3.13.0

ENV HUGO_VERSION='0.80.0'
ENV HUGO_NAME="hugo_extended_${HUGO_VERSION}_Linux-64bit"
ENV HUGO_BASE_URL="https://github.com/gohugoio/hugo/releases/download"
ENV HUGO_URL="${HUGO_BASE_URL}/v${HUGO_VERSION}/${HUGO_NAME}.tar.gz"
ENV HUGO_CHECKSUM_URL="${HUGO_BASE_URL}/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_checksums.txt"

SHELL ["/bin/ash", "-eo", "pipefail", "-c"]
RUN apk add --no-cache --virtual .build-deps wget && \
    apk add --no-cache \
    bash \
    libc6-compat \
    libstdc++

WORKDIR /hugo

RUN 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 && \
    rm -rf /hugo && \
    apk del .build-deps

WORKDIR /workspace

ENTRYPOINT ["/usr/bin/hugo"]

CloudBuildで動かすため、WORKDIRはデフォルトの/workspaceにしています。
こちらのDockerfileからDockerイメージを作成し、GCRへpushします。

docker build -t asia.gcr.io/xxxxxxxx/hugo .
docker push asia.gcr.io/xxxxxxxx/hugo

CloudBuildの構成ファイルを作成

次にCloudBuildの構成ファイルを作成します。
先ほど作ったHugoのビルド用のイメージの実行設定と、ビルドによってpublic配下へ配置された成果物をGCSへアップする設定を行います。
cloudbuild.yamlというファイル名で作成します。

steps:
  - name: 'asia.gcr.io/xxxxxxxx/hugo:latest'
    args: ["--cleanDestinationDir"]
  - name: 'google/cloud-sdk'
    entrypoint: "bash"
    args:
      - "-c"
      - |
                gsutil -m -h "Cache-Control:public,max-age=3600" rsync -j js,css,html,json,xml -c -r -d -p public gs://xxxxxxxx/public

gcr.io/cloud-builders/gsutilを使用しgsutil rsyncを行なってみましたが、オプションの設定がうまく動作しなかったため、 CloudSDK内のgsutilを使うためイメージはgoogle/cloud-sdkを使用することにしました。

CloudBuildのトリガー設定

次にCloudBuildのトリガー設定です。
Google ConsoleからCloudBuild>トリガーの順に遷移し、トリガー作成をします。
新しいリポジトリに接続をクリックします。

リポジトリについては既存のBitbucketのリポジトリをミラーリングします。

トリガー名とブランチ名を設定します。
ビルド構成は先ほど作った構成ファイルcloudbuild.yamlを指定します。
設定項目は以上なのでトリガーを作成します。
作成されました。
CloudBuildの設定が完了です。

これでBitbucketのリポジトリへのpushをするだけで、 HugoのビルドとGCSへのアップロードをCloudBuildが行なってくれる様になりました。