iT邦幫忙

2025 iThome 鐵人賽

DAY 25
0

完整程式碼可在 GitHub 專案中找到:Finetune-30-days-demo / day-25


一、為什麼需要 CI/CD?

前面我們已經透過 Helm Chart 把部署標準化了,但仍然有一個痛點:
每次修改程式碼後,都要手動跑測試、打包、推送、再部署,非常繁瑣,也容易出錯。

CI/CD 的價值在於:

  • CI(持續整合):每次提交都自動進行 Lint + Test,確保程式正確性。
  • CD(持續交付/部署):自動打包並發佈映像,甚至能一鍵部署,縮短迭代時間。

因此,我們設計了一個 三層級的 pipeline,既能保障穩定性,又能兼顧開發靈活性。


二、Pipeline 設計原則

整個流程分成三種情境:

  1. 所有分支 / PR → 基礎驗證

    • Lint + Test
    • 確保任何開發分支的程式碼都不會破壞主幹
  2. main branch push → 模擬部署

    • 除了 Lint + Test,還會進行 Helm dry-run
    • 確保 main 合併後能「模擬部署成功」,避免錯誤配置流入主幹
  3. release tag (day-*) → 打包 & 發佈

    • 只有在 main 上標記 release tag(如 day-25)時才觸發
    • 執行 Build → Push → Deploy
    • 圖像標籤對齊 day-*,方便回溯

這樣設計的好處是:

  • 平常開發不會浪費資源在打包
  • 主幹能快速驗證部署可行性
  • 發佈版本才真正打包、推送,並進行(目前模擬的)部署

三、Workflow 架構

CI/CD workflow(.github/workflows/ci.yml)主要包含:

  1. 環境設置

    • Python(測試用)
    • Cache pip(避免每次都重新安裝)
    • Docker Buildx、Helm
  2. Lint + Test(所有分支 / PR 都會跑)

    - name: Lint
      run: make lint
    - name: Test
      run: make test
    
  3. 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
    
  4. 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 Secrets 設定

在這個設計裡,我們需要在 GitHub Repository → Settings → Secrets and variables → Actions 裡設定:

  • DOCKERHUB_USERNAME:Docker Hub 帳號
  • DOCKERHUB_TOKEN:Docker Hub 存取權杖

這樣 workflow 在 Release 流程中才能正確登入並推送映像。


五、實際效果

當這套 CI/CD 運行時,你會在 GitHub Actions 頁面看到:
https://ithelp.ithome.com.tw/upload/images/20251008/201516608L3o4kWhOJ.png

以及各個 Job 執行狀況與耗費時間:
https://ithelp.ithome.com.tw/upload/images/20251008/20151660T0mTJ4JjH0.png

這樣一來,平台從「手動操作」邁向「自動化 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 部署。

上一篇
[Day 24] 部署最佳實踐:從 Compose → K8s → Helm 的演進
下一篇
[Day 26] 系統觀測:Prometheus Exporter + Grafana
系列文
打造 AI 微調平台:從系統設計到 AI 協作的 30 天實戰筆記26
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言