অংশ ১ : Python এবং PyPI এর জন্য একটি সহজ CI/CD পাইপলাইন সেট আপ করা
Publié le 17 July 2025
Sommaire
ভূমিকা
Objectif : পাঠকে একটি মিনিমালিস্ট কিন্তু কার্যকর CI/CD পাইপলাইন সেটআপ করতে সহায়তা করা, একটি পাইথন অ্যাপ্লিকেশনের জন্য, PyPI-এ স্বয়ংক্রিয় স্থাপনের সাথে।
বিকাশ প্রক্রিয়ার অটোমেশন আধুনিক প্রকল্পগুলিতে অপরিহার্য হয়ে গেছে। একটি ভালভাবে ডিজাইন করা CI/CD পাইপলাইন শুধুমাত্র ডেভেলপমেন্ট চক্রের আরম্ভে রিগ্রেশন সনাক্ত করতে পারে, বরং পুরোপুরি ডিপ্লোইমেন্ট প্রক্রিয়াকে অটোমেট করতে পারে।
এই নিবন্ধে আমরা দেখব কীভাবে GitHub Actions দিয়ে একটি পাইথন অ্যাপ্লিকেশনের জন্য সম্পূর্ণ CI/CD পাইপলাইন (সতত ইন্টিগ্রেশন থেকে সতত বিতরণ পর্যন্ত) সেট আপ করা যায় PyPI-তে।
পাইপলাইন আর্কিটেকচার
আমাদের পাইপলাইন দুটি আলাদা ওয়ার্কফ্লো থেকে গঠিত:
-
CI পাইপলাইন: প্রতিটি push এবং pull requestে চালু
-
সিডি পাইপলাইন: শুধুমাত্র গিটহ্যাব রিলিজের সময় ট্রিগার করা হয়
সত্যাগামী একীভূতকরণ (CI) পাইপলাইনের কনফিগারেশন
CI ওয়ার্কফ্লোর কাঠামো
CI ওয়ার্কফ্লো কোডে প্রতিটি অবদান যাচাই করার জন্য ডিজাইন করা হয়েছে। এর সম্পূর্ণ কনফিগারেশন এখানে দেওয়া হল।
name: CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install ruff pytest pytest-mock
- name: Run Linting (Ruff)
run: ruff check .
- name: Run Tests (Pytest)
run: pytest
CI ধাপের বিশ্লেষণ
প্রেরক (on)
----
----
on:
push:
branches:
- main
pull_request:
branches:
- main
----
পাইপলাইন ট্রিগার হয় : - প্রতিটি পুশ ব্রাঞ্চে`main` প্রতিটি pull request প্রতি`main`
এই পদ্ধতি নিশ্চিত করে যে মূল কোড স্থিতিশীল থাকে এবং যে কোনও অবদান একত্রিত করার আগে যাচাই করা হয়।
==== 2. রানটাইম পরিবেশ
----
runs-on: ubuntu-latest
Ubuntu Latest বেশিরভাগ Python প্রকল্পের জন্য কর্মক্ষমতা, খরচ এবং সামঞ্জস্যতার মধ্যে ভাল বিনিময় প্রদান করে।
==== 3. কোড চেকআউট
```yaml
----
----
- name: Checkout code
uses: actions/checkout@v4
----
কর্ম`checkout@v4`রিপোজিটরের সোর্স কোড আনে। v4 সংস্করণ কর্মক্ষমতা এবং নিরাপত্তার উন্নতি আনে।
==== 4. কনফিগারেশন Python
----
- name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.x'
ব্যবহারের`'3.x'`এটি স্বয়ংক্রিয়ভাবে Python 3-টির সর্বশেষ স্থিতিশীল সংস্করণ ব্যবহার করতে সক্ষম করে, রক্ষণাবেক্ষণকে সহজ করে।
==== 5. ডিপেন্ডেন্সি ইনস্টলেশন
```yaml
----
----
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install ruff pytest pytest-mock
----
এই ধাপ : - পিপকে آخرین সংস্করণে আপডেট করুন - প্রজেক্টের নির্ভরতাগুলো ইনস্টল কর - উন্নয়ন সরঞ্জামগুলো যোগ করুন (লিন্টিং এবং পরীক্ষা)
==== 6. Ruff-এ লিংটিং
----
- name: Run Linting (Ruff) run: ruff check .
**রাফ**এটি একটি অত্যশীঘ্র পাইথন লিন্টার যা রস্টে লেখা হয়েছে। এটি Flake8, Black, isort মতো различни টুলের বৈশিষ্ট্য একত্র করে একটি একক উচ্চ-কর্মক্ষম টুলকে গঠন করে।
==== 7. পরীক্ষাগুলোর নিষ্পাদন
```yaml
----
----
- name: Run Tests (Pytest)
run: pytest
----
Pytest সম্পূর্ণ পরীক্ষা স্যুটটি চালায়, নিশ্চিত করে যে কোনো পরিবর্তন রিগ্রেশন তৈরি না করে।
== ডিপ্লপমেন্ট পাইপলাইন কনফিগারেশন (CD)
=== Workflow CD এর গঠন
সিডি ওয়ার্কফ্লো শুধুমাত্র গিটহাব রিলিজের সময় ট্রিগার হয় এবং পাইপাই-এ প্রকাশনায় স্বয়ংক্রিয়ভাবে করে।
[source,yaml]
----
name: Publish to PyPI
on:
release:
types:
- published
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build and publish
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
python setup.py sdist bdist_wheel
twine upload dist/*
----
=== CD ধাপের বিশ্লেষণ
==== ট্রিগার রিলিজ
----
on: release: types: - published
CD পাইপলাইনটি শুধুমাত্র গিটহাব রিলিজ প্রকাশিত হওয়ার সময়ই ট্রিগার হয়। এই পদ্ধতিটি ডিপ্লায়মেন্টগুলির সুনির্দিষ্ট নিয়ন্ত্রণ নিশ্চিত করে।
==== 2. বিল্ড টুলস ইনস্টলেশন
```yaml
----
----
pip install setuptools wheel twine
----
- **সেটআপটুলস**Python প্যাকেজিং সরঞ্জাম - **চাকা**: আধুনিক পাইথন বিতরণের ফর্ম্যাট - **সুতা**: PyPI-এ আপলোড করার জন্য নিরাপদ সরঞ্জাম
==== 3. প্রমাণীকরণের কনফিগারেশন
----
env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
প্রমাণীকরণ একটি PyPI API টোকেন ব্যবহার করে যা গিটহাব রহস্যা হিসেবে সংরক্ষিত রয়েছে, যা মৌলিক শংবেদনাগারিকতাগুলোর চেয়ে নিরাপদ।
==== 4. বিল্ড এবং প্রকাশনা
```yaml
----
----
run: |
python setup.py sdist bdist_wheel
twine upload dist/*
----
- `sdist`একটি উৎস বিতরণ তৈরি কর - `bdist_wheel`: একটি wheel তৈরি কর (বাইনারি বিতরণ) - `twine upload`: PyPI-এ বিতরণ প্রকাশ করে
== পাইথন প্যাকেজ কনফিগারেশন
=== setup.py-এর গঠন
পাইপলাইন কাজ করতে, আপনার প্রকল্পে একটি ফাইল অন্তর্ভুক্ত করতে হবে`setup.py` :
[source,python]
----
from setuptools import setup, find_packages
with open("README.adoc", "r", encoding="utf-8") as fh:
long_description = fh.read()
setup(
name="playlist-downloader",
version="1.0.0",
author="Votre Nom",
author_email="[email protected]",
description="CLI tool for managing YouTube playlists",
long_description=long_description,
long_description_content_type="text/plain",
url="https://github.com/cheroliv/playlist-downloader",
packages=find_packages(),
classifiers=[
"Development Status :: 4 - Beta",
"Intended Audience :: Developers",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
],
python_requires=">=3.8",
install_requires=[
"typer>=0.9.0",
"yt-dlp>=2023.1.6",
"google-api-python-client>=2.70.0",
"google-auth-oauthlib>=0.7.1",
"pymonad>=2.4.0",
"pyyaml>=6.0",
],
entry_points={
"console_scripts": [
"playlist-downloader=cli:app",
],
},
)
----
=== setup.py এর গুরুত্বপূর্ণ বিষয়
1. **মেটাডেটা**নাম, সংস্করণ, লেখক, বিবরণ
2. **নির্ভরতা**প্রয়োজনীয় প্যাকেজের তালিকা
3. **প্রবেশের বিন্দু**: CLI কমান্ডগুলো প্রকাশিত
4. **বিভাজক**: PyPI-এর মেটাডেটা
== GitHub Secrets-এর মাধ্যমে নিরাপত্তা
=== PyPI টোকেন কনফিগারেশন
1. **PyPI-এ একটি API টোকেন তৈরি করুন**:
- PyPI-এ সাইন ইন করুন - যান Account Settings > API tokens - উপযুক্ত অনুমতির সাথে একটি নতুন টোকেন তৈরি করুন
1. **GitHub-এ গোপনীয়তা যোগ করুন**</think>
(empty)
- রেপোজিটরি সেটিংস > গোপনীয়তা এবং ভেরিয়েবল > একশনস - একটি নতুন গোপনীয়তা তৈরি করুন যার নাম`PYPI_API_TOKEN` আপনার PyPI টোকেনটি পেস্ট করুন
[plantuml, secrets-flow, svg]
----
@startuml
!theme plain
actor Developer as dev
participant "GitHub সংগ্রহস্থল" as repo
participant "GitHub Actions" as actions
participant PyPI
dev -> repo : Configure PYPI_API_TOKEN secret
repo -> actions : Trigger CD pipeline on release
actions -> actions : Access secret securely
actions -> PyPI : Authenticate with token
PyPI -> PyPI : Validate and publish package
note over actions, PyPI
Token never exposed in logs
Automatic rotation possible
end note
@enduml
----
== সম্পূর্ণ তैनাতি কর্মপ্রবাহ
=== ডিপ্লয়মেন্ট সিকোয়েন্স
[plantuml, deployment-sequence, svg]
----
@startuml
!theme plain
actor Developer as dev
participant "স্থানীয় Git" as git
participant "GitHub" as github
participant "গিটহাব অ্যাকশন" as actions
participant PyPI
participant "প্রব্যবহারকারীরা" as users
dev -> git : git tag v1.0.0
dev -> git : git push origin v1.0.0
git -> github : Push tag
dev -> github : Create release from tag
github -> actions : Trigger CD pipeline
actions -> actions : Checkout code
actions -> actions : Setup Python environment
actions -> actions : Install build tools
actions -> actions : Build distributions (sdist + wheel)
actions -> PyPI : Upload to PyPI with token
PyPI -> PyPI : Validate and publish
users -> PyPI : pip install playlist-downloader
note over dev, github
Release creation can be automated
or done manually through GitHub UI
end note
@enduml
----
=== পাইপলাইনের অবস্থাসমূহ
[plantuml, pipeline-states, svg]
----
@startuml
!theme plain
[*] --> Idle
Idle --> CI_Running : Push/PR created
CI_Running --> CI_Success : All checks pass
CI_Running --> CI_Failed : Linting/Tests fail
CI_Success --> Idle : Merge completed
CI_Failed --> Idle : Fix and retry
Idle --> CD_Running : Release published
CD_Running --> CD_Success : Package published
CD_Running --> CD_Failed : Build/Upload error
CD_Success --> Idle : Package available on PyPI
CD_Failed --> Idle : Fix and retry release
note on link #red : Blocks merge
note on link #green : Allows deployment
@enduml
----
== শ্রেষ্ঠ অনুশীলন এবং অপ্টিমাইজেশন
=== সংস্করণ ব্যবস্থাপনা
ব্যবহার করুন সিম্যানটিক Git ট্যাগ
----
git tag -a v1.2.3 -m "Release version 1.2.3" git push origin v1.2.3
=== 2. মেট্রিক্স পরীক্ষা
একাধিক পাইথন সংস্করণে পরীক্ষা করতে :
```yaml
----
----
strategy:
matrix:
python-version: [3.8, 3.9, "3.10", "3.11"]
----
=== 3. নির্ভরতা ক্যাশ
ক্যাশ দিয়ে বিল্ড গতিশীল করুন:
----
- name: Cache pip dependencies uses: actions/cache@v3 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
=== 4. স্থাপন পরিবেশ
GitHub পরিবেশগুলো ব্যবহার করে নিয়ন্ত্রিত স্থাপন করুন:
```yaml
----
----
jobs:
deploy:
environment: production
runs-on: ubuntu-latest
----
== ব্যবহারের ক্ষেত্র এবং আর্কিটেকচার
=== ইউজ কেস ডায়াগ্রাম
[plantuml, use-cases, svg]
----
@startuml
!theme plain
left to right direction
actor "ডেভেলপার" as dev
actor "GitHub Actions" as ga
actor "অंतিম ব্যবহারকারী" as user
package "CI/CD সিস্টেম" {
usecase "Run Linting" as lint
usecase "পরীক্ষা চলানো" as test
usecase "বিল্ড প্যাকেজ" as build
usecase "PyPI-এ প্রকাশ করুন" as publish
usecase "রিলিজ তৈরি করুন" as release
}
dev --> lint : Pushes code
dev --> test : Pushes code
dev --> release : Creates release
ga --> build : On release trigger
ga --> publish : After successful build
user --> publish : Downloads package
lint .> test : triggers
test .> build : on success
build .> publish : on success
@enduml
----
=== প্রসারবস্থানের আর্কিটেকচার
[plantuml, deployment-architecture, svg]
----
@startuml
!theme plain
cloud "GitHub" {
[Source Repository]
[GitHub Actions]
[Secrets Store]
}
cloud "PyPI" {
[Package Registry]
[Distribution Files]
}
node "CI/CD পাইপলাইন" {
[Linting]
[Testing]
[Building]
[Publishing]
}
[Source Repository] --> [GitHub Actions] : Triggers
[GitHub Actions] --> [Linting]
[Linting] --> [Testing]
[Testing] --> [Building]
[Building] --> [Publishing]
[Publishing] --> [Package Registry] : Uploads
[Secrets Store] --> [Publishing] : Provides token
note as N1
Secure token-based
authentication
end note
[Secrets Store] .. N1
@enduml
----
== নিগরানি এবং ডিবাগিং
=== লগ এবং মনিটরিং
GitHub Actions প্রতিটি ধাপে বিস্তারিত লগ প্রদান করে। ডিবাগ করতে :
1. **লগগুলো পরীক্ষা করুন**প্রত্যেকটি ধাপের
2. **ডিবাগ সক্রিয় করুন**Sathe`ACTIONS_STEP_DEBUG`
3. **আর্টিফ্যাক্ট ব্যবহার করুন**বिल্ড ফাইলগুলো সংরক্ষণের জন্য
----
- name: Upload build artifacts uses: actions/upload-artifact@v3 if: failure() with: name: build-logs path: build/
=== বিজ্ঞপ্তি
Slack বা ইমেল বিজ্ঞপ্তি যোগ করুন :
```yaml
----
----
- name: Notify on failure
if: failure()
uses: 8398a7/action-slack@v3
with:
status: ${{ job.status }}
webhook_url: ${{ secrets.SLACK_WEBHOOK }}
----
== নিষ্কর্ষ
GitHub Actions-এ একটি শক্তিশালী CI/CD পাইপলাইন স্থাপন করে, আপনার ডেভেলপমেন্ট অভিজ্ঞতা ভয়বহে পরিবর্তিত হয়। লিন্টিং, পরীক্ষা এবং স্থাপনকে স্বয়ংক্রিয় করলে, আপনি :
- **ত্রুটি হ্রাস করুন**উৎপাদনে - **চক্রগুলোকে ত্বরান্বিত করুন**বিকাশের - **বিশ্বাস বাড়ান**আপনার রিলিজে - **সহযোগিতা সহজ করুন**টিমে
এই পাইপলাইনটি লিনটিং সরঞ্জামগুলো, টেস্ট ফ্রেমওয়ার্কগুলো এবং স্থাপন গন্তব্যগুলো সামঞ্জস্য করে বিভিন্ন ধরনের Python প্রকল্পে প্রয়োগ করা যায়।
প্রারంభিক বিনিয়োগ এই ওয়ার্কফ্লো গুলোর কনফিগারেশনে দ্রুতভাবে ফেরত আসে, কারণ এটি সময় বাঁচায় এবং স্থাপনে ম্যানুয়াল ত্রুটি কমানে।
== অতিরিক্ত সম্পদ
- https://docs.github.com/en/actions[GitHub Actions ডকুমেন্টেশন] - https://packaging.python.org/[পাইথন প্যাকেজিং গাইড] - https://docs.pytest.org/[থকুমেন্টেশন Pytest] - https://docs.astral.sh/ruff/[Documentation Ruff] - https://twine.readthedocs.io/[টুইন ডকুমেন্টেশন]
�✅ সক্রিয় পাইপলাইন প্রাপ্ত ! আপনি এখন একটি সহজ CI/CD পাইপলাইন আছে যা আপনাকে আপনার পরীক্ষা স্বয়ংক্রিয় করতে দেয় এবং GitHub Actions থেকে সরাসরি PyPI-এ আপনার প্যাকেট Python প্রকাশ করতে দেয়।
তবে, এই পাইপলাইন ইচ্ছামত ন্যূনতম রূপে রয়েছে। এটি এখনও পেশাগত পরিবেশে জরুরি কিছু দিক কভার করে না :
পাইথনের মাল্টি-ভার্সন পরীক্ষা,
স্বয়ংক্রিয় নিরাপত্তা বিশ্লেষণ,
প্রগতিশীল ডিপ্লয়মেন্ট Test PyPI-এর মাধ্যমে,
পাইপলাইন নিরীক্ষণ ও মেট্রিক্স
সংস্করণব্যবস্থাপনার স্বয়ংক্রিয়করণ এবং আধুনিক শ্রেষ্ঠ পদ্ধতির একীকরণ (pyproject.toml).
আসন্ন অংশে, আমরা পরবর্তী ধাপে যাব। আপনি শিখবেন কিভাবে এই মৌলিক পাইপলাইনকে একটি বাস্তবে পরিকল্পিত indústrial স্থাপনশ্রেণী, দৃঢ় ও নিরাপদ রূপান্তরে উত্পাদন-মোডের Python প্রকল্পগুলির জন্য প্রস্তুত করা যায়।
----