इस श्रृंखला के पहले दो भागों में, हमने : - एक Python एप्लिकेशन के लिए GitHub Actions और PyPI के साथ एक कार्यात्मक CI/CD पाइपलाइन स्थापित किया गया। - इस पाइपलाइन को मल्टी-वर्ज़न टेस्ट के साथ औद्योगिक बनाया गया, Test PyPI के माध्यम से प्रगतिशील प्रकाशन के साथ, और गुणवत्ता और सुरक्षा उपकरणों के साथ।

इस तीसरे भाग में, हम जा रहे हैंPyPI पर सरल प्रकाशन से आगेएक पूर्ण, मज़बूत और पेशेवर CI/CD पाइपलाइन बनाने के लिए : - कविताआधुनिक पैकेजिंग के लिए और निर्भरताओं का अनुकूलित प्रबंधन. - Dockerपुनरुत्पादन योग्य और बहु‑प्लेटफ़ॉर्म बिल्ड़ बनाने के लिए। - शर्ती प्रकाशनरिलीज़ उम्मीदवार जैसे परिदृश्यों को प्रबंधित करने के लिए - �ऑटोमेशन टूल्स(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`.

# Gradle Integration

JBake can be integrated into Gradle builds using the JBake Gradle plugin or by calling the JBake CLI directly:

----
tasks.register<JavaExec>("bake") {
    mainClass.set("org.jbake.launcher.Main")
    classpath = configurations["jbake"]
    args = listOf(projectDir.absolutePath, "$buildDir/jbake")
}

विकास, CI/CD और उत्पादन में समान निष्पादन सुनिश्चित करने के लिए, Docker Poetry के साथ पूरी तरह से एकीकृत होता है।

=== Dockerfile का उदाहरण

[source,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 में एकीकरण

[source,yaml]
----
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 की ओर। केवल के लिए Docker बिल्ड्स ट्रिगर किए गए`main`.

[source,yaml]
----
- 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

[source,yaml]
----
version: 2
updates:
  - package-ecosystem: "pip"
    directory: "/"
    schedule:
      interval: "weekly"
  - package-ecosystem: "github-actions"
    directory: "/"
    schedule:
      interval: "weekly"
----

Dependabot हर हफ़्ते Python और GitHub Actions की निर्भरताओं को अपडेट करने के लिए PR खोलता है।

=== सुधारना

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

Renovate अधिक सूक्ष्म नियंत्रण की अनुमति देता है: निर्भरता समूहन, योजना, और उन्नत नियम।

== आरेख PlantUML

=== उपयोग मामला – उन्नत CI/CD

[plantuml, usecase-cicd, svg]
----
@startuml
actor Developer
actor GitHub as "GitHub Actions"
actor PyPI
actor DockerRegistry as "डॉकर रजिस्ट्री"
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
----

=== अनुक्रम – शर्ती प्रकाशन

[plantuml, sequence-cicd, svg]
----
@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 पाइपलाइन

[plantuml, states-cicd, svg]
----
@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

[plantuml, deployment-cicd, svg]
----
@startuml
node "डेवलपर मशीन" {
  component "गिट क्लाइंट"
}

node "गिटहब एक्शंस" {
  component "सीआई वर्कफ़्लो"
  component "CD वर्कफ़्लो"
}

node "पैकेज रिपॉजिटरीज़" {
  artifact "परीक्षण PyPI"
  artifact "PyPI"
  artifact "डॉकर रजिस्ट्री"
}

"डेवलपर मशीन" --> "गिटहब एक्शंस"
"गिटहब एक्शंस" --> "परीक्षण PyPI"
"गिटहब एक्शंस" --> "PyPI"
"गिटहब एक्शंस" --> "डॉकर रजिस्ट्री"
@enduml
----

== निष्कर्ष

इस तीसरे भाग में, हमने देखा कि : - पायथन पैकेजिंग को आधुनिक बनाएं Poetry के साथ - डॉक़र के माध्यम से पुनरावृत्तीय बिल्ड्स सुनिश्चित करें। - एक शर्ती प्रकाशन स्थापित करें। निर्भरताओं के अपडेट को स्वचालित करें।

अब आपके पास एक CI/CD पाइपलाइन**पूर्ण, औद्योगिकीकृत और सुरक्षित**, आपके प्रोजेक्ट्स के साथ विकसित होने के लिए तैयार।
----

संबंधित लेख