自動化部署 GitHub Actions
👉 核心痛點:之前我們教過使用 docker buildx 在本機進行「跨平台多架構打包」,但如果每次改 code 都要在本機慢慢跑打包程序、然後手動推送到 Docker Hub,實在太浪費時間了,而且電腦跑打包時還會很卡!
最聰明的做法是:把這些苦差事丟給 GitHub 的雲端伺服器幫我們跑! 只要我們上傳新程式碼並發布版本標籤 (Tag),GitHub Actions 就會自動幫我們打包成 AMD64/ARM64 雙版本,並自動推送到 Docker Hub 上。
1. 取得 Docker Hub 授權金鑰 (PAT)
要讓 GitHub 雲端機器有權限幫你把打包好的 Image 推上你的 Docker Hub,我們需要給它一把專屬鑰匙:
- 登入 Docker Hub,前往右上方大頭貼的 Settings > Personal access tokens。
- 點擊
New Access Token,並在 scopes 權限中勾選Read, Write, Delete。 - 產生後,請立刻複製並把這串 Token 存起來 (它只會出現一次!如果忘記就只能刪掉重申請)。
2. 設定 GitHub 專案的機密環境變數 (Secrets)
來到你的 GitHub 專案頁面:
- 進入
Settings>Secrets and variables>Actions。 - 點擊
New repository secret,我們要建立兩個專案層級的機密變數:DOCKER_HUB_USERNAME:填入你的 Docker Hub 帳號。DOCKER_HUB_TOKEN:填入剛剛複製的那串超長 Token。
💡 小知識:Secrets vs Variables
- Secrets:用來存儲機密資訊 (如 API 密鑰、資料庫密碼)。存檔後就再也無法觀看明碼,受到最高層級的保護,被應用在需要保密的場景。
- Variables:用來存儲一般設定 (如公開網址、特定參數)。不需要特別保密,是可以公開的配置資訊。
3. 撰寫 GitHub Actions 自動化腳本
在你的專案根目錄下,建立 .github/workflows/docker-image.yml 檔案 (yml 檔名可自訂),並貼入以下標準設定:
name: Build and Push Docker Image
# 觸發條件:當你在 GitHub 發布標籤開頭為 'v' 的 Release 時 (例如 v1.0.0) 會啟動自動化
on:
push:
tags:
- "v*"
jobs:
build:
runs-on: ubuntu-latest # 開啟一台最新的 Ubuntu 虛擬機來幫你代工
steps:
# 步驟 1:把你的專案程式碼下載到這台虛擬機裡
- name: Checkout repository
uses: actions/checkout@v4
# 步驟 2:安裝 Buildx (支援跨平台打包的神器)
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
# 步驟 3:使用剛剛設定好的 Secrets 登入 Docker Hub
- name: Login to DockerHub
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
# 步驟 4:執行終極跨平台打包並自動推送!
- name: Build and push
uses: docker/build-push-action@v5
with:
context: . # 設定當前目錄為打包範圍
push: true # 打包完自動 push
platforms: linux/amd64,linux/arm64 # 同時打包兩種主流架構
tags: | # 設定 Image 名稱與版本號 (此處的 <your-project-name> 請替換為你的專案名稱)
${{ secrets.DOCKER_HUB_USERNAME }}/<your-project-name>:latest
${{ secrets.DOCKER_HUB_USERNAME }}/<your-project-name>:${{ github.ref_name }}
# 步驟 5:安全登出
- name: Logout from DockerHub
run: docker logout
4. 觸發自動化打包流程
- 將上面的腳本存檔,並執行
git push把所有程式碼推上 GitHub。 - 在 GitHub 專案主頁面右側,點擊 Create a new release (或 Tags)。
- 建立一個新的 Tag,例如輸入
v1.0.0,然後點擊發布 (Publish release)。 - 發布後,點擊上方導覽列的 Actions,你就會看到雲端伺服器正在拼命幫你跨平台打包囉!(⚠️ 注意:因為要模擬切換架構,雲端打包的時間通常會跑個 3 到 5 分鐘,屬於正常現象,請耐心等待)。
- 等到流程跑完顯示綠勾勾後,回到 Docker Hub 檢視,你的雙架構 Image 就在那裡等你了!🎉
5. 🎯 進階觀念:兩種自動化部署的觸發流派
你可能會好奇,為什麼上述的腳本是要我們「打上 v 開頭的標籤 (Tag)」才會觸發打包,而不是每次 git push 就直接打包呢?在業界實務上,其實有兩種主流做法:
流派一:Tag 版本發布驅動 (中大型/開源專案最愛)
- 做法:工程師平時瘋狂推 code 到
main分支,但這時 完全不會 觸發打包。直到團隊覺得「這個版本穩了,可以上線」,才會在 GitHub 手動打上一個v1.0.0的標籤。這時 GitHub Actions 才會啟動。 - 好處:Docker Hub 上不會塞滿幾百個零碎測試的 Image,只會留下乾淨、穩定的正式版本號。如果新版出事,維運人員也能快速一鍵退版回上一個穩定的 Tag。
流派二:推送主分支直接打包 (敏捷開發/持續部署 CD)
- 做法:只要任何人把程式碼
push或合併到main分支,Action 就會 自動且立刻 觸發,打包出最新的 Image 並覆蓋掉 Docker Hub 的latest標籤。 - 好處:極度自動化!開發者完全不用去管「打標籤發布」這件事,只要 Code 推進主幹,線上伺服器馬上吃到最新功能。(適合小型團隊或快速迭代的新創專案)
💡 想改用「流派二」嗎? 如果你覺得自己開發時每次都要打 Tag 太麻煩,只要把剛剛
.yml檔最上方的觸發條件改為以下這樣即可:on:push:branches:- main # 只要程式碼進入 main 分支就會觸發打包(註:若改用此寫法,下方的 tags 設定也要跟著拿掉
${{ github.ref_name }},單純留latest一行即可)