CI/CD Python – Bagian 3 : Melanjutkan lebih jauh dengan Poetry, Docker dan publikasi lanjutan
Diterbitkan 19 July 2025
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.