· kaynak dev.to (home feed)
Yeşil gördüğü CI build'ine güvenmeyen bir geliştirici, yanlış dilde kurulum da dahil üç Tauri updater hatasını ortaya çıkardı
Passing durumundaki bir CI build'ine güvenmeyi reddeden bir geliştirici üç Tauri hatası buldu: macOS universal paketleme hatası, uyarı vermeden atlanan release yüklemeleri ve yanlış kurulum dilini servis eden bir updater manifest'i.

Yeşil bir CI build'ini olduğu gibi kabul etmeyi reddeden bir geliştirici, Tauri'nin masaüstü build ve otomatik güncelleme hattındaki üç ayrı hatayı belgeledi. dev.to'da yayımlanan bir yazıya göre bulgular, Stacker News için küçük bir Rust ve Tauri v2 istemcisi olan StackerPulse'tan çıktı ve arasında bozuk bir macOS paketleme adımı, hiçbir şey yüklemediği halde başarı bildiren bir release aksiyonu ve kullanıcılara sessizce yanlış kurulum paketini teslim edebilen bir updater manifest'i yer alıyor.
Paketleyemeyen bir universal build
StackerPulse tek bir crate'tan iki binary üretiyor: uygulamanın kendisi ve küçük bir CLI secret scanner. Windows ve Linux build'leri geçiyor, ancak macOS universal build'i paketleme adımında, ikinci binary'nin universal çıktı dizininde bulunmadığını söyleyen bir hatayla başarısız oluyor.
Yazarın analizi, her bileşenin tek başına doğru çalıştığını gösteriyor. Universal build yolu yalnızca ana binary'yi lipo ile birleştiriyor, binary'leri listeleyen fonksiyon gerekli feature'ları etkin olan tüm [[bin]] girdilerini düzgün şekilde döndürüyor ve bundler da o listedeki her şeyi özenle kopyalıyor. Hata yalnızca bir bileşenin diğerinin çıktısına dair varsayımlarının çöktüğü yerde ortaya çıkıyor: ikinci binary her iki mimari için de derleniyor, universal dizinine hiçbirleşmiyor ve sonra orada adıyla talep ediliyor. Yazar, bu sınıf bir hatanın macOS universal hedefini hiç build etmeyen depolarda gizlice durabileceğine dikkat çekiyor — onu yalnızca bir workflow'un üç platformu birden yayımlaması sayesinde yakaladı.
Installer'ı olmayan yeşil bir release
Workflow düzeltildikten sonra sonraki çalışma da yeşil oldu. Draft release'de CLI arşivleri, checksum'lar ve provenance attestasyonları vardı — ve hiç installer yoktu. Yazıya göre tauri-action, aldığı release ID'si boş olduğunda yüklemeyi atlıyor, ardından 0 çıkış koduyla sonlanıyor ve hiçbir uyarı vermiyor. Tetikleyici, aksiyonun bir release'e çözemediği bir tag adı veren iki satırlık workflow yapılandırmasıydı. Yazar bunu bir Tauri hatasından çok, sessizce başarısız olan bir adımda eksik bir güvenlik kontrolü olarak değerlendiriyor.
Yanlış dili servis eden bir manifest
Üçüncü hata, updater manifest'i latest.json ile release'e gerçekten eklenen dosyaları karşılaştırmaktan doğdu. Manifest'in platforms nesnesi hedef başına bir anahtar taşıyor — windows-x86_64, windows-x86_64-msi, windows-x86_64-nsis — oysa projenin WiX yapılandırması iki MSI installer derliyor: biri en-US, biri ru-RU için.
Mimari başına tek anahtar, yalnızca bir MSI'nın hayatta kalması demek: Rusça build İngilizce olanın üzerine yazıyor, düz windows-x86_64 girdisi İngilizce'yi göstermeye devam ediyor ve aynı mimari için farklı dilleri tanımlayan iki girdi kalıyor. Her installer mevcut ve imzalı, her asset kontrolü geçiyor ve MSI kurulumu yapan bir Rus kullanıcı güncellemeden sonra İngilizce bir uygulama alıyor — muhtemelen hiç rapor etmeyeceği yanlış bir sonuç.
Düzeltme ve nasıl kanıtlandı
İlk hata için bir patch, yazar araştırma yaptığında zaten mevcuttu; ama onu incelemek ek bir boşluk ortaya çıkardı: Cargo hem yapılandırma hem de komut satırı feature listelerini alıyor, ancak get_binaries() yalnızca birine göre filtreliyor, dolayısıyla tauri.conf.json içindeki build.features üzerinden etkinleştirilen bir binary hâlâ kaçırılıyordu. Tauri deposundaki tauri#16488 numaralı pull request, get_binaries()'dan dönen her binary'yi, yapılandırma feature'ları önce katlanmış halde birleştiriyor; böylece feature filtresi ve bundler özdeş bir listeden çalışıyor. Yazar ayrıca kendi yaşadığı bir yakın ıskalıyı anlatıyor: lipo döngüsü içinde ana binary'yi yeniden adlandırma planı, rename_app()'i okuduktan sonra düşürüldü — bu fonksiyon zaten yeniden adlandırmayı sonradan yapıyor ve yazarın değişikliği artık var olmayan bir dosyayı arıyor olacaktı.
Yerel test için bir Mac olmadığından doğrulama, gerçek bir runner üzerinde CI'da ve tauri-cli'nin iki ref'ine karşı yapıldı: dev dalı 1 çıkış koduyla başarısız oluyor, pull request dalı ise ikinci binary app bundle içinde mevcutken derleniyor. Patch olmadan başarısız olan ve patch ile başarılı olan bir build'in düzeltmeyi kanıtladığını savunuyor yazar; tek başına geçen bir build hiçbir şey kanıtlamaz.
Çıkış kodları yerine artifact'leri kontrol etmek
Yazı, build durumunu tamamen yok sayan yaklaşık yedi satırlık bir shell betiğiyle kapanıyor: release'in asset adlarını beklenen bir listeyle diff'le, jq ile latest.json'daki her platform girdisinin hem URL hem imza taşıdığını doğrula ve manifest sürümünün release tag'iyle eşleştiğini kontrol et. Yazarın deposundaki sürüm ayrıca indirme bağlantılarının tag'e sabitlendiğini denetliyor, çünkü draft release'ler, release yayımlandığı anda çalışmayı durduran tag'siz URL'ler üretiyor.
Neden önemli
Masaüstü otomatik güncelleyicileri bir tedarik zinciri yüzeyidir ve updater manifest'i bir release ile kurulmuş her istemci arasındaki sözleşmedir. Üçüncü hata, bunu tehlikeli kılan şeyin arketipidir: hiçbir şey başarısız olmaz, her imza doğrulanır ve kullanıcılar bunu bilmeksizin yine de yanlış artifact'i alır. Yanlış bir dil bir rahatsızlıktır; aynı sessiz teslimatın yanlış veya eski bir binary'yi ulaştırması çok daha kötü olurdu. Ucuz savunma, pipeline'ın iddia ettiğine değil gerçekten yayımlanana bakan birkaç jq ve gh kontrolüdür. Geçen bir build yalnızca araç zincirinin sonuna kadar çalıştığını gösterir — yayımlanan artifact'in doğru, eksiksiz, hatta yayımlamayı amaçladığınız şey olup olmadığı hakkında hiçbir şey söylemez.
- #tauri
- #rust
- #ci-cd
- #supply-chain
- #auto-updates