在現代軟體開發流程中,Docker 映像檔的最佳化和安全性至關重要。過大的映像檔會影響佈署速度和效率,而未經檢查的安全性漏洞則可能導致嚴重風險。本文將介紹如何使用多階段建構技術縮減 Docker 映像檔大小,並使用 Dependabot 等工具自動化安全性漏洞檢查流程,最後結合 GitHub Actions 實作自動更新和合併,打造更安全高效的 CI/CD 流程。多階段建構允許在不同階段使用不同的基礎映像檔,僅複製必要的檔案到最終映像檔,從而顯著減小體積。安全性漏洞檢查則仰賴 Dependabot 等工具自動掃描依賴項,及時發現並修復潛在風險。最後,透過 GitHub Actions 設定自動合併透過測試的 Pull Request,簡化更新流程,同時維持程式碼品質。
最佳化 Docker 映像檔大小
為了最佳化 Docker 映像檔大小,我們可以使用多階段建構(Multi-Stage Build)的技術。這種技術可以讓我們在不同的階段安裝不同的依賴項,從而減少最終映像檔的大小。
以下是使用多階段建構最佳化 Docker 映像檔大小的範例:
# 第一階段:安裝開發依賴項
FROM python:3.10-slim-buster AS dev
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
# 第二階段:安裝生產依賴項
FROM python:3.10-slim-buster AS prod
WORKDIR /app
COPY --from=dev /app/ .
RUN pip install -r requirements.txt
# 第三階段:建構最終映像檔
FROM python:3.10-slim-buster
WORKDIR /app
COPY --from=prod /app/ .
CMD ["python", "app.py"]
在這個範例中,我們使用三個階段來建構最終的 Docker 映像檔。第一階段安裝開發依賴項,第二階段安裝生產依賴項,第三階段建構最終的映像檔。
自動化安全性漏洞檢查
為了自動化安全性漏洞檢查,我們可以使用 Dependabot 等工具。Dependabot 是一個整合於 GitHub 的漏洞掃描服務,可以自動檢查我們的依賴項是否有已知的安全性漏洞。
以下是使用 Dependabot 自動化安全性漏洞檢查的步驟:
- 啟用 Dependabot:在您的 GitHub 儲存函式庫中啟用 Dependabot。
- 設定 Dependabot:設定 Dependabot 來掃描您的依賴項。
- 接收漏洞報告:Dependabot 會傳送漏洞報告給您,告知您哪些依賴項有安全性漏洞。
除了 Dependabot 之外,我們還可以使用其他工具,例如 Trivy、Snyk 和 Renovate,來自動化安全性漏洞檢查。
啟用 Dependabot 版本更新
為了保持專案的依賴項更新,減少安全風險,我們可以使用 Dependabot 進行自動化的更新。以下是啟用 Dependabot 版本更新的步驟:
步驟 1:啟用 Dependabot
首先,需要啟用 Dependabot 功能。您可以透過官方檔案來啟用 Dependabot 版本更新。
步驟 2:組態 Dependabot
啟用 Dependabot 後,需要組態 dependabot.yml
檔案。以下是組態檔案的範例:
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "daily"
在這個組態檔案中,我們指定了套件生態系統(package-ecosystem
)和包含套件檔案的目錄(directory
)。我們還指定了 Dependabot 檢查更新的頻率(schedule
)。
步驟 3:組態 GitHub 儲存函式庫
最後,需要組態 GitHub 儲存函式庫,以允許 PRs 在 CI 測試透過後自動合並。這個步驟是確保依賴項變化不會降低軟體品質的關鍵。
組態 GitHub Actions
如果您使用 GitHub Actions,需要按照以下步驟組態:
- 啟用自動合並:在您的儲存函式庫名稱下,點選「設定」。在設定頁面下,點選「Pull Requests」,然後選擇「允許自動合並」。
重要注意事項
- 雖然可以新增多個更新塊,但實踐中可能會遇到挑戰,例如更新 Python 版本可能會導致依賴項版本的級聯變化。
- 保持 Python 版本更新是很重要的,但需要確保您的應用程式和依賴項堆積疊與新版本的 Python 相容。
示例程式碼
以下是使用 Python 和 GitHub Actions 的示例程式碼:
# 使用 GitHub Actions 進行自動化測試和佈署
import os
import sys
# 定義 GitHub Actions 的工作流程
def github_actions_workflow():
# 定義工作流程的步驟
steps = [
# 啟用自動合並
{
"name": "Enable auto-merge",
"run": "git config --global pull.rebase auto"
},
# 執行測試
{
"name": "Run tests",
"run": "python -m unittest discover -s tests"
},
# 佈署應用程式
{
"name": "Deploy application",
"run": "python deploy.py"
}
]
return steps
# 執行工作流程
if __name__ == "__main__":
workflow = github_actions_workflow()
for step in workflow:
print(f"執行步驟:{step['name']}")
os.system(step["run"])
這個示例程式碼使用 GitHub Actions 進行自動化測試和佈署。它定義了一個工作流程,包含啟用自動合並、執行測試和佈署應用程式的步驟。
自動化依賴更新和合併的強制功能
在前面的章節中,我們探討瞭如何使用 Dependabot 進行自動化依賴更新。現在,我們將深入探討如何使用 GitHub Actions 和 Dependabot 來自動化依賴更新和合併的過程。
步驟 1:設定 Dependabot
首先,您需要設定 Dependabot 來更新您的依賴項。您可以在 GitHub 的設定中啟用 Dependabot,並指定要更新的依賴項。
步驟 2:定義 GitHub Actions 工作
接下來,您需要定義一個 GitHub Actions 工作來自動合併由 Dependabot 建立的 Pull Request。您可以在 .github/workflows
目錄中建立一個新檔案,例如 automerge-dependabot.yaml
。
name: Dependabot auto-merge
on: pull_request
permissions:
contents: write
pull-requests: write
jobs:
dependabot:
runs-on: ubuntu-latest
if: github.actor == 'dependabot[bot]'
steps:
- name: Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v1
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Enable auto-merge for Dependabot PRs
run: gh pr merge --auto --merge "$PR_URL"
env:
PR_URL: ${{github.event.pull_request.html_url}}
GH_TOKEN: ${{secrets.GITHUB_TOKEN}}
步驟 3:設定分支保護規則
最後,您需要在 GitHub 的設定中新增一個分支保護規則,以確保只有透過測試的 Pull Request 才能合併到主分支。您可以在 Settings > Branches 中新增一個新規則,指定要保護的分支和測試工作。
結果
完成這些步驟後,您的專案將會自動更新依賴項、測試和合併 Pull Request。這是一個大步驟,朝著更安全的軟體開發邁進。
注意:完成這些步驟後,您將無法再將本地提交推播到主分支,因為我們已啟用分支保護。然而,您可以在 GitHub 的設定中新增您的團隊到繞過列表中,以繼續享受 CI/CD 和主幹開發的快速反饋。
內容解密:
- 我們使用 GitHub Actions 來自動合併由 Dependabot 建立的 Pull Request。
- 我們設定 Dependabot 來更新依賴項,並定義一個 GitHub Actions 工作來自動合併 Pull Request。
- 我們設定分支保護規則,以確保只有透過測試的 Pull Request 才能合併到主分支。
圖表翻譯:
graph LR A[Dependabot] -->|更新依賴項|> B[GitHub] B -->|建立 Pull Request|> C[GitHub Actions] C -->|自動合併|> D[主分支] D -->|分支保護規則|> E[測試工作] E -->|透過測試|> D
這個圖表顯示了 Dependabot 更新依賴項、建立 Pull Request、GitHub Actions 自動合併 Pull Request,以及分支保護規則確保只有透過測試的 Pull Request 才能合併到主分支的過程。
自動化更新和測試的重要性
在實踐中,自動化更新和測試是確保機器學習(ML)專案安全性、可靠性和生產就緒的關鍵組成部分。雖然工具如Dependabot和Renovate可以輕鬆設定自動化的PR(Pull Request)以更新有漏洞的依賴項,但這些PR可能會迅速累積,為團隊增加大量的工作量。
自動化更新的挑戰
團隊可能會對隨機升級套件是否會導致生產環境中的微妙錯誤或模型劣化感到緊張和猶豫。沒有全面性的測試,團隊無法自動合並PR,因為這將導致未經測試的變更被發布到生產環境中。這些PR可能會成為不受歡迎的和經常被拖延的中斷。
自動化測試的重要性
相比之下,當我們有CI/CD管道(Continuous Integration/Continuous Deployment)和全面性的測試時,CI/CD管道可以自動驗證變更是否有效。當測試確認變更沒有降低ML模型的品質和行為時,CI管道可以幫助自動合並PR。自動化更新和測試的這三個實踐——自動化依賴項更新和全面性的自動測試——相互補充,允許團隊體驗到安全性、速度、可靠性和生產力的湧現特性。
自動化更新的額外好處
自動化更新不僅有助於交付安全的解決方案,也作為一個有用的強制函式(即,事件強制採取必要的行動以產生結果)。它們幫助我們確保CI/CD管道具有全面性的測試。
內容解密:
以上內容強調了自動化更新和測試在機器學習專案中的重要性。自動化更新可以幫助團隊保持依賴項的最新版本,同時減少手動更新的風險。自動化測試可以確保變更沒有降低ML模型的品質和行為。這兩個實踐的結合可以幫助團隊體驗到安全性、速度、可靠性和生產力的湧現特性。
圖表翻譯:
flowchart TD A[自動化更新] --> B[自動化測試] B --> C[CI/CD管道] C --> D[安全性、速度、可靠性和生產力] D --> E[ML專案] E --> F[團隊體驗]
此圖表展示了自動化更新和測試如何與CI/CD管道結合,從而帶來安全性、速度、可靠性和生產力的湧現特性,最終使ML專案更加成功。
自動化測試的重要性
在機器學習(ML)開發中,自動化測試是一種強大的基礎實踐,可以幫助團隊快速、可靠地交付高品質的軟體。透過自動化測試,開發人員可以確保其程式碼在不同的環境和組態中正確執行,從而減少錯誤和漏洞的風險。
自動化測試的優點
- 快速交付:自動化測試可以幫助開發人員快速交付軟體,減少手動測試的時間和成本。
- 提高品質:自動化測試可以幫助確保軟體的品質,減少錯誤和漏洞的風險。
- 提高可靠性:自動化測試可以幫助確保軟體在不同的環境和組態中正確執行,提高軟體的可靠性。
- 減少成本:自動化測試可以幫助減少軟體開發和維護的成本,減少手動測試和除錯的時間和成本。
自動化測試的挑戰
- 複雜性:自動化測試可能很複雜,需要開發人員具有豐富的測試經驗和知識。
- 時間和成本:自動化測試需要時間和成本,需要開發人員投資時間和資源來開發和維護測試。
- 環境和組態:自動化測試需要考慮不同的環境和組態,需要開發人員確保測試在不同的環境和組態中正確執行。
解決方案
- 使用測試框架:使用測試框架,如Pytest或Unittest,可以幫助開發人員簡化測試的過程。
- 使用自動化測試工具:使用自動化測試工具,如Selenium或Appium,可以幫助開發人員自動化測試。
- 使用CI/CD:使用CI/CD工具,如Jenkins或Travis CI,可以幫助開發人員自動化測試和佈署。
內容解密:
在這個章節中,我們討論了自動化測試的重要性和優點,包括快速交付、提高品質、提高可靠性和減少成本。同時,我們也討論了自動化測試的挑戰,包括複雜性、時間和成本、環境和組態。最後,我們提供了一些解決方案,包括使用測試框架、自動化測試工具和CI/CD工具,來幫助開發人員簡化測試的過程,提高軟體的品質和可靠性。
import pytest
def test_example():
assert 1 == 1
def test_example2():
assert 2 == 2
圖表翻譯:
graph LR A[測試框架] --> B[自動化測試工具] B --> C[CI/CD工具] C --> D[自動化測試] D --> E[軟體交付]
在這個圖表中,我們展示了測試框架、自動化測試工具和CI/CD工具之間的關係,如何幫助開發人員簡化測試的過程,提高軟體的品質和可靠性。
自動化測試:快速移動而不破壞事物
當我們在開發機器學習(ML)系統時,自動化測試是確保系統穩定性和可靠性的關鍵。手動測試可能會耗費大量時間和資源,尤其是在ML系統中,複雜的模型和資料集需要進行全面測試。
手動測試的挑戰
手動測試可能會導致以下問題:
- 耗時:手動測試需要花費大量時間和人力,尤其是在複雜的ML系統中。
- 容易出錯:手動測試容易出錯,尤其是在複雜的系統中,人為錯誤可能會導致測試結果不準確。
- 難以擴充套件:手動測試難以擴充套件,尤其是在大型ML系統中,需要進行大量測試。
自動化測試的優點
自動化測試可以解決手動測試的挑戰,提供以下優點:
- 節省時間:自動化測試可以節省大量時間和人力,尤其是在複雜的ML系統中。
- 提高準確性:自動化測試可以提高測試結果的準確性,減少人為錯誤的可能性。
- 易於擴充套件:自動化測試易於擴充套件,尤其是在大型ML系統中,需要進行大量測試。
自動化測試的實踐
以下是自動化測試的實踐:
- 單元測試:單元測試是測試個別的程式碼單元,確保它們按照預期運作。
- 整合測試:整合測試是測試多個程式碼單元之間的互動,確保它們按照預期運作。
- 系統測試:系統測試是測試整個ML系統,確保它按照預期運作。
自動化測試的工具
以下是自動化測試的工具:
- Pytest:Pytest是一個流行的Python測試框架,提供了豐富的測試功能。
- Unittest:Unittest是一個Python測試框架,提供了基本的測試功能。
- Jenkins:Jenkins是一個流行的CI/CD工具,提供了自動化測試和佈署功能。
內容解密:
- 自動化測試是使用工具和框架來自動執行測試,減少手動測試的時間和人力。
- 單元測試、整合測試和系統測試是自動化測試的三個層次,分別測試個別的程式碼單元、多個程式碼單元之間的互動和整個ML系統。
- Pytest、Unittest和Jenkins是自動化測試的流行工具和框架,提供了豐富的測試功能和自動化測試能力。
圖表翻譯:
graph LR A[單元測試] --> B[整合測試] B --> C[系統測試] C --> D[自動化測試] D --> E[CI/CD] E --> F[佈署]
- 圖表顯示了自動化測試的流程,從單元測試、整合測試、系統測試到自動化測試和CI/CD,最終到佈署。
自動化測試:快速迭代的基礎
在機器學習(ML)開發中,自動化測試是確保系統可靠性和維護性的關鍵。它們使我們能夠快速迭代和改進產品,而不會犧牲其穩定性和效能。自動化測試的好處是多方面的,包括減少手動測試的時間和成本、提高測試的覆寫率和準確性,以及提供即時的反饋和調整機會。
自動化測試的型別
自動化測試可以分為兩大類:軟體測試和模型測試。軟體測試關注於確保系統的基礎架構和程式碼是正確和可靠的,而模型測試則關注於評估機器學習模型的效能和準確性。在本章中,我們將關注於軟體測試的「為什麼」和「什麼」(例如,哪些測試應該寫?什麼是一個好的測試?),以提供一個高層次的框架來組織測試策略的細節。
軟體測試的重要性
軟體測試是確保系統基礎架構和程式碼是正確和可靠的關鍵。它們可以幫助我們發現和修復程式碼中的錯誤和缺陷,從而提高系統的穩定性和效能。軟體測試還可以提供即時的反饋和調整機會,使我們能夠快速迭代和改進產品。
模型測試的挑戰和方法
模型測試是評估機器學習模型的效能和準確性的關鍵。然而,模型測試也面臨著許多挑戰,例如模型的複雜性和不確定性。為了應對這些挑戰,我們需要使用特殊的測試方法和技術,例如使用大語言模型(LLM)應用程式的測試技術。
使用模型測試的好處
模型測試可以提供多種好處,包括:
- 成本有效的方式:模型測試可以幫助我們確保程式碼、資料和模型的變化不會降低產品的體驗。
- 效能基準:模型測試可以幫助我們設定新的效能基準,而不會損害既定的標準。
實踐和範例
為了使本章對於所有讀者都有用,我們假設讀者有撰寫測試的願望,但不一定有經驗。您可以跳過熟悉的測試部分,並仔細閱讀新的部分。每種測試型別都會使用實際範例來演示,讀者可以克隆程式碼函式庫來閱讀、執行和撰寫測試。
內容解密:
- 自動化測試的型別包括軟體測試和模型測試。
- 軟體測試關注於確保系統的基礎架構和程式碼是正確和可靠的。
- 模型測試關注於評估機器學習模型的效能和準確性。
- 自動化測試可以提供多種好處,包括減少手動測試的時間和成本、提高測試的覆寫率和準確性,以及提供即時的反饋和調整機會。
# 自動化測試示例
import unittest
class TestExample(unittest.TestCase):
def test_example(self):
# 測試程式碼
self.assertEqual(1 + 1, 2)
if __name__ == '__main__':
unittest.main()
圖表翻譯:
graph LR A[自動化測試] --> B[軟體測試] A --> C[模型測試] B --> D[程式碼測試] C --> E[模型評估] D --> F[程式碼覆寫率] E --> G[模型準確性]
圖表翻譯:
- 自動化測試包括軟體測試和模型測試。
- 軟體測試關注於程式碼測試和程式碼覆寫率。
- 模型測試關注於模型評估和模型準確性。
自動化測試的重要性
在軟體開發中,特別是在機器學習(ML)專案中,自動化測試是一個至關重要的環節。它可以幫助我們快速回應專案的變化,例如訓練資料、特徵工程策略、模型方法和業務需求的變化。
沒有自動化測試,變化就會變得容易出錯、繁瑣且令人緊張。當我們修改程式碼的一部分時,缺乏測試就會迫使我們手動測試整個系統,以確保修改(例如,在特徵工程邏輯中)沒有導致模型品質的下降。圖 5-1 顯示,隨著程式碼函式庫的大小增長,不僅要承擔新的功能開發的品質保證工作,而且還要承擔手動迴歸測試的負擔。
自動化測試的優點
自動化測試可以為我們帶來許多優點。首先,它可以提供快速和重要的反饋給 ML 系統的開發者。在開發過程中,測試可以幫助我們快速發現錯誤和問題,從而縮短反饋迴圈的時間。其次,自動化測試可以幫助我們確保 ML 系統的品質和可靠性。
測試的型別
測試可以分為兩類:軟體測試和 ML 模型測試。軟體測試是用於測試軟體的正確性和可靠性,而 ML 模型測試是用於測試 ML 模型的效能和準確性。
測試的挑戰
在 ML 專案中,測試可能會面臨一些挑戰。例如,在早期和探索階段,ML 解決方案的不確定和複雜性可能使得定義自動化測試變得困難。在這種情況下,可以先從簡單的測試開始,然後逐步增加測試的複雜性。
圖表翻譯:
此圖表顯示了自動化測試的流程。從開始到修改程式碼,然後是手動測試,接下來是自動化測試,最後是快速反饋和品質保證。圖表中還顯示了自動化測試可以幫助我們確保 ML 系統的可靠性。
內容解密:
在這個章節中,我們討論了自動化測試的重要性和優點。自動化測試可以幫助我們快速回應專案的變化,提供快速和重要的反饋給開發者,確保 ML 系統的品質和可靠性。同時,我們也討論了測試的型別和挑戰,包括軟體測試和 ML 模型測試,以及在 ML 專案中測試的挑戰。最後,我們透過一個簡單的例子來演示自動化測試的流程和優點。
自動化測試的優勢
自動化測試是軟體開發中的一個重要環節,它能夠幫助我們快速地檢測出程式碼中的錯誤和缺陷。透過自動化測試,我們可以確保軟體的品質和可靠性,同時也能夠減少手動測試的時間和成本。
快速反饋
自動化測試可以提供快速的反饋,讓我們在程式碼變更後立即知道是否有錯誤或缺陷。這個過程通常只需要幾秒鐘或幾分鐘,而手動測試可能需要幾個小時甚至幾天。
減少生產缺陷的風險
當我們的測試覆寫率高時,自動化測試可以捕捉到程式碼中意外引入的錯誤和缺陷,從而避免這些問題出現在生產環境中。這可以節省我們的時間和精力,同時也能夠減少因為缺陷而引起的壓力和緊張。
活動檔案和自我測試程式碼
自動化測試可以作為我們程式碼的活動檔案,同時也能夠自我測試。當我們需要修改程式碼時,我們也需要更新測試,以確保程式碼的行為是正確的。這樣可以保持檔案和程式碼的一致性,避免檔案過時和不一致的問題。
減少認知負荷
自動化測試可以幫助我們減少認知負荷,讓我們可以專注於當前的任務。透過寫測試,我們可以將複雜的問題分解成小的子問題,同時也能夠確保軟體的架構是模組化和易於理解的。
重構
自動化測試可以幫助我們重構程式碼,讓程式碼更加簡潔和易於維護。透過測試,我們可以確保程式碼的行為是正確的,同時也能夠減少因為重構而引起的錯誤和缺陷。
# 自動化測試示例
import unittest
def add(x, y):
return x + y
class TestAddFunction(unittest.TestCase):
def test_add(self):
self.assertEqual(add(1, 2), 3)
self.assertEqual(add(-1, 1), 0)
self.assertEqual(add(-1, -1), -2)
if __name__ == '__main__':
unittest.main()
內容解密:
上述程式碼是一個簡單的自動化測試示例,使用Python的unittest框架。測試類TestAddFunction
包含一個測試方法test_add”,該方法測試
add函式的行為。透過這個測試,我們可以確保
add`函式的行為是正確的。
圖表翻譯:
graph LR A[測試類] --> B[測試方法] B --> C[測試add函式] C --> D[斷言結果] D --> E[測試透過]
上述Mermaid圖表展示了測試的流程,從測試類到測試方法,然後到測試add
函式,最後到斷言結果和測試透過。
自動化測試的重要性
自動化測試是機器學習(ML)系統開發中的一個關鍵步驟。它不僅有助於確保系統的正確性和可靠性,也能夠提高開發團隊的效率和生產力。然而,許多ML系統缺乏自動化測試,這是因為開發人員常常認為寫自動化測試會減慢他們的速度。
自動化測試的好處
自動化測試有許多好處,包括:
- 減少技術債務和複雜性:自動化測試可以幫助開發人員在早期階段發現和修復錯誤,從而減少技術債務和複雜性。
- 提高安全性:自動化測試可以幫助確保ML系統的安全性和可靠性,特別是在生產環境中。
- 提高生產力:自動化測試可以幫助開發人員更快速地開發和佈署ML系統,從而提高生產力和效率。
- 提高使用者滿意度:自動化測試可以幫助確保ML系統的品質和可靠性,從而提高使用者滿意度。
自動化測試的挑戰
儘管自動化測試有許多好處,但它也面臨著一些挑戰,包括:
- 寫自動化測試需要時間和精力:開發人員常常認為寫自動化測試會減慢他們的速度。
- 自動化測試需要專門的知識和技能:開發人員需要有自動化測試的知識和技能,才能有效地寫和維護自動化測試。
- 自動化測試需要投資:自動化測試需要投資時間、精力和資源,才能建立和維護一個有效的自動化測試框架。
隨著機器學習應用日益普及,自動化測試已成為確保ML系統品質和可靠性的關鍵。本文深入探討了自動化測試的優點、挑戰和實踐方法,涵蓋了從依賴項安全性檢查到模型測試的各個層面。多維比較分析顯示,相較於手動測試,自動化測試能顯著提升效率、降低錯誤率,並確保軟體交付的快速迭代。技術限制深析指出,建置自動化測試框架需要前期投入和專業技能,但長期效益顯著,尤其在應對頻繁的程式碼更新和模型調整時,更能體現其價值。展望未來,隨著測試工具和技術的持續發展,自動化測試將更深度地融入ML系統開發生命週期,驅動更高效、更可靠的AI應用落地。玄貓認為,及早匯入自動化測試並將其整合至CI/CD流程,對於任何規模的ML團隊都至關重要,這將是提升產品競爭力和確保長期成功的關鍵策略。