Kami adalah perusahaan kecil dengan banyak tim yang mengelola repositori git mereka sendiri. Ini adalah platform web dan artefak masing-masing tim dikerahkan pada akhir hari untuk tes malam hari. Kami mencoba memformalkan proses seputar versi dan pengemasan.
Setiap tim memiliki cabang utama di mana mereka melakukan pengembangan sehari-hari. Anggota jaminan kualitas dari setiap tim menginginkan artefak dari perubahan tim mereka dikerahkan ke test bed di mana semua komponen digabungkan oleh chef. Artefak adalah tarbal tetapi saya ingin mengubahnya menjadi RPM sehingga kami dapat berpikir dan berargumen tentang versi dengan benar.
Proses rilis melibatkan pemotongan cabang rilis dari cabang pengembangan (master dalam kebanyakan kasus) dari masing-masing repositori git. Ini kemudian diberikan kepada jaminan kualitas yang menjalankan tes dan sign-off pada serangkaian artefak.
Untuk mis. Ini adalah repositori git yang khas dengan cabang rilis yang terkait:
0-0-0-0-0-0-0-0-0-0 (master)
| |
0 0
(rel-1) |
0
(rel-2)
Saya terjebak mencoba mencari skema untuk melakukan versi paket yang berasal dari cabang pengembangan. Kami tidak ingin memberi tag berlebihan pada cabang master dari setiap repo dan membatasi tag untuk melepaskan cabang saja. Tetapi kita harus dapat menanyakan paket yang ditempatkan di mesin uji menggunakan semantik yum / rpm standar. Seperti apakah versi pengembangan ketika cabang master tidak memiliki tag? Saya mengerti bahwa ini git describe
bisa memberi saya representasi yang berguna dari versi build tetapi itu bekerja dengan baik ketika berbagai titik rilis di cabang ditandai.
EDIT1: Menanggapi jawaban @ Urban48
Saya pikir saya harus menjelaskan proses rilis kami sedikit lagi. Untuk keperluan diskusi ini, mari kita asumsikan kita memiliki cabang master
di semua repositori. The master
cabang dianggap cabang pengembangan dan dikerahkan ke otomatis CI-CD diaktifkan lingkungan QA. Di sinilah sebagian tes malam berjalan untuk memastikan stabilitas master. Kami melihat pipa pekerjaan ini sebelum memotong cabang rilis. Cabang pembebasan kami berumur pendek. Katakanlah, setelah memotong cabang rilis (dari master stabil), regresi penuh dijalankan, perbaikan dilakukan dan digunakan untuk produksi. Ini membutuhkan waktu sekitar satu minggu untuk dilakukan. Kami merilis hampir setiap dua minggu untuk produksi.
Cabang fitur kami selalu dipotong dari master dan menjalani sejumlah pengujian pengembang sebelum bergabung dengan master yang di atasnya mereka menjalani pemeriksaan stabilitas CI-CD.
Perbaikan terbaru dibuat pada cabang perbaikan terbaru (dipotong dari cabang rilis) dan digunakan dengan pengujian dampak minimal ke dalam produksi.
Strategi versi kami untuk rilis dan cabang perbaikan terbaru mengikuti semver. Rilis cabang selama siklus QA melalui versi seperti v2.0.0-rc1
, v2.0.0-rc2
dan akhirnya setelah QA sign-off menjadi v2.0.0
.
Kami terkadang melakukan rilis bertitik untuk fitur kecil yang digabungkan untuk melepaskan cabang (dan kemudian dikuasai) di mana versi menjadi v2.1.0
. Dan perbaikan terbaru mengasumsikan v2.1.1
polanya.
Namun pertanyaannya, bukan tentang membuat versi cabang-cabang ini. Saya lebih suka untuk tidak mengubah skema versi ini sama sekali. Satu-satunya perubahan muncul untuk cabang pengembangan yaitu. menguasai. Bagaimana saya bisa menunjukkan dengan andal di lingkungan CI-CD versi mana yang ada saat rilis sebelumnya ke produksi. Ini idealnya akan dilakukan melalui penandaan smart git tetapi sesuatu yang tidak berlebihan menandai cabang master lebih disukai.
rc
sufiks? Itu akan menentukanmajor.minor
versi pengembangan.rc
dan nomor build hanya bisa didapat berdasarkan itu. Jugarc
pada master tidak masuk akal karena kita tidak pernah melepaskan dari master. Kami menandai kandidat rilis kami hari ini di cabang rilis sebagai bagian dari siklus rilisrc
akhiran.Jawaban:
Hmm, saya punya contoh .net yang mungkin merupakan teknologi agnostik.
Saya hanya akan melakukan ringkasan singkat.
git repo per komponen dengan strategi percabangan gitflow
semua berkomitmen untuk mengembangkan pemicu pembentukan tim kota
build teamcity mengubah versi dengan minor mayor manual + nomor build di AssemblyInfo.cs yaitu 1.1.hotfix.build
teamcity memicu pengemasan nuget menggunakan nomor versi yang sama untuk pustaka nuget yang diterbitkan
penyebaran gurita selesai dibangun ke qa untuk pengujian manual (dengan asumsi semua tes lulus)
jika semuanya baik, gunakan versi secara manual untuk produksi melalui gurita.
Sekarang ini berarti Anda mendapatkan BANYAK paket berversi yang beredar. Kami melakukan percobaan dengan menggunakan flag -prelelease tetapi ini membutuhkan paket pemindahan manual lebih lanjut dari tahap prelease ke 'normal' dan persyaratan untuk membangun kembali komponen yang bergantung padanya.
Kuncinya adalah versi setiap bangunan secara unik melalui beberapa proses sentral.
Maka Anda berada dalam situasi 'hmm versi apa yang saya inginkan' daripada 'omg, versi apa yang saya dapatkan ??'
Edit: ulang komentar.
Hanya untuk menggarisbawahi hal penting itu. Putuskan cabang apa yang merupakan perangkat lunak lengkap dan versi yang SEMUA komit padanya. hanya gunakan perangkat lunak versi dari cabang ini.
Namun pandangan saya adalah bahwa Anda perlu mengatasi strategi percabangan Anda.
sumber
next
+builds
mirip dengan bagaimanagit describe
Izinkan saya menawarkan alur kerja alternatif, yang dapat memecahkan masalah versi Anda, atau hanya membantu Anda memikirkan lebih banyak cara menuju solusi.
Sedikit filosofi dulu ..
(Saya membuat beberapa asumsi tentang alur kerja Anda, tolong perbaiki saya jika saya salah)
Tes dijalankan secara surut :
Cabang keluar
maser
ke cabang fitur, kemudian mengubahnya menjadi artefak untuk pengujian oleh QA.masalahnya adalah : bagaimana jika tes gagal, maka
master
mungkin rusak!efek samping:
Itu membuat pengembang tidak percaya
master
Karena Anda bercabang dari master untuk melepaskan cabang, apa yang terjadi jika rilis sebelumnya rusak? itu menghentikan integrasi fitur baru Anda sampai master diperbaiki lagi.
ketika bug diperbaiki di cabang rilis, bergabung kembali ke
master
dapat membuat konflik menggabungkan. (dan kami tidak suka konflik)penggabungan dan perbaikan kode kecil :
Sulit untuk melacak semua kode yang digabungkan
master
, seperti perbaikan kecil atau perubahan yang bukan bagian dari fitur tertentu.efek samping:
pengembang tidak yakin apakah ia harus mengisi perbaikan kecil ini sekarang atau nanti.
haruskah saya versi perbaikan kecil baru ini juga?
Pada suatu titik waktu tidak jelas apa keadaannya
master
cabang, dan kode apa yang mengambang di sanasesuatu yang merusak build, itu bukan bagian dari fitur baru. dan sangat sulit untuk melacak dari mana asalnya
Ide saya untuk alur kerja git adalah sebagai berikut:
cabang
master
untuk pengembangan fitur baru seperti yang sudah Anda lakukan. tetapi sekarang alih-alih melepaskan dari cabang yang baru dibuat ini, mintalah fitur ini dipilih dan digabung menjadirelease
cabang.Sekarang Anda memiliki kontrol yang lebih baik atas apa yang terjadi pada rilis tertentu.
Sekarang sangat mudah untuk mengisolasi versi pengembangan dan versi stabil.
Anda dapat terus membuat artefak dari cabang fitur tersebut untuk QA.
Jika semuanya baik-baik saja, gabungkan fitur itu kembali
master
, dan ceri-pilih fitur ini / perbaikan bug / perbaikan panas ke cabang rilis.versi
Versi cabang fitur dapat menggunakan beberapa konvensi nama seperti
1.2.3-rc.12345
versi di
release
cabang hanya akan menggunakan1.2.3
(1.2.3
>1.2.3-rc.12345
juga satu hal yang kurang perlu dikhawatirkan)Alur kerja ini memperbaiki masalah yang disebutkan di atas, dan banyak lagi.
Ini juga mengusulkan strategi versi waras, dan sebagian besar siklus rilis ini dapat otomatis.
Saya harap ini akan membantu Anda dalam beberapa cara, saya dengan senang hati akan membahas setiap kasus tepi yang dapat Anda buat.
ps:
Saya minta maaf untuk bahasa Inggris saya, ini bukan bahasa utama saya.
sumber
Proses Anda tampaknya sangat berbelit-belit dan mendapatkan sedikit tag tampaknya tidak dapat dihindari.
Ada dua ide yang muncul:
Anda memperlakukan cabang "master" seperti apa yang biasanya kita miliki di cabang "berkembang". Ini mencemari cabang pesan banyak.
Ketika QA selesai dengan pekerjaan mereka, Anda dapat memiliki server build / CI untuk membuat laporan (misalnya file teks) dengan tag semua repo yang digunakan. Sekarang Anda akan memiliki file dengan versi yang dapat diposting ke repo. Kemudian Anda menandai cabang dengan versi rilis saja dan jika Anda ingin memeriksa versi masing-masing komponen, Anda dapat memeriksa laporan.
sumber