Conventional commits'ten bir changelog'a
5 dk okuma güncellendi:
Conventional commits bir changelog’a ücretsiz üç şey verir: her değişikliğin türü, dokunduğu sistem parçası, ve bir şeyi bozup bozmadığı. Başka bir şey vermezler. Changelog olan ifade, gruplandırma ve seçim tamamen açık kalır, ve aksini iddia eden bir pipeline biçimlendirilmiş bir git log gönderir.
feat(exports): add CSV column selection
fix(auth): reject expired refresh tokens
chore(deps): bump node-pg to 8.11
Conventional Commits formatında üç commit. Bunlardan, bir makine size birinin özellik, birinin düzeltme, birinin ev işi olduğunu, ve her birinin sistemin hangi parçasına dokunduğunu söyleyebilir. Bu gerçekten faydalıdır, ve konvansiyonun tüm sözü budur: bir insandan başka bir şey tarafından okunabilen bir commit geçmişi. Hata, bunun size bir changelog verdiğini düşünmektir. Size ham malzemeyi verir.
Konvansiyon neyi belirtir?
Bir tür, isteğe bağlı bir scope, ve bir açıklama: type(scope): description. Türler geleneksel
olarak feat, fix, chore, docs, refactor, test, perf, build, ci’dir. İki şey bir
breaking change’i işaretler: iki nokta üst üsteden önce bir !, veya bir BREAKING CHANGE:
footer’ı. Araçlar minor ve patch sürüm artışları için feat ve fix’e, major için breaking
belirtecine göre hareket eder.
| Commit size verir | Changelog’un ihtiyacı olan | Boşluğu kim doldurur |
|---|---|---|
feat / fix / chore | Added / Fixed / dahili | Bir eşleme, otomatik |
(scope) | Okuyucunun tanıdığı bir gruplandırma | Bir kişi, scope başına bir kez |
! veya BREAKING CHANGE: | Kimin ne zamana kadar bozulacağı ve ne yapılacağı | Bir kişi, her seferinde |
| Bir gözden geçiren için yazılmış açıklama | Bir müşteri için yazılmış sonuç | Bir kişi, her girdi |
| Bir commit | Birden çok commit olabilecek bir değişiklik | Squash kuralları, veya bir kişi |
Belirteç bunu araca söyler; çağırana söylemez, ki bu bir API nasıl deprecate edilir ve breaking change nedir’in konusudur. Bu küçük bir spesifikasyondur ve ondan hiçbir şey üretmeseniz bile takip etmeye değer, çünkü commit başına bir karar zorlar: bu kullanıcıların gördüğü bir değişiklik mi, değil mi.
Conventional commits nerede durur?
Cümlede dururlar. Konvansiyonun yakaladığı her şey bir değişiklik hakkında metadata’dır; değişimin kendisi hâlâ bir gözden geçirenin kelime dağarcığında tarif edilir.
Commit mesajları gözden geçirenler için yazılır. fix(auth): reject expired refresh tokens
doğrudur ve bir müşteriye hiçbir şey söylemez. Bir changelog’un okuyucusu “bir oturum gerçekten
süresi dolduğunda çıkış yapacaksınız, ara sıra 401 görmek yerine” ister.
Scope’lar dahilidir. exports, auth, ingest modül isimleridir. Kararlıdırlar, ki bu onları
gruplamak için iyi yapar, ve kod tabanının dışındaki herkes için anlamsızdırlar.
Bir değişiklik genellikle birden çok commit’tir. On bir commit’te merge edilen bir özellik on bir girdi üretir, onu gürültü olan, ve bunu gizlemek için squash yapmak inceleme geçmişini kaybettirir.
chore bir kategori değil bir çöp kutusudur. Bağımlılık güncellemeleri, CI değişiklikleri ve
yeniden adlandırmaların hepsi oraya iner, ve bazıları kullanıcılar için önemliyken çoğu değildir.
Yani: konvansiyon size tür, scope ve breaking durumunu ücretsiz verir, ve ifadeyi, gruplandırmayı ve seçimi tamamen açık bırakır. Bu üçü changelog’dur. Bir changelog kaydının sahibi gerçekte kimdir o ifadeyi, gruplandırmayı ve seçimi kimin üstlenmesi gerektiğini ele alır, çünkü konvansiyonun kendisinin bu konuda hiçbir görüşü yoktur.
Conventional commits’ten bir changelog nasıl üretilir?
İki katmanda, ve ikincisi zorunlu olmalı.
Katman bir, otomatik. Merge’de, commit’ten bir taslak girdi türetin: bir changelog türüne
eşlenmiş tür (feat Added’a, fix Fixed’e, bir flag ile Changed’e bir breaking belirteci), metin
yerine metadata olarak tutulan scope, PR’a bağlantı. Keep a Changelog’un
istediği Unreleased bölümüne yerleştirin.
Katman iki, insan, ve gerekli. Bir sürüm çıkmadan önce, her taslak girdi ya kullanıcının kelime dağarcığında bir satırlık yeniden yazım alır, ya da dahili olarak işaretlenir ve genel görünümden çıkarılır. Bu, insanların atlamaya çalıştığı adımdır, ve atlamak diff gibi okunan changelog’lar üretir.
Önemli tasarım detayı, katman ikinin pipeline’da isteğe bağlı olmamasıdır. Bir sürüm düzenlenmemiş taslaklarla kesilebiliyorsa, herkesin meşgul olduğu haftada kesilecektir. Hangi adımların makineye, hangilerinin kişiye ait olduğu changelog otomasyonu’nun tamamıdır.
Sürümü kesmek aynı zamanda bir git etiketi, bir sürüm ve bu changelog girişinin ya uyuştuğu ya da senkronizasyondan çıkmaya başladığı andır; git etiketleri, sürümler ve changelog’unuz üçünü senkronize tutmayı ele alır.
Üç tuzak
Squash merge’ler footer’ları yer. Platformunuz PR başlığını mesaj olarak sıkıştırıyorsa, o
branch içindeki bir commit’in BREAKING CHANGE: footer’ı kaybolur, ve araçlarınız sessizce
breaking change’i görmeyi bırakır. Squash şablonunuzun gerçekte neyi koruduğunu kontrol edin.
Revert commit’leri hayalet girdiler üretir. Ertesi gün geri alınan bir fix, türetim revert’leri
uzlaştırmadıkça hiç gönderilmemiş bir şey için bir girdi üretir. Çoğu araç bunu yapmaz.
Sürüm artışı ve changelog düzensizleşir. Sürüm commit’lerden hesaplanıyorsa ve changelog sonradan elle yazılıyorsa, yaklaşık iki sürümde birbirinden ayrılırlar. İkisini de aynı geçişte hesaplayın veya birinin yanlış olduğunu kabul edin.
Pipeline olmadan mekanik kısmı istiyorsanız
Changelog üreticimiz türetim adımını tarayıcıda yapar: commit’leri yapıştırın, gruplandırılmış, türlendirilmiş girdiler alın. Kasıtlı olarak deterministik ve tamamen client-side’dır, bu yüzden yapıştırdığınız commit’ler makinenizi hiç terk etmez, ki bu mesajlar özel bir repodan geldiğinde önemlidir. Toplama yarısını dürüstçe yapar ve katman ikiyi denemez, çünkü katman iki bir yargıdır ve onu taklit eden bir araç tam olarak bu makalenin karşı çıktığı changelog’u üretir.
Pipeline versiyonu için changelog araçları var olanı kapsar.
Özet
Conventional commits “bu ne tür bir değişiklik” sorusunu güvenilir ve ucuz bir şekilde cevaplar. “İnsanlara ne söylemeliyiz” sorusunu cevaplamazlar, ve commit mesajının üzerine ne kadar araç eklerseniz ekleyin bu yapmayacaktır, çünkü bilgi hiçbir zaman commit mesajında değildi. Yeniden yazım için bütçe ayırın.
FAQ
Conventional commits otomatik olarak bir changelog üretir mi? Otomatik olarak bir taslak üretirler: türlendirilmiş, scope’lu, bağlantılı girdiler. Bir müşteri için ifade, gruplandırma ve neyin dışarıda bırakılacağı kararı hâlâ bir insana ihtiyaç duyar, ve o adımı atlayan bir pipeline commit mesajları yayımlar.
Hangi conventional commit türleri bir changelog’da görünür?
feat ve fix her zaman, Added ve Fixed olarak. perf genellikle, Changed olarak. chore,
docs, refactor, test, build ve ci varsayılan olarak dahilidir ve sadece bir kişi birini
terfi ettirirse görünürler.
Conventional commits bir breaking change’i nasıl işaretler?
Türden veya scope’tan sonra bir ! (feat(api)!: ...), veya commit gövdesinde bir
BREAKING CHANGE: footer’ı. Bir squash merge sadece PR başlığını tutarsa ikisi de kaybolur.
Bir changelog’u otomatikleştirmek için conventional commits gerekli mi? Hayır. PR etiketleri, PR şablonları ve issue bağlantıları, pull request ile merge eden ekipler için aynı metadata’yı taşır. Conventional commits, değişim birimi commit olduğunda en ucuz seçenektir.
Bu yazıdaki teknik iddialar bağımsız olarak kontrol edilmedi. Yanlış bir şey varsa bize söyle, düzeltelim.