Kita semua sudah lama terbiasa dengan
Maven , dengan versi yang ditawarkannya dan manajemen ketergantungan. Maven lahir ketika pertemuan harian proyek adalah yang paling berani, ketika dianggap normal untuk dilepaskan setidaknya beberapa kali setahun,
Jenkins kemudian dipanggil
Hudson , dan pohon-pohonnya besar ...
Ide-ide yang dibawa pakar ke dunia pengembangan sangat populer dan dengan cepat mendapatkan popularitas: mendefinisikan proyek alur kerja standar, model direktori standar, dan banyak lagi, yang telah lama diterima begitu saja.
Sebagai salah satu inovasi, pakar memperkenalkan sistem versi standar. Versi disimpan dalam file proyek dan berubah setiap kali kami merilis rilis baru. Di dunia di mana membuat cabang dan penyatuannya bukanlah suatu prestasi yang dapat diakses oleh semua orang, pendekatan seperti itu cukup umum.
Semua ini sangat menyederhanakan pengembangan, mulai dari proyek baru, pengenalan pengembang untuk proyek, rilis versi dan manajemen ketergantungan.
Tetapi dunia tidak tinggal diam, dan terlepas dari kenyataan bahwa banyak ide yang diimplementasikan oleh pakar masih hidup dan berpindah dari satu proyek ke proyek lainnya, membuat versi pakar menjadi lebih banyak masalah daripada keuntungan.
Selanjutnya, kita akan mencoba mengubah dunia menjadi lebih baik dan menyederhanakan hidup kita.
PenafianSaya berasumsi bahwa pembaca akrab dengan Java, Maven, siklus hidup pengembangan dan konfigurasi CI / CD, mengerti mengapa ia membutuhkan semua ini dan bahkan seorang ninja .
Dalam kenyataan modern, merilis beberapa versi per minggu dan bahkan per hari dianggap, jika bukan norma, maka tujuannya. Dan, dalam kondisi seperti itu, menyimpan versi dalam file proyek mengarah ke overhead yang sangat besar.
Setiap rilis mengarah ke dua komit ke repositori, dan sebagai hasilnya, dengan pengembangan aktif dan pelepasan proyek, ada lebih banyak komitmen teknis daripada yang bermanfaat. Sejarah proyek ini berserakan dan sulit dipahami.
Juga, pendekatan ini mengarah pada duplikasi informasi: sudah menjadi kebiasaan untuk menyimpan versi tidak hanya dalam file proyek, tetapi juga dalam bentuk tag repositori.
Selain itu, muncul pertanyaan keamanan: ketika Anda memiliki satu proyek besar, maka mesin build hanya perlu akses untuk itu. Ketika ada banyak proyek, akses ke banyak proyek diperlukan dan kami baik membuat pengguna super dengan akses ke semua proyek dengan hak untuk menulis, atau kami mendapat beban tambahan mengelola sejumlah besar pengguna dengan serangkaian hak yang sempit, tetapi masih memiliki hak untuk menulis ke repositori, dan sering, dan hak untuk berkomitmen kepada master tanpa meminta kumpulan dan ulasan.
Saat menggunakan maven dengan plugin rilis, fitur menarik lainnya muncul: pembangunan kembali tidak dilakukan dengan serangkaian perintah yang sama dengan versi aslinya.
Mungkin semua masalah ini akan terasa jauh bagi seseorang, tetapi dengan sejumlah besar proyek, mengelola dan mengonfigurasi CI / CD berubah menjadi proses yang sangat tidak menyenangkan dan membingungkan.
Sekarang masalahnya sudah terlihat, mari kita coba untuk menyelesaikannya, sehingga kami tidak mengubah set alat, proses, dan secara umum itu sendiri, entah bagaimana.
Apa yang dibutuhkan:
- versi disimpan satu kali, sebagai tag repositori
- membangun kembali rilis apa pun dimungkinkan, serangkaian langkah harus sama seperti dalam kasus rilis baru
- tidak perlu izin tulis ke repositori
- kami masih menggunakan pakar sebagai manajer proyek
Misalkan CI / CD akan mendapatkan tag untuk kita dan periksa proyek.
Misalkan tag untuk kita diisi dengan CI / CD ke variabel lingkungan RELEASE_TAG, maka, untuk melepaskan rilis, kita harus menjalankan perintah berikut:
mvn -B versions:set -DnewVersion=$RELEASE_TAG (1) mvn -B deploy (2)
1 - memperbarui versi dalam file pom proyek dan modulnya
2 - build dan, jika proyek dikonfigurasi dengan benar, mengunggah artefak ke repositori
Jangan lupa untuk mengatur flag
-B , jika tidak, log eksekusi berubah menjadi labu.
Penting: untuk menghindari kebingungan dan dengan jelas menunjukkan bagaimana dan dari mana perakitan berasal, Anda perlu menginstal versi proyek dalam sesuatu yang abstrak, misalnya DEVELOPMENT-SNAPSHOT. Anda dapat menggunakan perintah yang sama: versi: set. Operasi adalah operasi satu kali, karena kami tidak lagi menyimpan versi proyek dalam file.
Sebagai hasil dari perubahan, Anda dapat menghapus konfigurasi maven-release-plugin dan scm block dari file pom.
»Dari minus:
Jika Anda menggunakan versi SNAPSHOT di suatu tempat, maka kebingungan dapat dimulai, sekarang semua versi SNAPSHOT terlihat sama. Dan mungkin cara melepaskan proyek ini bukan untuk Anda.
Tampaknya artefak yang dikumpulkan dari komit yang sama tetapi dengan tag yang berbeda akan sama, tetapi, sayangnya, tidak demikian. Kami masih mengekspos versi dalam file, dan sebagai hasilnya, paket yang dikumpulkan akan berbeda.
»Dari pro:
- Semua persyaratan terpenuhi, dan bahkan lebih banyak lagi!
- versi disimpan hanya dalam tag proyek
- perakitan baru dan pembangunan kembali versi lama dilakukan dengan serangkaian perintah yang sama dengan versi aslinya
- tidak perlu hak untuk berkomitmen pada proyek
- kotak alatnya tetap sama
- bonus: konfigurasi proyek disederhanakan
Jadi, dua baris lagi menyelamatkan dunia.
Sekian, terima kasih atas perhatiannya!