Zaten wheel üreten bir derleme işiniz ve onu alması gereken özel bir deponuz var. Hata, ikinci bir işin bir daldan yeniden derlemesine izin verip sonucu aynı sürüm diye adlandırmaktır. Test edilen dosyayı taşıyın, özete göre adlandırın ve yükleme kimlik bilgisini içeride tutun. Aşağıdaki anlatım bir artifact'i genel bir CI runner'dan dahili bir yayıncıya kadar izler.

Kaynak kodun zaten bulunduğu yerde derleyin

Derlemeyi kaynak kodun, araç zincirinin ve test takımının zaten bulunduğu işte çalıştırın. Özel bir depo, o işin oraya ulaşmasını gerektirmez. Derleme frontend'ini projenin zaten kullandığı ortama kurun, sonra proje ikisini de gönderiyorsa her iki dağıtım biçimini de üretin.

python -m build --sdist --wheel --outdir dist
python -m twine check dist/*

Çıktı dizinini küçük ve tek kullanımlık tutun. İleri taşımaya değer tek şey, sonraki işin yayınlayacağı dosyalar ve bunların hash'leridir. Sanal ortamlar ve önbellekler dahil geri kalan her şey kaydedilmiş kaynak revizyonundan yeniden derlenebilir. Yalın bir artifact'in incelenmesi de daha kolaydır, çünkü içindeki her dosya birinin denetleyebileceği bir dosyadır.

Onları neyin ürettiğini kaydedin: dosya adlarından paket adı ve sürümü, kaynak revizyonu ve onları oluşturan workflow çalıştırması. Tek başına bir sürüm dizesi bir dosyayı tanımlamaz, çünkü aynı sürüm farklı commit'lerden iki kez derlenebilir. Revizyonu artifact açıklamasında dosya adlarının yanına yazın ve bu kaydı devrin bir parçası sayın.

Baytları taşıyın, yeniden derleme talimatlarını değil

İkinci bir derleme ikinci bir üründür. Zaman damgaları, paketlenmiş bağımlılıklar ve araç sürümleri baytları değiştirebilir, bu yüzden yeniden derleme kendi test kanıtına ve kendi incelemesine ihtiyaç duyar. Bunun yerine incelenmiş dosyaları terfi ettirin.

Dağıtım dosyalarını CI platformunuzun sağladığı artifact deposuna yükleyin ve dahili işe dal adı yerine o belirli artifact'e bir referans verin.

sha256sum dist/*.whl dist/*.tar.gz
# keep the digests beside the run id in the artifact description

Platformunuz imzalı kökeni destekliyorsa, artifact'i tasdik etmesini isteyin ve sonra beklenen depoyu, workflow'u ve kaynak revizyonunu doğrulayın. GitHub'ın tasdik belgeleri bu biçimdeki iddiaları açıklar. Geçerli bir imza köken kanıtıdır, güvenlik açığı taraması değildir ve yetkilendirme kararı da değildir.

Yüklemeden önce içeride doğrulayın

Dahili iş, aldığı dosyanın onaylanan dosya olduğunu kontrol ederek başlar. Özetleri derleme işinden gelen kayıtla karşılaştırın, gelen şeyden yeniden hesaplanan bir değerle değil.

sha256sum -c digests.txt
python -m twine check dist/*

Sonra üst verileri okuyun. Paket adı, sürüm ve bildirilen bağımlılıklar onayladığınız incelemeyle eşleşmelidir. Adı doğru görünen ama bağımlılık sabitlemeleri değişmiş bir wheel, aynı etiketi taşıyan başka bir pakettir. Üst veriler değiştiyse artifact'i onaylanmamış sayın ve hangi derlemenin onu ürettiğini bulun.

Özetler eşleşmiyorsa durun. Yüklemeyin ve dosyayı yerinde yeniden derleyerek onarmayın; bu, yolda bir şeyin değiştiğine dair kanıtı siler. Uyuşmazlık, artifact deposunun, indirme adımının veya kaydın yanlış olduğu anlamına gelir ve bunların her biri bir sürüm yayınlanmadan önce açıklamayı hak eder.

Yinelenen sürüm yanıtını ele alın

Özel depolar genellikle var olan bir sürümün üzerine yazmayı reddeder ve bu ret bir özelliktir. Yükleme, sürüm var olduğu için başarısız olduğunda deponun o sürüm için kaydını inceleyin ve tuttuğu dosyaları yayınlamayı amaçladığınız özetlerle karşılaştırın.

Var olan bir sürüm, önceki bir yüklemenin başarılı olduğu ve yanıtın kaybolduğu anlamına gelebilir ya da birinin aynı numara altında farklı içerik yayınladığı anlamına.

Sürümü silmeyin ve hatayı aşmak için yeni bir numara uydurmayın. Saklanan içeriğin kabul edilebilir olup olmadığına sürüm sahibiyle birlikte karar verin, sonra sonucu kaydedin. İçerik farklıysa sürümleme sorununuz var, boru hattı sorununuz değil.

Yükleme kimlik bilgisini tek tarafta tutun

Depo kimlik bilgilerine yalnızca dahili yayıncı ihtiyaç duyar ve yalnızca yükleme süresince. Token'ı hedef depoyla ve yükleme işlemleriyle sınırlayın, dahili sistemin sır deposunda tutun ve derleme işinin tamamen dışında bırakın. Derleme işi yayınlayabiliyorsa, derlemeyi değiştirebilen herkes yayınlayabilir.

Hangi dahili workflow'ların yayıncıyı başlatabileceğini de sınırlayın. Zorunlu onay içeren manuel tetikleme, sürümler için makul bir varsayılandır; herhangi bir dala push değildir.

Bitmiş sürüm geride üç şey bırakmalıdır: dağıtım dosyaları, kaynak revizyonuyla birlikte özetleri ve aynı sürümü gösteren bir depo kaydı.

İlgili makaleler