paket dan versi strategi dalam lingkungan multi-repositori

13

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 describebisa 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 masterdi semua repositori. The mastercabang 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-rc2dan 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.1polanya.

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.

tsps
sumber
mengapa tidak menambahkan -rc. <build_number> ke build dari cabang pengembangan, dan setelah dirilis dari cabang master / release cukup gunakan xyz?
Urban48
Apa yang akan mendahului rcsufiks? Itu akan menentukan major.minorversi pengembangan. rcdan nomor build hanya bisa didapat berdasarkan itu. Juga rcpada 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 rilis
tsps
saya mengerti, lalu bagaimana dengan tidak melepaskan dari beberapa cabang, tetapi memilih fitur lengkap ceri ke cabang rilis tunggal, di mana Anda kemudian dapat menggunakan tag. paket versi (rpm atau deb) akan menjadi lebih mudah, semua yang tidak ada pada cabang rilis akan memiliki rcakhiran.
Urban48

Jawaban:

3

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.

  • jangan versi fitur (atau dev) cabang.
  • lakukan master versi
  • hanya gunakan paket dari master
Ewan
sumber
1
Saya telah menjelajahi git-flow beberapa kali di masa lalu dan sayangnya tidak dapat mendorongnya. Mengubah strategi percabangan dan alur kerja git dari pengembang adalah masalah sulit untuk dipecahkan. Kami ingin mengubah strategi pembuatan versi sehingga jumlahnya masuk akal ketika digunakan untuk pengembangan, pengujian, dan produksi.
sdt
Kami juga memiliki versi di cabang pengembangan hari ini. Hanya saja kita harus menandai setiap commit, terkadang dua kali untuk versi dengan cara ini. Saya ingin memberikan pandangan yang lebih bersih tentang pengembangan dengan menunjukkan bahwa versi saat ini keluar adalah v next+ buildsmirip dengan bagaimanagit describe
tsps
baik Anda masih dapat membangun dan versi berkomitmen untuk dikuasai. apakah mereka bahkan tidak menggunakan cabang fitur?
Ewan
jika Anda tidak ingin menguasai versi. maka Anda harus memperbarui versi minor secara manual pada cabang rilis. yang berarti mengkonfigurasi secara manual builds Anda setiap kali Anda membuat bran rilis baru h
Ewan
Cabang fitur ada dan saya perlu menerapkan versi untuk mereka juga. Tidak enggan menambahkan tag / versi pada master, hanya saja hal itu dilakukan secara berlebihan hari ini. Strategi apa pun yang menunjuk ke titik di mana saya bisa menandai cabang master dan menunjukkan bahwa itu adalah versi pengembangan yang bertentangan dengan versi pada cabang rilis sangat membantu
tsps
1

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)

  1. Tes dijalankan secara surut :

    Cabang keluar maserke cabang fitur, kemudian mengubahnya menjadi artefak untuk pengujian oleh QA.
    masalahnya adalah : bagaimana jika tes gagal, maka mastermungkin 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 masterdapat membuat konflik menggabungkan. (dan kami tidak suka konflik)

  2. 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 sana

    • sesuatu 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:

masukkan deskripsi gambar di sini

cabang masteruntuk 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 menjadi releasecabang.

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 seperti1.2.3-rc.12345

versi di releasecabang hanya akan menggunakan 1.2.3 ( 1.2.3> 1.2.3-rc.12345juga 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.

Urban48
sumber
Terima kasih atas jawaban terinci Anda. Saya akan merespons dalam posting asli sebagai EDIT karena bilah komentar tidak mengizinkan cukup teks.
tsps
0

Proses Anda tampaknya sangat berbelit-belit dan mendapatkan sedikit tag tampaknya tidak dapat dihindari.

Ada dua ide yang muncul:

  1. Anda memperlakukan cabang "master" seperti apa yang biasanya kita miliki di cabang "berkembang". Ini mencemari cabang pesan banyak.

  2. 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.

John Kouraklis
sumber