CI/CD Python – Phần 3: Đi xa hơn với Poetry, Docker và xuất bản nâng cao
Đăng ngày 19 July 2025
Trong hai phần đầu tiên của loạt bài này, chúng ta đã: - Thiết lập pipeline CI/CD hoạt động cho ứng dụng Python với GitHub Actions và PyPI. - Công nghiệp hóa pipeline này với các bài kiểm tra đa phiên bản, phát hành dần dần thông qua Test PyPI, cùng các công cụ chất lượng và bảo mật.
Trong phần thứ ba này, chúng ta sẽ đivượt ra ngoài việc chỉ xuất bản trên PyPIđể xây dựng một chuỗi CI/CD hoàn chỉnh, mạnh mẽ và chuyên nghiệp với: - Thơ cacho một đóng gói hiện đại và quản lý phụ thuộc tối ưu. - Dockerđể tạo các bản build có thể tái lập và đa nền tảng. - Xuất bản có điều kiệnđể quản lý các kịch bản như các release candidates. - Công cụ tự động hóa(Renovate, Dependabot) để duy trì pipeline luôn được cập nhật mà không tốn công sức.
Tích hợp với Poetry
Poetry thay thế các công cụ đóng gói cũ (setup.py, requirements.txt) bằng cách tập trung hóa việc quản lý các phụ thuộc và build trong`pyproject.toml`Vui lòng cung cấp văn bản cần dịch.
Cài đặt Poetry
# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version
Khởi tạo dự án
# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.
Điều này tạo ra một tệp`pyproject.toml`Vui lòng cung cấp văn bản cần dịch.
[tool.poetry]
name = "playlist-downloader"
version = "0.1.0"
description = "CLI tool for managing YouTube playlists"
authors = ["Christophe Hérolivier <[email protected]>"]
[tool.poetry.dependencies]
python = ">=3.8"
typer = "^0.9.0"
yt-dlp = "^2023.7.6"
google-api-python-client = "^2.0.0"
google-auth-oauthlib = "^1.0.0"
[tool.poetry.group.dev.dependencies]
pytest = "^7.0"
mypy = "^1.0"
bandit = "^1.7"
safety = "^2.3"
black = "^23.0"
ruff = "^0.1"
Thêm và cài đặt các dependency
poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff
Xuất bản với Poetry
Poetry quản lý việc xuất bản một cách mặc định:
# Publication sur Test PyPI
poetry publish --build --repository test-pypi
# Publication sur PyPI
poetry publish --build
Lệnh này tự động sử dụng thông tin có trong`pyproject.toml`Vui lòng cung cấp văn bản cần dịch.
Builds có thể tái lập với Docker
Để đảm bảo việc thực thi đồng nhất trong môi trường phát triển, CI/CD và production, Docker tích hợp hoàn hảo với Poetry.
Ví dụ về Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY pyproject.toml poetry.lock ./
RUN pip install poetry
RUN poetry install --no-root --only main
COPY . .
CMD ["poetry", "run", "python", "cli.py"]
Điều này đảm bảo: - Một môi trường Python cố định. Các phần phụ thuộc được khóa thông qua`poetry.lock`. - Một image có thể thực thi trên mọi hệ thống hỗ trợ Docker.
Tích hợp vào GitHub Actions
name: Docker Build
on:
push:
branches: [main]
jobs:
build-docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t ghcr.io/${{ github.repository }}:latest .
- name: Push Docker image
run: docker push ghcr.io/${{ github.repository }}:latest
Xuất bản có điều kiện
Trong một pipeline chuyên nghiệp, cần phải có khả năng chỉ xuất bản trong một số trường hợp nhất định: - Các bản Release candidates lên Test PyPI. - Các phiên bản ổn định lên PyPI. - Các bản build Docker chỉ được kích hoạt cho`main`Vui lòng cung cấp văn bản cần dịch.
- name: Publish to Test PyPI
if: contains(github.ref, '-rc')
run: poetry publish --build --repository test-pypi
- name: Publish to PyPI
if: startsWith(github.ref, 'refs/tags/v')
run: poetry publish --build
Cách tiếp cận này giúp tránh việc xuất bản vô ý.
Tự động hóa các phụ thuộc với Renovate và Dependabot
Để tránh việc các dependency của bạn trở nên lỗi thời, hãy tích hợp các công cụ cập nhật tự động.
Dependabot
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
Dependabot mở các PR mỗi tuần để cập nhật các phụ thuộc Python và GitHub Actions.
Cải tạo
{
"extends": ["config:base"],
"packageRules": [
{
"matchManagers": ["pip"],
"groupName": "python-dependencies",
"schedule": ["before 6am on monday"]
}
]
}
Renovate cho phép kiểm soát chi tiết hơn: nhóm các phụ thuộc, lập kế hoạch và các quy tắc nâng cao.
Sơ đồ PlantUML
Trường hợp Sử dụng – CI/CD nâng cao
@startuml actor Developer actor GitHub as "GitHub Actions" actor PyPI actor DockerRegistry as "Docker Registry" actor Automation as "Renovate/Dependabot" Developer --> (Push code) (Trigger CI) --> GitHub GitHub --> (Run Tests & Lint) GitHub --> (Build Docker Image) GitHub --> DockerRegistry GitHub --> (Publish to Test PyPI) GitHub --> (Promote to PyPI) Automation --> (Update Dependencies) @enduml
Chuỗi – Xuất bản có điều kiện
@startuml !theme vibrant left to right direction Developer -> GitHub: Push tag v1.2.3-rc GitHub -> CI: Run tests CI -> CD: Check release type CD -> Test PyPI: Publish RC Developer -> GitHub: Push tag v1.2.3 GitHub -> CD: Publish to PyPI CD -> Docker Registry: Push Docker image @enduml
Trạng thái – Pipeline CI/CD
@startuml [*] --> Idle Idle --> CI_Running : push CI_Running --> CI_Success : tests ok CI_Running --> CI_Failed : tests fail CI_Success --> CD_Running : tag detected CD_Running --> CD_Success : publish ok CD_Running --> CD_Failed : error CD_Success --> [*] @enduml
Triển khai – Kiến trúc CI/CD
@startuml
node "Máy tính Nhà phát triển" {
component "Git Client"
}
node "GitHub Actions" {
component "Luồng công việc CI"
component "Luồng công việc CD"
}
node "Kho lưu trữ Gói" {
artifact "Test PyPI"
artifact "PyPI"
artifact "Docker Registry"
}
"Máy tính Nhà phát triển" --> "GitHub Actions"
"GitHub Actions" --> "Test PyPI"
"GitHub Actions" --> "PyPI"
"GitHub Actions" --> "Docker Registry"
@enduml
Kết luận
Trong phần thứ ba này, chúng ta đã thấy cách: Hiện đại hóa đóng gói Python với Poetry. - Đảm bảo các bản build có khả năng tái lập thông qua Docker. - Thiết lập một bản xuất bản có điều kiện. - Tự động hóa việc cập nhật các dependency.
Giờ đây bạn đã có một pipeline CI/CDđầy đủ, công nghiệp hóa và bảo mật, sẵn sàng phát triển cùng các dự án của bạn.