Dalam dua bagian pertama dari seri ini, kita memiliki : - Telah menyusun pipeline CI/CD yang fungsional untuk aplikasi Python dengan GitHub Actions dan PyPI. - Mengindustrialisasi pipeline ini dengan pengujian multi-versi, penerbitan bertahap melalui Test PyPI, dan alat-alat kualitas serta keamanan.

Dalam bagian ketiga ini, kita akan pergidi luar sekadar publikasi di PyPIuntuk membangun rantai CI/CD yang lengkap, kuat, dan profesional dengan : - Puisiuntuk packaging modern dan manajemen dependensi yang dioptimalkan. - Dockeruntuk membuat build yang dapat direproduksi dan multi-platform - Publikasi bersyaratuntuk mengelola skenario seperti release candidates - Alat otomatisasi(Renovate, Dependabot) untuk menjaga pipeline tetap aktual tanpa usaha.

Integrasi dengan Poetry

Poetry menggantikan alat-alat packaging lama (setup.py, requirements.txt) dengan mengkonsolidasikan pengelolaan dependensi dan build dalam`pyproject.toml`.

Instalasi Poetry

# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version

Inisialisasi proyek

# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.

Ini menghasilkan sebuah file`pyproject.toml`:

[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"

Penambahan dan instalasi dependensi

poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff

Publication dengan Poetry

Poetry mengelola publikasi secara bawaan:

# Publication sur Test PyPI
poetry publish --build --repository test-pypi

# Publication sur PyPI
poetry publish --build

Perintah ini secara otomatis menggunakan informasi yang ada di`pyproject.toml`.

Builds direproduksi dengan Docker

Untuk memastikan eksekusi yang identik di pengembangan, CI/CD, dan produksi, Docker terintegrasi sempurna dengan Poetry.

Contoh 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"]

Ini menjamin : - Lingkungan Python yang beku. - Dependensi yang terkunci via`poetry.lock`. Gambar yang dapat dijalankan di semua sistem yang mendukung Docker.

Integrasi di 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

Publikasi bersyarat

Dalam pipeline profesional, harus dapat mempublikasikan hanya dalam beberapa kasus : - Release candidates ke Test PyPI. - Versi stabil ke PyPI. - Builds Docker yang dimemicu hanya untuk`main`.

- 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

Pendekatan ini menghindari publikasi yang tidak disengaja

Otomatisasi dependensi dengan Renovate dan Dependabot

Agar dependensi Anda tidak menjadi usang, integrasikan alat pembaruan otomatis.

Dependabot

version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"

Dependabot membuka PR setiap minggu untuk memperbarui dependensi Python dan GitHub Actions.

meng-renovasi

{
  "extends": ["config:base"],
  "packageRules": [
    {
      "matchManagers": ["pip"],
      "groupName": "python-dependencies",
      "schedule": ["before 6am on monday"]
    }
  ]
}

Renovate memungkinkan kontrol yang lebih halus: pengelompokan dependensi, penjadwalan, dan aturan canggih.

Diagram PlantUML

Kasus Penggunaan – CI/CD Lanjutan

@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

Urutan – Publikasi bersyarat

@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

Negara – 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

Penyebaran – Arsitektur CI/CD

@startuml
node "Mesin Pengembang" {
  component "Klien Git"
}

node "GitHub Actions" {
  component "CI Alur Kerja"
  component "CD Alur kerja"
}

node "Repositori Paket" {
  artifact "Uji PyPI"
  artifact "PyPI"
  artifact "Docker Registry"
}

"Mesin Pengembang" --> "GitHub Actions"
"GitHub Actions" --> "Uji PyPI"
"GitHub Actions" --> "PyPI"
"GitHub Actions" --> "Docker Registry"
@enduml

Kesimpulan

Dalam bagian ketiga ini, kita telah melihat bagaimana: - Modernisasi packaging Python dengan Poetry - Memastikan build yang dapat direproduksi melalui Docker. - Menyiapkan publikasi bersyarat. - Otomatiskan pembaruan dependensi.

Anda kini memiliki pipeline CI/CDlengkap, industri, dan aman, siap untuk berkembang bersama proyek Anda.

Artikel terkait