Açık kaynak veya iç kütüphane dağıtımına ciddiye veren her Python geliştiricisi için PyPI'ye paketleme ve yükleme işlemi manuel olarak yapmak önemli bir darboğazdır. Hata yapmaya yatkın, sıkıcıdır ve geliştirme iş akışında sürtünme yaratır. GitHub Actions, Twine ve sıkı bir anlamsal sürümleme kullanarak bu süreci otomatikleştirerek, her yayının tekrarlanabilir, güvenli ve anlık olduğundan emin olabilirsiniz.
Modern Yayın Hattı
Güçlü bir yayın hattı, dosyaları sadece yüklemekten daha fazlasını yapar; kodunuzu doğrular, sürüm numaralarını otomatik olarak yönetir ve gizli bilgileri güvenli bir şekilde işler. Bu otomasyonun temel bileşenleri şunlardır:
- GitHub Actions: Yeni bir etiket itme gibi belirli olaylarda iş akışlarını tetikleyen motor.
- Setuptools / Poetry / Hatch: Dağıtım dosyalarınızı (sdist ve bdist_wheel) oluşturan araçlar.
- Twine: Paketleri PyPI'ye yüklemek için güvenilir yardımcı program.
- Anlamsal Sürümleme (SemVer): Sürüm numaralarının değişikliklerin doğasını yansıtmasını (Ana.Küçük.Yama) sağlayan standart.
Adım 1: Anlamsal Sürümlemeyi Zorunlu Kılma
Otomatikleştirmeden önce, sürümlerin nasıl artırılacağını tanımlamanız gerekir. versioneer desenini kullanmanızı veya Git etiketlerine güvenmenizi öneririz. İş akışı, yalnızca v* desenine uyan bir etiket itildiğinde tetiklenecektir. Bu, sürüm numaralarının bir CI çalıştırması tarafından otomatik olarak oluşturulmadığından, geliştirici tarafından açıkça beyan edildiğinden emin olur.
Adım 2: GitHub Actions İş Akışını Yapılandırma
.github/workflows/publish.yml konumunda bir dosya oluşturun. Bu YAML dosyası hattı tanımlar. İş akışı, etiketler için filtreleme yaparak create olayında çalışacaktır.
name: Python Dağıtımını PyPI'ye Yayınla
on:
release:
types: [published]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
id-token: write # OIDC kimlik doğrulamasını kullan
steps:
- uses: actions/checkout@v4
- name: Python'u Kur
uses: actions/setup-python@v5
with:
python-version: '3.x'
- name: Bağımlılıkları Yükle
run: |
python -m pip install --upgrade pip
pip install build twine
- name: Oluştur ve Yayınla
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
python -m build
twine upload dist/*
Güvenlik En İyi Uygulamaları: OIDC Kullanımı
Yukarıdaki örnek, eski token işleme için id-token: write ve ortam değişkenleri kullanır. Ancak, modern en iyi uygulama, PyPI için OpenID Connect (OIDC) kullanmaktır. Bu, GitHub Actions'ın uzun ömürlü API token'larını depo gizli bilgilerinizde saklamadan güvenilir bir kimlik almasını sağlar. Bunu etkinleştirmek için PyPI proje ayarlarınızda bir OIDC sağlayıcısı yapılandırmanız gerekir.
Maksimum güvenlik için publish adımınızı aşağıdaki gibi güncelleyin:
- name: Dağıtımı PyPI'ye Yayınla
run: twine upload dist/*
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
Not: OIDC kullanırken, şifreyi gizli bilgilerde saklamanıza genellikle gerek yoktur. Bunun yerine, actions/setup-python adımı veya belirli bir OIDC adımı kimlik doğrulamayı dinamik olarak yönetir.
Adım 3: Dağıtımı Oluşturma
İş akışında python -m build kullanıyoruz. Bu, setup.py sdist bdist_wheel için modern bir yerini almıştır. Yerel ortamınızdan izole edilmiş build kullandığınızdan emin olur ve tekerlek dosyalarının (wheel files) temiz bir konteynerda olduğu gibi tam olarak oluşturulmasını garanti eder. Bu adım, hem kaynak dağıtımını hem de ikili tekerleği içeren dist/ klasörünü üretir.
Sonuç
Python paket yayınlarınızı otomatikleştirmek, manuel bir görevi güvenilir ve denetlenebilir bir sürece dönüştürür. GitHub Actions'ı kullanarak, yayın mantığını yerel makinenizden ayırırsınız. Twine ve OIDC kullanarak yüksek güvenlik standartlarını korursunuz. Son olarak, Git etiketleri aracılığıyla anlamsal sürümlemeye bağlı kalarak, kullanıcılarınıza yazılımınızın kararlılığı hakkında netlik sağlarsınız.
Bu iş akışını kritik olmayan bir projede uygulayarak başlayın. Ana depoya itmeden önce TestPyPI'de bir test paketi oluşturarak test edin. Hattınız kararlı hale geldiğinde, yeni özellikleri yayınlamanın bir işlemi etiketlemek kadar basit hale geleceğini göreceksiniz; bu da dağıtımları yönetmek yerine kod yazmaya odaklanmanızı sağlar.