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.

Bài viết liên quan