CI/CD Python – Deo 3: Idemo dalje sa Poetry, Docker i naprednim objavljivanjem
Објављено 19 July 2025
U prvim dva dela ove serije, imali smo: - Осигуран функционалан CI/CD конвејер за Python апликацију са GitHub Actions и PyPI. - Industrijalizovan ovim pipeline-om sa testovima više verzija, postupno objavljivanjem preko Test PyPI i alatkama za kvalitet i bezbednost.
U ovom trećem delu, idemo ićiIzvan jednostavne objave na PyPIКонструисати kompletan, jak i profesionalan CI/CD lanac sa: - Poezijaза модерно упаковљење и оптимизовано управљање зависностима. - Dockerза правиње репродуктивних и крос-платформских билдова. - uslovna objavaда се управља scenarijima kao što su release candidates. - Алатке за аутоматизацију(Renovate, Dependabot) da bi se cipovod održao ažuriran bez napora.
Integracija sa Poetry
Poetry zamjenjuje starije alate za pakovanje (setup.py, requirements.txt) centralizujući upravljanje zavisnostima i gradnju u`pyproject.toml`.
Instalacija Poetry
# Installer Poetry
curl -sSL https://install.python-poetry.org | python3 -
# Vérifier la version
poetry --version
Иницијализација пројекта
# Initialiser un nouveau projet avec Poetry
poetry init
# Suivre l'assistant pour renseigner : nom, version, description, licence, dépendances.
Ovo generiše fajl`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"
Додавање и инсталација зависности
poetry add typer yt-dlp google-api-python-client google-auth-oauthlib
poetry add --group dev pytest mypy black bandit safety ruff
Objavljivanje uz Poetry
Poetry nativno upravlja publikacijom:
# Publication sur Test PyPI
poetry publish --build --repository test-pypi
# Publication sur PyPI
poetry publish --build
Ова команда аутоматски користи информације које се налазе у`pyproject.toml`.
Reproduktibilne izgrade sa Dockerom
Da bi se osigurali identična izvršavanja u razvoju, CI/CD i proizvodnji, Docker se savršeno integriše sa Poetry.
Primer 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"]
Ovo garantuje : - Fiksno Python okruženje. - Zaključane zavisnosti kroz`poetry.lock`. - Izvršna slika na svakom sistemu koji podržava Docker.
Integracija u 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
Uslovna objava
U profesionalnom kanalu treba moći da se objavljuje samo u određenim slučajevima: - Release candidates ka Test PyPI. - Stabilne verzije ka PyPI - Gradevi Docker pokrenuti samo za`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
Ovaj pristup sprečava slučajne objave.
Automatizacija zavisnosti sa Renovate i Dependabot
Da bi se izbeglo da vaše zavisnosti postanu zastarele, integrirajte alate za automatsko ažuriranje.
Dependabot
version: 2
updates:
- package-ecosystem: "pip"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
Dependabot otvara PR svake nedelje da ažurira Python i GitHub Actions zavisnosti.
Renovirati
{
"extends": ["config:base"],
"packageRules": [
{
"matchManagers": ["pip"],
"groupName": "python-dependencies",
"schedule": ["before 6am on monday"]
}
]
}
Renovate omogućava finiji kontrol: grupisanje zavisnosti, planiranje i napredna pravila.
Dijagrami PlantUML
Slučaj upotrebe – napredno CI/CD
@startuml actor Developer actor GitHub as "GitHub Actions" actor PyPI actor DockerRegistry as "Docker Registry" actor Automation as "Оновирај/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
Секвенција – Условно објављивање
@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
Stanje – 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
Разврштање – CI/CD архитектура
@startuml
node "Mašina developera" {
component "Klijent Git"
}
node "GitHub akcije" {
component "CI radni tok"
component "CD radni tok"
}
node "Репозиторијуми пакета" {
artifact "Testiranje PyPI"
artifact "PyPI"
artifact "Регистар Докер"
}
"Mašina developera" --> "GitHub akcije"
"GitHub akcije" --> "Testiranje PyPI"
"GitHub akcije" --> "PyPI"
"GitHub akcije" --> "Регистар Докер"
@enduml
Zaključak
У овој трећој части, смо видели како : - Modernizovati pakovanje Python-a pomoću Poetry. - Osigurati reproizvodive gradnje kroz Docker. Postaviti uslovno objavljivanje. - Automatizujte ažuriranje zavisnosti.
Сада имате CI/CD пајплај.сав, индустриализовaн и сигуран, spreman da se razvija sa vašim projektima.