CI/CD Python – بخش ۳: پیشرفت بیشتر با Poetry، Docker و انتشار پیشرفته
منتشر شده در 19 July 2025
در دو بخش اول از این سری، ما داشتهایم : - یک پایپ لاین 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 داریدکامل، صنعتی و امن, آماده برای پیشرفت با پروژههای شما.