Saya dan grup saya sangat buruk saat menaikkan nomor versi perakitan dan kami sering mengirimkan rakitan dengan versi 1.0.0.0. Jelas, ini menyebabkan banyak sakit kepala.
Kami menjadi jauh lebih baik dengan praktik kami melalui platform CI kami dan saya benar-benar ingin mengaturnya untuk menaikkan nilai secara otomatis di dalam assemblyinfo.cs
file sehingga versi rakitan kami diperbarui secara otomatis dengan perubahan kode dalam rakitan itu.
Saya sebelumnya telah menyiapkan (sebelum kami menemukan Hudson ) cara untuk meningkatkan nilai melalui salah satu msbuild
atau baris perintah (tidak dapat mengingat), tetapi dengan Hudson, itu akan memperbarui repositori SVN dan memicu build LAIN. Itu akan menghasilkan loop tanpa batas yang lambat karena Hudson melakukan polling SVN setiap jam.
Apakah meminta Hudson menaikkan nomor versi adalah ide yang buruk? Apa cara alternatif untuk melakukannya?
Idealnya, kriteria solusi saya adalah yang:
- Tambahkan nomor build
assemblyinfo.cs
sebelum build - Hanya menambah nomor build di rakitan yang telah berubah. Ini mungkin tidak dapat dilakukan karena Hudson menghapus folder proyek setiap kali membangun
- Melakukan assemblyinfo.cs diubah ke dalam repositori kode (saat ini VisualSVN )
- Tidak menyebabkan Hudson memicu build baru saat build berikutnya memindai perubahan
Mengerjakan ini di kepala saya, saya dapat dengan mudah menemukan solusi untuk sebagian besar ini melalui file / perintah batch, tetapi semua ide saya akan menyebabkan Hudson memicu build baru saat memindai berikutnya. Saya tidak mencari seseorang untuk melakukan segalanya untuk saya, cukup arahkan saya ke arah yang benar, mungkin teknik untuk membuat Hudson mengabaikan komitmen SVN tertentu, dll.
Semua yang saya temukan sejauh ini hanyalah artikel yang menjelaskan cara mendapatkan nomor versi yang bertambah secara otomatis, tidak ada yang memperhitungkan platform CI yang dapat diputar menjadi loop tanpa batas.
sumber
Inilah yang saya lakukan, untuk mencap atribut AssemblyFileVersion.
Menghapus AssemblyFileVersion dari AssemblyInfo.cs
Tambahkan file baru, kosong, bernama AssemblyFileInfo.cs ke proyek.
Instal kumpulan alat tugas komunitas MSBuild di mesin hudson build atau sebagai dependensi NuGet di proyek Anda.
Edit file proyek (csproj), itu hanya file msbuild, dan tambahkan yang berikut ini.
Di suatu tempat akan ada
<PropertyGroup>
versi yang menyatakan. Ubah itu sehingga terbaca misalnyaHudson menyediakan variabel env yang Anda lihat di sana ketika proyek dibangun di atas hudson (dengan asumsi itu diambil dari subversi).
Di bagian bawah file proyek, tambahkan
Ini menggunakan MSBuildCommunityTasks untuk menghasilkan AssemblyFileVersion.cs untuk menyertakan atribut AssemblyFileVersion sebelum proyek dibangun. Anda dapat melakukan ini untuk salah satu / semua atribut versi jika Anda mau.
Hasilnya adalah, setiap kali Anda mengeluarkan build hudson, assembly yang dihasilkan mendapatkan AssemblyFileVersion 1.0.HUDSON_BUILD_NR.SVN_REVISION misalnya 1.0.6.2632, yang berarti build ke-6 # di hudson, yang diperoleh dari revisi subversi 2632.
sumber
Berikut adalah solusi elegan yang memerlukan sedikit kerja keras saat menambahkan proyek baru tetapi menangani prosesnya dengan sangat mudah.
Idenya adalah bahwa setiap proyek menautkan ke file solusi yang hanya berisi informasi versi perakitan. Jadi proses build Anda hanya perlu mengupdate satu file dan semua versi assembly ditarik dari satu file saat kompilasi.
Langkah:
Ketika Anda menambahkan file sebagai tautan, itu menyimpan data dalam file proyek dan setelah kompilasi menarik informasi versi perakitan dari satu file ini.
Di kontrol sumber Anda, Anda menambahkan file bat atau file skrip yang hanya menambah file SharedAssemblyProperties.cs dan semua proyek Anda akan memperbarui informasi assembly mereka dari file itu.
sumber
Hudson dapat dikonfigurasi untuk mengabaikan perubahan ke jalur dan file tertentu sehingga tidak meminta versi baru.
Pada halaman konfigurasi pekerjaan, di bawah Manajemen Kode Sumber , klik tombol Lanjutan . Di kotak Kawasan yang Dikecualikan, Anda memasukkan satu atau beberapa ekspresi reguler untuk mencocokkan pengecualian.
Misalnya untuk mengabaikan perubahan pada file version.properties, Anda dapat menggunakan:
Ini akan bekerja untuk bahasa selain C # dan memungkinkan Anda untuk menyimpan info versi Anda dalam subversi.
sumber
.NET melakukan ini untuk Anda. Di file AssemblyInfo.cs Anda, setel versi assembly Anda ke major.minor. * (Misalnya: 1.0. *).
Ketika Anda membangun proyek Anda, versinya dibuat secara otomatis.
Nomor build dan revisi dibuat berdasarkan tanggal, menggunakan epoch unix, saya yakin. Build didasarkan pada hari ini, dan revisinya didasarkan pada jumlah detik sejak tengah malam.
sumber
Saya belum pernah benar-benar melihat fitur 1.0. * Berfungsi di VS2005 atau VS2008. Apakah ada sesuatu yang perlu dilakukan untuk mengatur VS untuk menaikkan nilai?
Jika AssemblyInfo.cs di-hardcode dengan 1.0. *, Lalu di mana build / revisi sebenarnya disimpan?
Setelah meletakkan 1.0. * Di AssemblyInfo, kami tidak dapat menggunakan pernyataan berikut karena ProductVersion sekarang memiliki nilai yang tidak valid - menggunakan 1.0. * Dan bukan nilai yang ditetapkan oleh VS:
Sigh - ini sepertinya salah satu hal yang ditanyakan semua orang tapi entah kenapa tidak pernah ada jawaban yang pasti. Bertahun-tahun yang lalu saya melihat solusi untuk menghasilkan nomor revisi dan menyimpannya ke AssemblyInfo sebagai bagian dari proses pasca-pembangunan. Saya berharap tarian semacam itu tidak diperlukan untuk VS2008. Mungkin VS2010?
sumber
Saya berasumsi seseorang mungkin juga melakukan ini dengan template teks di mana Anda membuat atribut assembly yang dimaksud dengan cepat dari lingkungan seperti yang dilakukan AssemblyVersion.tt di bawah ini.
sumber
Sebagai kelanjutan dari jawaban MikeS, saya ingin menambahkan bahwa VS + Visual Studio Visualization and Modeling SDK perlu diinstal agar ini berfungsi, dan Anda perlu memodifikasi file proyek juga. Juga harus disebutkan saya menggunakan Jenkins sebagai build server yang berjalan pada kotak server windows 2008 R2 dengan modul versi, di mana saya mendapatkan BUILD_NUMBER.
File Template Teks Saya version.tt terlihat seperti ini
Saya memiliki yang berikut ini di Grup Properti
setelah impor Microsoft.CSharp.t target, saya memiliki ini (tergantung di mana Anda menginstal VS
Di server build saya, saya kemudian memiliki skrip berikut untuk menjalankan transformasi teks sebelum build aktual, untuk mendapatkan nomor perubahan terakhir di TFS
Dengan cara ini saya dapat melacak build DAN changeets, jadi jika saya belum memeriksa apa pun sejak build terakhir, digit terakhir tidak boleh berubah, namun saya mungkin telah membuat perubahan pada proses build, oleh karena itu perlu nomor terakhir kedua . Tentu saja jika Anda membuat beberapa check-in sebelum membangun, Anda hanya mendapatkan perubahan terakhir yang tercermin dalam versinya. Saya kira Anda bisa menggabungkan itu diperlukan.
Saya yakin Anda dapat melakukan sesuatu yang lebih menarik dan memanggil TFS langsung dari dalam Template tt, namun ini berhasil untuk saya.
Saya kemudian bisa mendapatkan versi saya saat runtime seperti ini
sumber
Solusi saya tidak memerlukan penambahan alat eksternal atau bahasa skrip - cukup dijamin untuk bekerja pada mesin build Anda. Saya menyelesaikan masalah ini di beberapa bagian. Pertama, saya telah membuat file BUILD.BAT yang mengubah parameter BUILD_NUMBER Jenkins menjadi variabel lingkungan. Saya menggunakan fungsi "Jalankan perintah batch Windows" Jenkins untuk menjalankan file batch build dengan memasukkan informasi berikut untuk build Jenkins:
Di lingkungan build, saya memiliki file build.bat yang dimulai sebagai berikut:
Setelah saya melakukannya, saya mengklik kanan pada proyek yang akan dibangun di panel Solution Explorer Visual Studio dan memilih Properties, pilih Build Events, dan masukkan informasi berikut sebagai Pre-Build Event Command Line, yang secara otomatis membuat file .cs berisi informasi nomor build berdasarkan setelan variabel lingkungan saat ini:
Anda mungkin perlu menyesuaikan dengan selera bangunan Anda. Saya membangun proyek secara manual sekali untuk menghasilkan file Version.cs awal di direktori Properties dari proyek utama. Terakhir, saya secara manual menyertakan file Version.cs ke dalam solusi Visual Studio dengan menyeretnya ke panel Solution Explorer, di bawah tab Properties untuk proyek itu. Dalam build mendatang, Visual Studio kemudian membaca file .cs tersebut pada waktu build Jenkins dan mendapatkan informasi nomor build yang benar darinya.
sumber
Jadi, kami memiliki proyek dengan satu solusi yang berisi beberapa proyek yang memiliki rakitan dengan nomor versi berbeda.
Setelah menyelidiki beberapa metode di atas, saya baru saja menerapkan langkah build untuk menjalankan skrip Powershell yang melakukan pencarian-dan-ganti pada file AssemblyInfo.cs. Saya masih menggunakan nomor versi 1.0. * Dalam kontrol sumber, dan Jenkins hanya memperbarui nomor versi secara manual sebelum msbuild berjalan.
Saya menambahkan opsi -Encoding "UTF8" karena git mulai memperlakukan file .cs sebagai file biner jika saya tidak melakukannya. Memang, ini tidak masalah, karena saya tidak pernah benar-benar melakukan hasilnya; itu hanya muncul saat saya menguji.
Lingkungan CI kita sudah memiliki fasilitas untuk mengaitkan Jenkins build dengan git commit tertentu (terima kasih plugin Stash!), Jadi saya tidak khawatir tidak ada git commit dengan nomor versi yang dilampirkan padanya.
sumber
Ini adalah mekanisme yang lebih sederhana. Ini hanya melibatkan penambahan langkah membangun tugas perintah Windows Batch sebelum langkah MSBuild dan penggunaan program temukan dan ganti sederhana (FART).
Langkah Batch
Jika Anda menggunakan kontrol sumber selain svn, ubah opsi --svn untuk yang sesuai untuk lingkungan scm Anda.
Unduh Kentut
sumber
Saya memutuskan untuk menggunakan beberapa metode menggunakan skrip Powershell prebuild ( https://gist.github.com/bradjolicoeur/e77c508089aea6614af3 ) untuk meningkatkan setiap build yang berhasil, lalu di Global.asax saya melakukan sesuatu seperti ini:
Saya masih berpikir seluruh proses terlalu rumit dan saya akan melihat metode yang lebih efisien untuk mencapai hasil yang sama. Saya menginginkan ini terutama untuk meneruskan versi ke SVN dan kemudian ke Jenkin tanpa terlalu banyak alat tambahan.
sumber