背景說明
- 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。username
和password
:用於登錄的 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_USERNAME
和 secrets.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(當觸發的事件不是拉取請求時才進行推送)。