完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-25
前面我們已經透過 Helm Chart 把部署標準化了,但仍然有一個痛點:
每次修改程式碼後,都要手動跑測試、打包、推送、再部署,非常繁瑣,也容易出錯。
CI/CD 的價值在於:
因此,我們設計了一個 三層級的 pipeline,既能保障穩定性,又能兼顧開發靈活性。
整個流程分成三種情境:
所有分支 / PR → 基礎驗證
main branch push → 模擬部署
release tag (day-*) → 打包 & 發佈
day-25
)時才觸發day-*
,方便回溯這樣設計的好處是:
CI/CD workflow(.github/workflows/ci.yml
)主要包含:
環境設置
Lint + Test(所有分支 / PR 都會跑)
- name: Lint
run: make lint
- name: Test
run: make test
Helm dry-run(僅限 main branch push)
- name: Helm dry run
if: github.ref == 'refs/heads/main'
run: make helm-dryrun TAG=test REGISTRY=Finetune-30-days
Release 流程(day- tag)*
建立並推送映像:
make docker-build TAG=${TAG} REGISTRY=Finetune-30-days
make docker-push TAG=${TAG} REGISTRY=Finetune-30-days
部署(目前因為沒有雲端環境 → echo 模擬):
echo "helm upgrade --install finetune charts/finetune-platform -f values.yaml --set image.tag=${TAG}"
在這個設計裡,我們需要在 GitHub Repository → Settings → Secrets and variables → Actions 裡設定:
這樣 workflow 在 Release 流程中才能正確登入並推送映像。
當這套 CI/CD 運行時,你會在 GitHub Actions 頁面看到:
以及各個 Job 執行狀況與耗費時間:
這樣一來,平台從「手動操作」邁向「自動化 CI/CD」,即使在還沒有雲端環境的情況下,也能建立穩定且可擴展的流程,為未來的真實部署打好基礎。
📎 AI 協作記錄:今日開發指令
今天雖然也有請 ChatGPT 幫忙生成 cursor 的開發指令,但由於我沒有另外架實際的部署環境,接著就繼續跟討論了一下修改做法,討論完之後其實就拿到蠻完整的 cicd 文件了,不過以下指令還是供參。
你是一個熟悉 GitHub Actions 與 Kubernetes 的開發助手,請幫我在專案中新增 CI/CD 流程,規格如下:
## 需求
1. CI/CD 採三層結構:
- **其他 branch/PR**:只跑 Lint + Test
- **main branch (push)**:Lint + Test + Build image + Helm Dry Run
- **main branch + 有 tag (v*.*.*)**:Lint + Test + Build + Push image (tag = git tag) + Helm Deploy
2. Docker image:
- 預設名稱:`finetune-platform`
- tag 規則:
- PR/branch → 不 push
- main push → `:test`
- release tag (v1.0.0) → `:${GITHUB_REF_NAME}`
3. Helm:
- 使用 `charts/finetune-platform`
- 基本 values: `charts/finetune-platform/values.yaml`
- prod values: `charts/finetune-platform/values.prod.yaml`
- Dry Run 在 main push
- Deploy 在 release tag
4. 秘密資訊:
- Docker Hub 登入使用 `${{ secrets.DOCKERHUB_USERNAME }}` 與 `${{ secrets.DOCKERHUB_TOKEN }}`
## 任務
1. 在 `.github/workflows/ci.yml` 新增工作流程,內容依照上述需求設計。
2. 在專案根目錄新增 `Makefile`,提供以下指令:
- `make lint` → 執行 flake8
- `make test` → 執行 pytest
- `make docker-build TAG=test` → build image
- `make docker-push TAG=test` → push image
- `make helm-dryrun` → helm upgrade --dry-run --debug
- `make helm-deploy TAG=v1.0.0` → helm upgrade --install (帶入 tag)
- `make helm-uninstall` → helm uninstall
3. 確保 Makefile 與 ci.yml 配合,CI workflow 可以直接呼叫這些 make 指令。
## 成果
- `.github/workflows/ci.yml` 正確建立,符合三層 CI/CD 流程。
- `Makefile` 可以在本地完成 build / push / helm 部署。