CI/CD Python – Deel 3: Verder gaan met Poetry, Docker en geavanceerde publicatie
Gepubliceerd op 19 July 2025
In de eerste twee delen van deze serie hebben we : Zet een functionerend CI/CD-pijpeline op voor een Python-toepassing met behulp van GitHub Actions en PyPI. - Deze pijplijn geïndustrialiseerd met multi-versietests, een geleidelijke release via Test PyPI, en kwaliteits- en beveiligingstools.
In dit derde gedeelte, gaan webuiten de simpele publicatie op PyPIvoor het opzetten van een volledige, robuuste en professionele CI/CD-pijplijn met : - PoëzieVoor een moderne packaging en een geoptimaliseerd afhankelijkheidsbeheer. - Dockervoor het maken van reproduceerbare en cross-platform builds. - Voorwaardelijke publicatievoor het beheren van scenario’s zoals release candidates. - Automatiseringshulpmiddelen(Renovate, Dependabot) om de pijplijn moeiteloos up-to-date te houden.
Integratie met Poetry
Poetry vervangt de oude verpakkingstools (setup.py, requirements.txt) door de afhankelijkheden en buildbeheer te centraliseren in`pyproject.toml`.
Installatie van Poetry
# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version
Initialisatie van het project
# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.
Dit genereert een bestand`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"
Toevoegen en installeren van afhankelijkheden
poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff
Publication met Poetry
Poetry beheert de publicatie van nature:
# Publication sur Test PyPI
poetry publish --build --repository test-pypi
# Publication sur PyPI
poetry publish --build
Deze opdracht gebruikt automatisch de informatie in`pyproject.toml`.
Reproduceerbare builds met Docker
Om identieke uitvoeringen te garanderen in ontwikkeling, CI/CD en productie, integreert Docker naadloos met Poetry.
Voorbeeld van 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"]
Dit garandeert: - Een vaste Python-omgeving. - Vergrendelde afhankelijkheden via`poetry.lock`. - Een image die uitvoerbaar is op elk systeem dat Docker ondersteunt.
Integratie in 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
Voorwaardelijke publicatie
In een professionele pijplijn moet je alleen in bepaalde gevallen kunnen publiceren : - Release candidates naar Test PyPI - Stabiele versies naar PyPI. - Docker-builds die alleen worden geactiveerd voor`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
Deze aanpak voorkomt onbedoelde publicaties.
Automatisering van afhankelijkheden met Renovate en Dependabot
Om te voorkomen dat je afhankelijkheden verouderen, integreer automatische update-tools.
Dependabot
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
Dependabot opent elke week PRs om de afhankelijkheden voor Python en GitHub Actions bij te werken
Renovate
{
"extends": ["config:base"],
"packageRules": [
{
"matchManagers": ["pip"],
"groupName": "python-dependencies",
"schedule": ["before 6am on monday"]
}
]
}
Renovate stelt een fijnere controle in staat: groepering van afhankelijkheden, planning en geavanceerde regels.
PlantUML-diagrammen
Gebruiksscenario – geavanceerde CI/CD
@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
Sequentie – voorwaardelijke publicatie
@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
Statussen – 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
Implementatie – CI/CD-architectuur
@startuml
node "Ontwikkelaarsmachine" {
component "Git client"
}
node "GitHub Actions" {
component "CI‑werkstroom"
component "CD werkstroom"
}
node "Pakketrepositories" {
artifact "Test PyPI"
artifact "PyPI"
artifact "Docker-register"
}
"Ontwikkelaarsmachine" --> "GitHub Actions"
"GitHub Actions" --> "Test PyPI"
"GitHub Actions" --> "PyPI"
"GitHub Actions" --> "Docker-register"
@enduml
Conclusie
In dit derde deel hebben we gezien hoe: - Moderniseer de Python-verpakking met Poetry. - Zorgen voor reproduceerbare builds via Docker. - Stel een voorwaardelijke publicatie in. - Automatiseer de bijwerking van afhankelijkheden.
U beschikt nu over een CI/CD-pijplijnvolledig, geindustrialiseerd en beveiligd, klaar om mee te groeien met uw projecten.