Nas duas primeiras partes desta série, nós temos : - Estabeleci um pipeline CI/CD funcional para uma aplicação Python com GitHub Actions e PyPI. - Industrializamos este pipeline com testes multi-versão, uma publicação progressiva via Test PyPI e ferramentas de qualidade e segurança.

Nesta terceira parte, vamos iralém da simples publicação no PyPIpara construir uma cadeia de CI/CD completa, robusta e profissional com : - Poesiapara uma embalagem moderna e uma gestão otimizada das dependências. - Dockerpara criar builds reproduzíveis e multi-plataformas - Publicação condicionalpara gerenciar cenários como os release candidates. - Ferramentas de automação(Renovate, Dependabot) para manter o pipeline atualizado sem esforço.

Integração com Poetry

Poetry substitui as antigas ferramentas de empacotamento (setup.py, requirements.txt) ao centralizar a gestão das dependências e da construção em`pyproject.toml`.

Instalação do Poetry

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

Inicialização do projeto

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

Isso gera um arquivo`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"

Adição e instalação de dependências

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

Publicação com Poetry

Poetry lida nativamente com a publicação :

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

# Publication sur PyPI
poetry publish --build

Este comando usa automaticamente as informações presentes em`pyproject.toml`.

Builds reprodutíveis com Docker

Para garantir execuções idênticas em desenvolvimento, CI/CD e produção, o Docker integra-se perfeitamente com a Poetry.

Exemplo de 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"]

Isso garante: - Um ambiente Python congelado. - Dependências bloqueadas via`poetry.lock`. - Uma imagem executável em qualquer sistema que suporte o Docker.

Integração no 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

Publicação condicional

Em um pipeline profissional, é preciso poder publicar apenas em alguns casos: - Release candidates para o Test PyPI. - Versões estáveis para o PyPI. - Dispara construções do Docker apenas para`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

Esta abordagem evita publicações acidentais.

Automatização das dependências com Renovate e Dependabot

Para evitar que suas dependências se tornem obsoletas, integre ferramentas de atualização automática.

Dependabot

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

Dependabot abre PR todas as semanas para atualizar as dependências do Python e do GitHub Actions.

renovar

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

Renovate permite um controle mais fino: agrupamento de dependências, planejamento e regras avançadas.

Diagramas PlantUML

Caso de Uso – CI/CD avançado

usecase cicd

Sequência – Publicação condicional

sequence cicd

Estados – Pipeline CI/CD

states cicd

Implantação – Arquitetura CI/CD

deployment cicd

Conclusão

Nesta terceira parte, vimos como : - Modernizar o empacotamento Python com Poetry. - Garantir builds reproduzíveis via Docker. Implementar uma publicação condicional. - Automatizar a atualização das dependências.

Você agora tem um pipeline CI/CDcompleto, industrializado e seguro, pronto para evoluir com seus projetos.

Articles connexes