ในสองส่วนแรกของชุดนี้ เรามี : - สร้าง 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 แล้วสมบูรณ์, อุตสาหกรรมและปลอดภัย, พร้อมที่จะพัฒนาไปกับโครงการของคุณ

บทความที่เกี่ยวข้อง