Σε τα πρώτα δύο μέρη αυτής της σειράς, έχουμε : - Έθεσε έναν λειτουργικό pipeline CI/CD για μια εφαρμογή Python με το GitHub Actions και το PyPI. - Ενσωματώσαμε αυτήν τη διαδικασία με δοκιμές πολλαπλών εκδόσεων, σταδιακή δημοσίευση μέσω Test PyPI, και εργαλεία ποιότητας και ασφαλείας.

Σε αυτό το τρίτο μέρος, θα πάμεπέρα από την απλή δημοσίευση στο PyPIγια τη κατασκευή μιας πλήρους, αξιόπιστης και επαγγελματικής αλυσίδας CI/CD με : - Ποίησηγια ένα σύγχρονο πακέτο και μια βελτιστοποιημένη διαχείριση των εξαρτήσεων. - Dockerγια να δημιουργήσετε builds επαναλαμβανόμενα και πολυ-πλατφορμικά. - Συνθηκή δημοσίευσηγια τη διαχείριση σεναρίων όπως τα release candidates. - Εργαλεία αυτοματοποίησης(Renovate, Dependabot) για να διατηρείτε τον αγωγό ενημερωμένο χωρίς κόπο.

Ενσωμάτωση με το Poetry

Η Poetry αντικαθιστά τα παλαιά εργαλεία πακεταρίσματος (setup.py, requirements.txt) κεντροποιώντας τη διαχείριση των εξαρτήσεων και του build σε`pyproject.toml`.

Εγκατάσταση του 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.

Αυτό δημιουργεί ένα αρχείο`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

Δημοσίευση με Poetry

Η Poetry διαχειρίζεται εγγενώς την αναδημοσίευση:

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

# Publication sur PyPI
poetry publish --build

Η εντολή αυτόματα χρησιμοποιεί τις πληροφορίες που υπάρχουν στο`pyproject.toml`.

Κατασκευές αναπαραγώσιμες με Docker

Για να εξασφαλίσουμε ταυτικές εκτελέσεις σε ανάπτυξη, CI/CD και παραγωγή, ο Docker ενσωματώνεται αβίαστα με το Poetry.

Παράδειγμα 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"]

Αυτό εγγυάται : - Ένα παγωμένο περιβάλλον Python. - Εξαρτήσεις κλειδωμένες μέσω`poetry.lock`. - Μια εκτελέσιμη εικόνα σε κάθε σύστημα που υποστηρίζει το Docker.

Ενσωμάτωση στο 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

Έκδοση υπό συνθήκη

Σε έναν επαγγελματικό pipeline, πρέπει να μπορέσουμε να δημοσιεύουμε μόνο σε ορισμένα περιπτώσεις: - Εκδόσεις υποψηφιότητες προς Test PyPI. - Οι σταθερές έκδοσεις προς το PyPI. - Builds Docker εκτελεσμένοι μόνο για`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

Αυτή η προσέγγιση αποτρέπει τα τυχαία δημοσιεύματα.

Αυτοματοποίηση εξαρτήσεων με το Renovate και το Dependabot

Για να αποφύγετε το γεγονός ότι οι εξαρτήσεις σας γίνονται παρωχημένες, ενσωματώστε εργαλεία αυτόματης ενημέρωσης.

Dependabot

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

Ο Dependabot ανοίγει PR κάθε εβδομάδα για να ενημερώσει τις εξαρτήσεις Python και GitHub Actions.

Ανανεώστε

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

Renovate επιτρέπει πιο ακριβή έλεγχο: ομαδοποίηση εξαρτήσεων, προγραμματισμός, και προχωρημένοι κανόνες.

Διαγράμματα PlantUML

Περίπτωση χρήσης – προχωρημένο CI/CD

usecase cicd

Ακολουθία – Δημοσίευση υπό συνθήκη

sequence cicd

Καταστάσεις – Pipeline CI/CD

states cicd

Ανάπτυξη – Αρχιτεκτονική CI/CD

deployment cicd

Συμπέρασμα

Στο αυτό το τρίτο μέρος, είδαμε πώς: - Μοντέρναποίηση του πακετάρισματος Python με το Poetry. - Εγγυάστε αναπαραγώγιμη κατασκευή μέσω Docker. - Ρυθμίστε μια συνθηματική δημοσίευση. - Αυτοματοποίηση της ενημέρωσης των εξαρτήσεων.

Τώρα έχετε ένα pipeline CI/CDπλήρης, βιομηχανοποιημένος και ασφαλής, πρόθυμος να εξελιχθεί με τα έργα σας.

Σχετικά άρθρα