Untuk mengintegrasikan versi git sebagai angka pembangunan atau tidak?

12

Seorang kolega dan saya telah bergiliran berdebat / membahas masalah / manfaat mengintegrasikan versi yang berasal dari repositori git saat ini ke dalam kode kami setiap kali dibangun.

Kami pikir manfaatnya meliputi:

  • Tidak perlu khawatir tentang kesalahan manusia dalam memperbarui nomor versi
  • Lacak antara apa yang kami temukan di perangkat dan kode sumbernya

Masalah-masalah yang muncul (untuk kita) meliputi:

  • Sistem pembangun turunan IDE (mis. MPLABX) dapat menyulitkan untuk mencari tahu di mana harus memasukkan jenis kait ini (dan akhirnya bisa juga cukup murahan)
  • Lebih banyak pekerjaan untuk benar-benar mengintegrasikan ini ke dalam skrip build / makefiles
  • Menggabungkan ke pendekatan pembangunan tertentu (misalnya bagaimana jika satu orang membangun dengan XCode dan MPLABX lainnya) dapat menciptakan kejutan hilir

Jadi kami ingin tahu di mana orang lain mendarat di debat ini. Sangat mudah untuk diskusi menjadi anekdotal. Ada banyak orang di luar sana yang bersikeras otomatisasi ujung ke ujung, menggantung jumlah pekerjaan depan dan menggabungkan itu menciptakan. Dan ada banyak orang lain di sisi lain perdebatan, yang hanya melakukan hal termudah yang bekerja dan hidup dengan risiko.

Apakah ada jawaban yang masuk akal untuk sisi mana yang terbaik untuk mendarat?

Travis Griggs
sumber

Jawaban:

15

Kami menggunakan git menjelaskan dengan tag versi. Aliran ini pada dasarnya:

  • buat tag untuk versi yang sedang kami kerjakan (mis. v1.1.2)
  • setiap build run git describe
  • saat kami mengirim, gunakan nama tag

git describememberikan nama tag, jumlah komit sejak tag, dan hash dari tag. Tag sampel terlihat seperti:

v1.1.2-6-a3b27gae

Ini memiliki keuntungan bahwa pengembang mendapatkan hash, jadi jika ada sesuatu yang terputus antara build, pengembang dapat dengan mudah melakukan perubahan. Itu juga bodoh sederhana untuk dikelola; cukup minta pemimpin tim Anda membuat dan mendorong tag pada cabang bugfix baru dan sistem build Anda mengurus sisanya.

Kami menghapus hash (dan nomor build) karena memudahkan pengguna untuk memahami nomor versi kami. Kami menemukan bahwa ini memberi kami yang terbaik dari kedua dunia, sambil tetap memberikan informasi yang cukup relevan saat merencanakan rilis.

Saat ini, kami memiliki versi yang sedikit lebih rumit dari ini, tetapi idenya tetap ada.

hajar
sumber
1
Catat saja: hash dalam it describe(bagian terakhir dari string) bukan cset-id dari tag, tetapi hash dari changeset, yang kita uraikan . Dalam bentuk yang dapat dibaca manusia v1.1.2-6-a3b27gaeakan menjadi "Enam perubahan setelah perubahan, ditandai sebagai v1.1.2-6, memiliki perubahan pendek-hash a3b27gae"
Lazy Badger
@LazyBadger - Tepat. Hash untuk tag itu sendiri kurang berguna, karena Anda dapat dengan mudah git checkout v1.1.2atau daftar komit tag dengan git rev-list v1.1.2 | head -n 1.
beatgammit
6

Kami dulunya adalah toko SVN jadi matematika ini mudah - nomor build adalah putaran SVN dan itu saja. Kami mencoba untuk terus berjalan ketika kami mulai pindah ke DCVSes dan ternyata gagal karena beberapa alasan.

Pertama, siapa yang tahu apakah rev 69bc333bc8d8 adalah sebelum, setelah atau bersamaan dengan rev 25b0f0d1052c? Ada sangat sedikit konteks dibandingkan dengan sistem SVN ketika Anda setidaknya tahu 101 setelah 100. Kedua, sifat kontrol sumber DCVS membuat hal-hal menjadi tidak linier dalam banyak hal ketika pembangunan berikutnya mungkin tidak memajukan bola yang sama.

Kami akhirnya memutuskan untuk menggunakan server build untuk mendistribusikan nomor build ke berbagai hal karena memiliki visibilitas yang tepat dan kemampuan untuk menanganinya.

Wyatt Barnett
sumber
2

Saya menggunakan skema berikut untuk sistem pembuatan studio visual C # DLL untuk secara otomatis menghasilkan nomor versi (Kami secara historis memiliki masalah dengan penyebaran tidak dilakukan dengan benar sehingga diperlukan cara yang bersih untuk menjamin penyebaran versi yang benar terjadi).

  • Mayor - Hard kode 1, biasanya ditentukan oleh sisi bisnis
  • Minor - Hard kode 0, biasanya ditentukan oleh sisi bisnis
  • Revisi - Jumlah hari sejak 1 Januari 2010 (atau tanggal mulai sewenang-wenang lainnya)
  • Build - Setengah jumlah detik sejak Tengah Malam (Karena ini adalah nomor 16 bit yang tidak ditandatangani)

Perhatikan bahwa ini mengasumsikan Anda memiliki 2 angka tanpa tanda yang dapat ditandatangani yang dapat dimainkan. Menciptakan sistem setara yang menggunakan angka lebih kecil bisa dilakukan juga.

Perhatikan juga bahwa bidang non-numerik dapat membantu jika Anda dapat melampirkannya sebagai meta-data. Misalnya menambahkan nomor versi git sebagai nomor Versi Informasi.

Guvante
sumber
2

Saya langsung menghubungkan output status git, log dan diff ke executable. Lalu ada opsi untuk mencetak itu. Keuntungannya adalah Anda tidak hanya bisa mengetahui dari mana biner Anda membangun, tetapi juga perubahan kode sumber yang tidak dikomit. Silahkan lihat:

https://github.com/colding/MercuryFIX/tree/master/stdlib/scm_state

Anda harus dapat menggunakan 3 file untuk membuat hal lib negara SCM Anda sendiri.

colding
sumber
0

Saya akan merekomendasikan penggunaan Autorevision .

Anda bisa mendapatkan output dalam berbagai format, misalnya header gaya c .

Ada juga beberapa contoh (dalam dir contribs) tentang bagaimana Anda dapat menghubungkan semuanya sehingga tidak peduli siapa yang membangun dan bagaimana mereka melakukannya, mereka akan selalu mendapatkan informasi versi yang sama, bahkan jika mereka membangun dari tarball.

Juga, karena selain gitAutorevision berfungsi dengan svndan hgmembuatnya lebih mudah untuk beralih dari svn tanpa harus mengubah terlalu banyak setelah Anda mengaturnya.

dak180
sumber
Sayangnya dokumentasi Autorevision sepertinya tidak memberikan rekomendasi. Informasi apa dari tajuk yang dibuat Autorevision yang Anda gunakan / gabungkan untuk membangun string versi perangkat lunak yang unik dan tidak ambigu?
Silicomancer
Hal ini tergantung pada bagaimana manusia dapat dibaca Anda inginkan: <VCS_TAG>-<VCS_SHORT_HASH>, <VCS_TAG>-<VCS_TICK>atau bahkan <VCS_ACTION_STAMP>semua harus bekerja. Jika Anda ingin daftar lengkap dari masing-masing simbol itu, saya sarankan untuk memeriksa halaman manual .
dak180