در دو بخش اول از این سری، ما داشته‌ایم : - یک پایپ لاین CI/CD کارآمد برای یک اپلیکیشن پایتون با GitHub Actions و PyPI تنظیم کرد. - این پایپ لاینindustrialized شده با تست‌های چند نسخه‌ای، انتشار تدریجی از طریق Test PyPI، و ابزارهای کیفیت و امنیتی.

در این سومین بخش، می‌رویمفراتر از انتشار ساده در PyPIبرای ساخت یک خط لوله CI/CD کامل، قوی و حرفه‌ای با : - شعربرای یک بسته‌بندی مدرن و مدیریت بهینه وابستگی‌ها. - Dockerبرای ساخت Builds قابل‌تکرار و چندپلتفرمی. - انتشار مشروطبرای مدیریت سناریوهایی مثل کاندیداهای انتشار - ابزارهای اتوماسیون(Renovate, Dependabot) برای به‌روزرسانی پایплаین بدون زحمت

یکپارچه‌سازی با Poetry

Poetry ابزارهای قدیمی بسته‌بندی (setup.py, requirements.txt) را با تمرکز بر مدیریت وابستگی‌ها و ساخت در جایگزین می‌کند`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`.

ساخت‌های قابل تکرار با داکر

برای اطمینان از اجراهای یکسان در توسعه، 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"]

این تضمین : - محیط پایتون ثابت. - وابستگی‌های قفل‌شده از طریق`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

انتشار شرطی

در یک پایплайн حرفه‌ای، باید بتوانیم فقط در برخی موارد منتشر کنیم : - کاندیداهای انتشار به Test PyPI. - نسخهٔ‌های پایدار به PyPI. - Builds Docker triggered فقط برای`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ها را باز می‌کند تا وابستگی‌های پایتون و GitHub Actions را به‌روزرسانی کند.

تجدید کردن

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

Renovate کنترل دقیق‌تری را امکان‌پذیر می‌سازد: گروه‌بندی وابستگی‌ها، زمان‌بندی و قوانین پیشرفته.

نمودارهای PlantUML

مورد استفاده – CI/CD پیشرفته

@startuml
actor Developer
actor GitHub as "GitHub Actions"
actor PyPI
actor DockerRegistry as "داکر رجیستری"
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

دنباله – انتشار مشروط

@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

وضعیت‌ها – خط لوله 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 "ماشین توسعه‌دهنده" {
  component "کلاینت گیت"
}

node "GitHub Actions" {
  component "گردش کار CI"
  component "روند کاری CD"
}

node "مخازن بسته‌ها" {
  artifact "تست PyPI"
  artifact "PyPI"
  artifact "Docker Registry"
}

"ماشین توسعه‌دهنده" --> "GitHub Actions"
"GitHub Actions" --> "تست PyPI"
"GitHub Actions" --> "PyPI"
"GitHub Actions" --> "Docker Registry"
@enduml

نتیجه

در این بخش سوم، ما دیدیم که : - به‌روزرسانی بسته‌سازی پایتون با Poetry. - اطمینان حاصل از ساخت‌های قابل تکرار از طریق Docker. - نشر مشروط را تنظیم کنید. - خودکارسازی به‌روزرسانی وابستگی‌ها.

اکنون شما یک خط لوله CI/CD داریدکامل، صنعتی و امن, آماده برای پیشرفت با پروژه‌های شما.

مقالات مرتبط