CI/CD Python – ส่วนที่ 3 : ไปให้ไกลขึ้นด้วย Poetry, Docker และการเผยแพร่ขั้นสูง
เผยแพร่เมื่อ 19 July 2025
ในสองส่วนแรกของชุดนี้ เรามี : - สร้าง pipeline CI/CD ที่ใช้งานได้สำหรับแอปพลิเคชัน Python โดยใช้ GitHub Actions และ PyPI ได้ทำให้ไปป์ไลน์นี้เป็นระบบอุตสาหกรรมด้วยการทดสอบหลายเวอร์ชัน การเผยแพร่แบบค่อยเป็นค่อยไปผ่าน Test PyPI และเครื่องมือด้านคุณภาพและความปลอดภัย
ในส่วนที่สามนี้, เราจะไปเกินกว่าการตีพิมพ์เพียงอย่างเดียวบน PyPIเพื่อสร้างห่วงโซ่ CI/CD ที่สมบูรณ์ มั่นคง และเป็นมืออาชีพด้วย : - บทกวีเพื่อบรรจุภัณฑ์ที่ทันสมัยและการจัดการขึ้นต่อกันอย่างเหมาะสม - ด็อกเกอร์เพื่อสร้างบิลด์ที่สามารถทำซ้ำได้และหลายแพลตฟอร์ม - การเผยแพร่แบบมีเงื่อนไขเพื่อจัดการสถานการณ์เช่น release candidates. - เครื่องมืออัตโนมัติ(Renovate, Dependabot) เพื่อรักษา pipeline ให้ทันสมัยอย่างง่ายดาย
การรวมเข้ากับ 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`(empty)
[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`.
การ build ที่ทำซ้ำได้ด้วย 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
การเผยแพร่แบบมีเงื่อนไข
ในระบบการทำงานแบบมืออาชีพ ต้องสามารถเผยแพร่ได้เฉพาะในบางกรณีเท่านั้น : - ผู้ปล่อยรุ่นทดสอบไปยัง Test PyPI - เวอร์ชันที่เสถียรมุ่งไปยัง PyPI. - สร้างการบิลด์ 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 เปิด Pull Request แต่ละสัปดาห์เพื่ออัปเดตการพึ่งพาของ Python และ 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 การกระทำ" actor PyPI actor DockerRegistry as "Docker ทะเบียน" actor Automation as "ปรับปรุง/Dependabot" Developer --> (Push code) (ทริกเกอร์ 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: ผลักดันแท็ก v1.2.3-rc GitHub -> CI: (empty) CI -> CD: ตรวจสอบประเภทการเผยแพร่ CD -> Test PyPI: เผยแพร่ RC Developer -> GitHub: พุชแท็ก v1.2.3 GitHub -> CD: เผยแพร่ไปที่ PyPI CD -> Docker Registry: ผลักดัน Docker รูปภาพ @enduml
สถานะ – ไปป์ไลน์ CI/CD
@startuml [*] --> Idle Idle --> CI_Running : ผลัก CI_Running --> CI_Success : ทดสอบผ่าน CI_Running --> CI_Failed : การทดสอบล้มเหลว CI_Success --> CD_Running : ตรวจพบแท็ก CD_Running --> CD_Success : เผยแพร่ โอเค CD_Running --> CD_Failed : ข้อผิดพลาด CD_Success --> [*] @enduml
การปรับใช้ – สถาปัตยกรรม CI/CD
@startuml
node "Developer Machine" {
component "Git Client"
}
node "GitHub Actions" {
component "CI Workflow"
component "CD Workflow"
}
node "Package Repositories" {
artifact "Test PyPI"
artifact "PyPI"
artifact "Docker Registry"
}
"Developer Machine" --> "GitHub Actions"
"GitHub Actions" --> "Test PyPI"
"GitHub Actions" --> "PyPI"
"GitHub Actions" --> "Docker Registry"
@enduml
สรุป
ในส่วนที่สามนี้ เราได้เห็นอย่างไร: - อัปเดตบรรจุภัณฑ์ Python ด้วย Poetry. รับประกันว่าเป็นบิลด์ที่สามารถสร้างซ้ำได้ผ่าน Docker. ตั้งค่าการเผยแพร่แบบมีเงื่อนไข ทำให้การอัปเดตความขึ้นต่อกันเป็นอัตโนมัติ
ตอนนี้คุณมี pipeline CI/CD แล้วสมบูรณ์, อุตสาหกรรมและปลอดภัย, พร้อมที่จะพัฒนาไปกับโครงการของคุณ