快轉到主要內容

使用 GitHub Actions 自動建立各版本的 Hugo Docker Image

· 0
目錄

在先前的 文章中,我們使用了 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 的觸發條件,這邊我們設定了兩個觸發條件:schedulepush

  • 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。

Related

使用 Docker buildx 建立多平台的 Docker Image
· 0
Git SSH Key 問題解決指南:如何克服 Permission Denied (publickey) 錯誤
· 0
透過 Powershell 設定 PATH 環境變數
· 0

boba-icon
請我喝珍奶!