在我們深入了解設定之前,讓我們先簡單介紹一下為什麼 CI/CD 如此重要:
在 ReadmeGenie 中,我們利用 GitHub Actions 作為我們的 CI/CD 工具。它與 GitHub 儲存庫順利集成,並透過 YAML 設定檔提供靈活性和自動化。
我們的 CI/CD 管道包括以下自動化步驟:
CI 工作流程在 .github/workflows/python-app.yml 中定義。以下是工作流程每個部分的詳細說明:
工作流程在主分支的每個推送和拉取請求上執行。這可確保所有程式碼變更在合併到生產環境之前都經過驗證。
name: Python application on: push: branches: ["main"] pull_request: branches: ["main"]
我們將 GitHub Actions 設定為使用 Python 3.12.x,確保與本機開發環境的一致性。此步驟安裝特定的Python版本並準備依賴安裝的環境。
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python 3.12.x uses: actions/setup-python@v3 with: python-version: "3.12.x"
下一步是安裝專案相依性。在這裡,我們升級pip並安裝requirements.txt文件,它將安裝其中指定的附加依賴項。
- name: Install dependencies run: | python -m pip install --upgrade pip pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
Linting 是我們工作流程的重要組成部分,確保程式碼符合指定的品質標準。我們運行 flake8,並帶有標記語法錯誤、未定義名稱和複雜性問題的選項。
name: Python application on: push: branches: ["main"] pull_request: branches: ["main"]
對於單元測試,我們使用 pytest 來運行所有測試案例。此外,我們使用覆蓋率來追蹤測試了哪些程式碼行,確保我們的測試套件符合定義的 75% 覆蓋率閾值。
以下命令執行測試並產生覆蓋率報告,突出顯示測試覆蓋率中的任何差距。這對於品質保證至關重要,因為未經測試的程式碼是未來錯誤的潛在來源。
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python 3.12.x uses: actions/setup-python@v3 with: python-version: "3.12.x"
此覆蓋率檢查透過強制測試覆蓋至少 75% 的程式碼庫來確保高標準的程式碼品質。如果覆蓋率低於此閾值,則不允許提交。
除了 CI/CD 之外,我們還設定了預提交掛鉤,以在將任何變更推送到儲存庫之前在本地強制執行程式碼品質。這些鉤子:
以下是我們如何將覆蓋率檢查新增為 .pre-commit-config.yaml 中的預先提交掛鉤:
- name: Install dependencies run: | python -m pip install --upgrade pip pip install flake8 pytest if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
設定 CI/CD 需要深入了解不同工具(flake8、pytest、coverage)如何在 GitHub Actions 中互動。以下是我們面臨的一些挑戰以及我們實施的解決方案:
我們遇到了環境變數衝突的問題,特別是在測試 API 整合和組態處理時。在單元測試中使用 @patch.dict 和其他模擬技術使我們能夠有效地模擬環境。
最大的挑戰是確保足夠的測試覆蓋率。在 GitHub Actions 和預提交掛鉤中使用帶有 --fail-under=75 的coverage.py 有助於執行此標準。
為了讓 CI/CD 管道更強大,我們計畫:
透過這個項目,我意識到儘早建立強大的測試和 CI/CD 實踐的重要性。如果我重新開始,我會專注於從一開始就編寫全面的測試,並隨著專案的進展逐步擴展和改進它們。這種方法可以防止丟失分支或未經測試的區域,並確保所有新程式碼順利整合到覆蓋良好的程式碼庫中。
以上是為 ReadmeGenie 實作 CI/CD的詳細內容。更多資訊請關注PHP中文網其他相關文章!