背景說明

  • build docker image很花時間和流量,所以希望可以不要由自己這邊進行
  • 在推送的時候希望同時可以去做到版本記錄

程式範例

name: Build&Push Docker to Dockerhub

on:
  push:
    tags:
     - 'v*'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: owohub/music-analysis
      -
        name: Login to DockerHub
        if: github.event_name != 'pull_request'
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      -
        name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: ${{ github.event_name != 'pull_request' }}
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}

解析

語法解釋

  • name:這是 Action 的名稱,將在 GitHub Action 頁面上顯示。
  • on:當 GitHub 上的新代碼推送時觸發 Action。
  • push:只有在推送時才觸發 Action。
  • tags:只有推送標籤時才觸發 Action。
  • jobs:Action 中的作業列表。
  • build:構建作業的名稱。
  • runs-on:作業運行的運行時環境。
  • steps:作業中執行的步驟列表。
  • name:步驟的名稱。
  • uses:要使用的操作或 Action 的地址。
  • actions/checkout@v3:從代碼庫中檢出代碼的 Action。
  • docker/metadata-action@v4:生成 Docker 映像標籤和標籤的 Action。
  • with:將參數傳遞到 Action。
  • images:要處理的 Docker 映像的名稱。
  • if:只有在特定條件下才執行步驟。
  • github.event_name != 'pull_request':當 GitHub 上的事件不是拉取請求時才執行步驟。
  • docker/login-action@v2:登錄到 Docker Hub 的 Action。
  • usernamepassword:用於登錄的 Docker Hub 帳戶的憑證。
  • docker/build-push-action@v4:構建並推送 Docker 映像的 Action。
  • context:要構建的 Dockerfile 上下文路徑。
  • push:當觸發的事件不是拉取請求時,將 Docker 映像推送到 Docker Hub。
  • tags:使用先前的 metadata-action 生成的 Docker 映像標籤和標籤。
  • labels:使用先前的 metadata-action 生成的 Docker 映像標籤和標籤。

jobs說明

這個 Action 中,jobs 列表下只有一個作業 build,它包含了四個步驟:

步驟 1:Checkout(檢出代碼)

使用 actions/checkout@v3 Action,將代碼從 GitHub 存儲庫中檢出到運行作業的運行時環境。

步驟 2:Docker meta(生成 Docker 映像元數據)

使用 docker/metadata-action@v4 Action,基於 Dockerfile 和 Git 提交信息生成 Docker 映像的元數據,包括映像標籤和標籤。

步驟 3:Login to DockerHub(登錄到 Docker Hub)

使用 docker/login-action@v2 Action,使用 GitHub 存儲庫的密鑰(secrets.DOCKER_USERNAMEsecrets.DOCKER_PASSWORD)登錄到 Docker Hub 帳戶,以便後續步驟可以推送 Docker 映像到 Docker Hub。

步驟 4:Build and push(構建並推送 Docker 映像)

使用 docker/build-push-action@v4 Action,構建 Docker 映像,並將其推送到 Docker Hub。它使用之前的步驟生成的 Docker 映像標籤和標籤,以及選擇性地將 Docker 映像推送到 Docker Hub(當觸發的事件不是拉取請求時才進行推送)。

參考資料