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.

Повезани чланци