Bir pipeline’da tarih testi
Pencere keşfetmek içindir. Bu ise diğer yarısı: kurulacak bir çalışma zamanı gerektirmeyen, yaklaşık 2,4 MB’lık bir komut satırı derlemesi; çıkış kodu, hedefin kendi kodu değil, kapsama kararıdır.
Çıkış kodu karardır
Aracı betiklenebilir kılan tasarım kararı budur. Bir oturum bittiğinde çıkış kodu, “uygulama ne döndürdü” değil, “zaman değişikliği etkili oldu mu” sorusunu yanıtlar. Böylece bir pipeline, sessizce gerçekleşmeyen bir değişiklik yüzünden başarısız olabilir - ki başarısız olmaya değer hata budur, çünkü ondan sonra gelen her şey hiçbir şeyi kanıtlamayan bir testtir.
Hedefin kendi çıkış kodu da oturum verisinde yine bildirilir.
| Kod | Anlamı |
|---|---|
| 0 | çalışıyor - zamanı okuyan her süreç oturum saatini gördü |
| 10 | kısmen çalışıyor - bazı kanallar kapsandı, bazıları kapsanmadı |
| 11 | çalışmıyor - değişiklik kilit kanallara ulaşmadı |
| 4 | belirsiz - kapsama belirlenemedi |
| 1 | kullanım hatası - hatalı bir bayrak ya da hatalı bir ifade |
| 2 | hedef başlatılamadı ya da içine enjekte edilemedi |
| 12 | hedef ortadan kayboldu; bu, tek örnekli bir uygulamaya işaret ediyor |
| 3 | iç hata - motor başlatılamadı, beklenmedik bir durumla karşılaştı ya da oturumu kapatmadan önce durdu (kendi çıkış kodu ne olursa olsun). Böyle bir çalıştırmanın kararı yoktur |
| 5 | işlem bu sürümde derlenmemiş |
| 6 | çalıştırma yarıda kesildi - --timeout doldu ya da motor 15 saniye boyunca yanıt vermeyi bıraktı ve durduruldu. Bu bir karar değildir: oturum kesintiye uğradığı için hedef hakkında ne bir yönde ne de diğerinde bir şey kanıtlar |
| 7 | başka bir oturum zaten çalışıyor - aynı anda tek oturum. O bittikten sonra yeniden denemek yeterli |
| 8 | oturum bir karara vardı, ancak kanıtı --report ile verilen dosyada değil - disk doluydu ya da başka bir program eski dosyayı açık tutuyordu, o dosya da olduğu gibi kalır. Karar, komutun yazdırdığı raporda yine yer alır |
İki komutun tüm bayrakları ve hesap makinesi için aynı tablo komut satırı başvurusunda.
Sınırlı çalıştırmalar
Bir pipeline, bir masaüstü uygulamasının bir insan tarafından kapatılmasını bekleyemez.
--ticks N, oturumu N kalp atışından sonra - her biri bir gerçek saniye - sonlandırır
ve o ana kadar bulduklarını bildirir. Kapsama zaten sürecin ilk anlarında belirlenir, dolayısıyla
genellikle kısa bir sınır yeterlidir.
# On saniye, sonra dur ve bildir chrono run ".\build\test.exe" --preset year-rollover --ticks 10 --report evidence.txt
Makine çıktısı ve kanıt
--json, oturumu insan raporu yerine makinece okunabilir kayıtlar olarak verir - kanal başına kapsama dahil, aynı bilgiler.--report <path>, insan raporunu bir dosyaya yazar; bu da makul bir derleme çıktısı olur. Kararı çalışıyor dışında bir şey olan bir oturum, uyarıyı en alta gömmek yerine dosyaya güvenilmez-kanıt başlığıyla başlar.- Hesap makinesi de
--jsonkonuşur; böylece bir pipeline ihtiyaç duyduğu tarihi hesaplayıp geri besleyebilir.
# Tarihi hesaplayın, sonra o tarihte çalıştırın chrono calc --base today --snap eom --json chrono run ".\build\test.exe" --preset month-end --ticks 10 --json
Yaklaşık bir adım
- name: Month-end behaviour
shell: pwsh
run: |
.\chrono.exe run ".\build\test.exe" --preset month-end --ticks 10 --report evidence.txt
# buradaki sıfırdan farklı bir çıkış kodu, değişikliğin tutmadığı anlamına gelir; bunun
# ardındaki test hiçbir şeyi kanıtlamamış olurdu
- name: Keep the evidence
uses: actions/upload-artifact@v7
with:
name: chrono-evidence
path: evidence.txt
Runner’lar hakkında iki dürüst uyarı
- Bir Windows runner’ı gerekir. Linux ya da macOS derlemesi yok ve olmayacak - Linux’ta bu işi zaten libfaketime karşılıyor.
- Barındırılan bir runner’daki antivirüs enjeksiyonu engelleyebilir. Zamanı kaydırmak, hedef sürece bir kitaplık enjekte etmek demektir; bu, kötü amaçlı yazılımların da kullandığı, belgelenmiş bir Windows tekniğidir. Bunu engelleyen bir runner, sahte bir başarı yerine bunu söyleyen bir çıkış kodu üretir - ama ona güvenmeden önce öğrenilmesi gereken bir şeydir.
Aynı nedenle bu projenin kendi uçtan uca test paketi, barındırılan bir runner’da değil, gerçek makinelerde çalışır. Sürekli entegrasyonu her şeyi derler ve birim testlerinden geçirir; değişikliğin kendisi ise her sürümden önce gerçek uygulamalar üzerinde hem 32 bit hem de 64 bit derlemelerle elle denenir.