使用 GitHub Actions 自動建立各版本的 Hugo Docker Image
目錄
在先前的
文章中,我們使用了 buildx
來建立多平台的 Docker Image,但是這樣的方式還是需要手動執行,為了能夠盡可能的在
Hugo 更新時自動建立 Docker Image,我們可以使用 GitHub Actions 來達成。
建立 GitHub Actions #
GitHub Action 是 GitHub 提供的一個自動化工具,可以在 GitHub 上的 Repository 中建立一個 .github/workflows
的資料夾,並且在裡面建立一個 .yml
檔案,就可以使用 GitHub Action 來自動化一些工作。
這次我們就是要使用 GitHub Action 來自動建立 Docker Image,所以我們可以在 .github/workflows
資料夾中建立一個 build.yml
檔案,內容如下:
name: Check Hugo Release & Publish to Docker Hub
on:
schedule:
- cron: "0 0 * * *" # 每天檢查一次
push:
branches:
- main
jobs:
check-and-publish:
runs-on: ubuntu-latest
steps:
- name: Install jq
run: |
sudo apt-get install jq
echo "jq installed successfully."
- name: Check for Hugo new release
id: check-release
run: |
ver=$(curl --silent "https://api.github.com/repos/gohugoio/hugo/releases/latest" | jq -r .tag_name)
echo "Latest Hugo version: $ver"
echo "HUGO_VERSION=$ver" >> $GITHUB_ENV
- name: Check if version exists on Docker Hub
run: |
tags=$(curl -s "https://registry.hub.docker.com/v2/repositories/${{ secrets.DOCKERHUB_USERNAME }}/hugo/tags/" | jq -r '.results[].name')
if echo "$tags" | grep -q "${HUGO_VERSION#v}-ext-debian"; then
echo "Version already exists on Docker Hub."
echo "DO_BUILD=false" >> $GITHUB_ENV
else
echo "Version does not exist on Docker Hub."
echo "DO_BUILD=true" >> $GITHUB_ENV
fi
- name: Checkout code
if: env.DO_BUILD == 'true'
uses: actions/checkout@v2
- name: Login to Docker Hub
if: env.DO_BUILD == 'true'
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}
- name: Build and push
if: env.DO_BUILD == 'true'
run: |
username=${{ secrets.DOCKERHUB_USERNAME }}
echo "Docker Hub username: $username"
ver=${HUGO_VERSION#v}
echo "Stripped Hugo version: $ver"
builder=builder
if ! docker buildx ls | grep -q $builder; then
docker buildx create --name $builder
echo "Builder $builder created."
else
echo "Builder $builder already exists."
fi
docker buildx use $builder
echo "Using builder: $builder"
docker buildx inspect --bootstrap
docker buildx build --platform=linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7 --push -t $username/hugo:$ver-ext-debian -t $username/hugo:latest .
echo "Docker image built and pushed successfully."
整體來說,這個 GitHub Action 會在每天的 00:00 時檢查一次 Hugo 是否有新的版本,如果有新的版本,就會自動建立 Docker Image 並且推送到 Docker Hub 上。
GitHub Action 的設定 #
在 GitHub Action 的設定中,我們可以設定 GitHub Action 的觸發條件,這邊我們設定了兩個觸發條件:schedule
和 push
。
schedule
:每天的 00:00 時觸發push
:當main
branch 有新的 commit 時觸發
為了避免每次觸發 GitHub Action 都會重新推送一次 Docker Image,我們在 GitHub Action 中加入了一個 Check if version exists on Docker Hub
的步驟,這個步驟會檢查 Docker Hub 上是否已經有這個版本的 Docker Image,如果有的話就不會再重新建立 Docker Image。
使用 GitHub Action 的 Secrets #
在 GitHub Action 中,我們可以使用 Secrets 來儲存一些機密資訊,例如:Docker Hub 的帳號密碼,這樣就不會在 GitHub Action 的設定中直接寫入帳號密碼,而是使用 Secrets 來儲存,這樣就不會有帳號密碼外洩的風險。
當然因為 Hugo
的 Repository 有時甚至會一天內有多個補丁版本的更新,因此以一天檢查一次的頻率來說,有可能會有漏掉的情況,但是這樣的頻率我想對於大部分的使用者來說應該是足夠的了。
若有任何建議或是問題,歡迎到我的 GitHub 上提出 issue。