Plugin Jenkins Git: Bagaimana cara membuat tag tertentu?

120

Saya mengalami masalah membuat Jenkins membuat tag tertentu. Tag adalah bagian dari sebuah parametrized build, tapi saya tidak tahu bagaimana meneruskannya ke plugin git untuk membuat tag itu. Ini telah memakan waktu 3 jam dari hari saya dan saya telah mengakui kekalahan dari para master saat stack overflow.

sksamuel.dll
sumber
Maksud Anda ini berbeda dari stackoverflow.com/questions/7157170/… ? (hasil ketiga dari google.com/… )
VonC
1
"Ini telah memakan waktu 3 jam dari hari saya" - Saya tidak terlalu malas karena 3 jam hari saya tidak menyertakan setiap tautan yang dapat saya temukan di google :)
sksamuel
1
Anda yakin ingin melakukannya dengan cara ini? Apakah Anda menyadari bahwa pemberian tag di git tidak berskala ? Mungkin Anda hanya bisa menggunakan "mengeksekusi shell" tugas untuk menulis script untuk memeriksa tag / revisi Anda benar-benar ingin?
mpontillo

Jawaban:

222

Saya dapat melakukannya dengan menggunakan parameter "branch to build":

Branch Specifier (blank for default): tags/[tag-name]

Ganti [nama-tag] dengan nama tag Anda.

Emmanuel Keller
sumber
5
Saya tidak tahu mengapa ini tidak memiliki lebih banyak +1. Entri blog erics-notes itu membingungkan sekali. Ini sederhana dan bekerja dengan baik. Terima kasih!
Cody S
3
Bekerja dengan baik untuk saya. Terima kasih. Parameter saya bernama RELEASE_TAG jadi saya menggunakan tag / $ {RELEASE_TAG} sebagai nilai untuk Branch Specifier.
Wesley Womack
3
Tidak bisa membuat ini bekerja. Untuk beberapa alasan tidak dapat membayar tag. Saya mendapatkan: 'ERROR: Tidak dapat menemukan revisi apa pun untuk dibuat. Verifikasi repositori dan konfigurasi cabang untuk pekerjaan ini. ' Saya menentukan tag / 3.0.1, saya juga mencoba * / tags / 3.0.1 Saya memverifikasi bahwa tag tersebut memang ada.
hilang terjemahan
1
Ketika saya mencoba melakukan apa yang disarankan dalam jawaban ini, setiap polling dari repositori memicu build. Log git polling akan terus menunjukkan bahwa "Revisi Terakhir Dibangun" adalah revisi dari tag tetapi "Revisi kepala jarak jauh terbaru adalah" adalah revisi dari yang terbaru HEAD. Logika plugin git tampaknya membandingkan kedua revisi ini, yang di repositori saya selalu tidak sama dan karenanya build baru selalu dipicu.
Louis
Pasti ini jawaban yang benar, ini berhasil untuk saya dan sangat sederhana. Saya tidak melakukan polling repo, jadi saya kira masih ada masalah itu.
Jeremy
76

Tak satu pun dari jawaban ini cukup bagi saya, menggunakan Jenkins CI v.1.555, plugin Git Client v.1.6.4, dan Git plugin 2.0.4.

Saya ingin sebuah pekerjaan dibangun untuk satu repositori Git untuk satu tag tertentu, tetap (yaitu, tidak berparameter). Saya harus mengumpulkan solusi dari berbagai jawaban ditambah posting blog "membangun tag Git" yang dikutip oleh Thilo .

  1. Pastikan Anda mendorong tag Anda ke repositori jarak jauh dengan git push --tags
  2. Di bagian "Git Repository" dari pekerjaan Anda, di bawah tajuk "Manajemen Kode Sumber", klik "Lanjutan".
  3. Di bidang Refspec, tambahkan teks berikut: +refs/tags/*:refs/remotes/origin/tags/*
  4. Di bawah "Branches to build", "Branch specifier", letakkan */tags/<TAG_TO_BUILD>(ganti <TAG_TO_BUILD>dengan nama tag Anda yang sebenarnya).

Menambahkan Refspec untuk saya ternyata sangat penting. Meskipun tampaknya repositori git mengambil semua informasi jarak jauh secara default ketika saya membiarkannya kosong, plugin Git akan gagal menemukan tag saya. Hanya ketika saya secara eksplisit menentukan "get the remote tags" di bidang Refspec, plugin Git dapat mengidentifikasi dan membangun dari tag saya.

Pembaruan 2014-5-7 : Sayangnya, solusi ini memang datang dengan efek samping yang tidak diinginkan untuk Jenkins CI (v.1.555) dan mekanisme pemberitahuan push repositori Git à la Stash Webhook ke Jenkins : kapan saja setiap cabang di repositori diperbarui dengan menekan, tugas pembuatan tag juga akan diaktifkan lagi. Hal ini menyebabkan banyak pembuatan ulang yang tidak perlu dari tugas tag yang sama berulang kali. Saya telah mencoba mengonfigurasi pekerjaan dengan dan tanpa opsi "Paksa polling menggunakan ruang kerja", dan tampaknya tidak berpengaruh. Satu-satunya cara saya dapat mencegah Jenkins dari membuat build yang tidak diperlukan untuk tugas tag adalah dengan mengosongkan bidang Refspec (yaitu, hapus +refs/tags/*:refs/remotes/origin/tags/*).

Jika ada yang menemukan solusi yang lebih elegan, harap edit jawaban ini dengan pembaruan. Saya curiga, misalnya, bahwa mungkin ini tidak akan terjadi jika refspec secara khusus +refs/tags/<TAG TO BUILD>:refs/remotes/origin/tags/<TAG TO BUILD>bukan tanda bintang penangkap semua. Untuk saat ini, bagaimanapun, solusi ini berfungsi untuk kami, kami hanya menghapus Refspec tambahan setelah pekerjaan berhasil.

Gotgenes
sumber
4
Untuk "menambahkan teks berikut" ke refspec ... jika refspec Anda sebelumnya +refs/heads/*:refs/remotes/origin/*, sekarang akan menjadi +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/remotes/origin/tags/*. (Saya belum banyak bekerja dengan refspecs, jadi butuh beberapa eksperimen untuk mengetahui bahwa bidang ini dibatasi ruang.)
driftcatcher
1
+1 ekstra untuk solusi ini. Solusi sebelumnya juga tidak berhasil untuk saya.
whitespy9
16

Tidak bisakah Anda memberi tahu Jenkins untuk membangun dari nama Ref? Jika demikian maka itu

refs/tags/tag-name

Dari semua pertanyaan yang saya lihat tentang Jenkins dan Hudson, saya sarankan untuk beralih ke TeamCity. Saya tidak perlu mengedit file konfigurasi apa pun agar TeamCity berfungsi.

Andrew T Finnell
sumber
Sebenarnya Anda bukan orang pertama yang menyarankan kota tim. Apakah itu jauh lebih baik? Saya mungkin akan memeriksanya.
sksamuel
1
@monkjack Saya mencoba sintaks yang sama di salah satu repo saya dan berhasil. Bisakah Anda membuat daftar tag Anda saat ini? Apakah Anda yakin Anda secara khusus mendorong tag itu ke repo jarak jauh dengangit push --tags
Andrew T Finnell
4
Semakin dekat. Saya tidak mendorong tag ke jarak jauh, tapi sekarang saya. Saya bisa mendapatkan jenkins untuk dibangun sekarang dengan menggunakan refs / tags / harpercollins-1.0.16 namun selalu bersikeras untuk membangun kepala terlepas dari apa yang saya taruh di sana. Saya telah mengonfirmasi bahwa remote memiliki tag (dapat melihatnya di gitweb) dan melakukan snapshot dari tag tersebut mengonfirmasi bahwa semuanya ada di sana dengan benar.
sksamuel
6
TeamCity adalah hak milik, membuatnya sangat tidak berguna.
bahasa gaul
2
Oh ya, beralih dari alat gratis ke iklan adalah pilihan yang tepat! Ketika otak jet menemukan kembali roda dan membuat pelacak bug baru, apakah Anda akan mengusulkan kepada orang lain untuk beralih dari bugzilla ke itu?
m1ld
11

Jika Anda menggunakan pipeline Jenkins dan ingin memeriksa tag tertentu (misalnya: TAGparameter build Anda), berikut ini yang dapat Anda lakukan:

stage('Checkout') {
  steps {
    checkout scm: [$class: 'GitSCM', userRemoteConfigs: [[url: 'YOUR_GIT_REPO_URL.git', credentialsId: 'YOUR_GIT_CREDENTIALS_ID' ]], branches: [[name: 'refs/tags/${TAG}']]], poll: false
  }
}
Vincent de Lagabbe
sumber
9

Di Jenkins terbaru (1.639 dan lebih tinggi), Anda dapat:

  1. cukup tentukan nama tag di bidang 'Cabang yang akan dibangun'.
  2. dalam membangun parametrized Anda dapat menggunakan parameter sebagai variabel dalam bidang yang sama 'Cabang untuk membangun' yaitu $ {Branch_to_build}.
  3. Anda dapat menginstal Plugin Parameter Git yang akan memberikan fungsionalitas kepada Anda dengan mendaftar semua cabang dan tag yang tersedia.
m1ld
sumber
1
Memang, memasukkan nama tag juga berhasil untuk saya. Meskipun dokumentasi untuk ini di plugin git masih mengatakan secara spesifik bahwa melakukan hal itu seharusnya tidak berhasil: "<tagName>: Ini tidak berfungsi karena tag tidak akan dikenali sebagai tag. Gunakan refs / tags / <tagName> sebagai gantinya."
Zitrax
Ini berfungsi untuk saya di Jenkins 1.532.3, saya baru saja menentukan versi tag (misalnya 1.0.1) di bidang cabang yang akan dibangun.
andre
9

Saya melakukan sesuatu seperti ini dan berhasil:

Source Code Management

 Git    
    Repositories    


 Advance

Name: ref
Refspec : +refs/tags/*:refs/remotes/origin/tags/* 

 Branches to build  
 Branch Specifier (blank for 'any') : v0.9.5.2

masukkan deskripsi gambar di sini

Jenkins log mengonfirmasi bahwa itu mendapatkan sumber dari tag

Memeriksa Revisi 0b4d6e810546663e931cccb45640583b596c24b9(v0.9.5.2)

Hasan Shaik
sumber
Ini bagus untuk membangun semua tag, terima kasih! Menambahkan refspectrik tadi dengan mengklik tombol Advanced.
styfle
9

Saya mengatur field Advanced-> Refspec ke refs/tags/[your tag name]. Ini tampaknya lebih sederhana daripada berbagai saran lainnya untuk Refspec, tetapi ini bekerja dengan baik untuk saya.

UPDATE 23/7/2014 - Sebenarnya setelah dilakukan pengujian lebih lanjut, ternyata ini tidak berfungsi seperti yang diharapkan. Tampaknya versi HEAD masih diperiksa. Harap urungkan ini sebagai jawaban yang diterima. Saya akhirnya mendapatkan solusi yang berfungsi dengan mengikuti posting dari gotgenes di utas ini (30 Maret). Masalah yang disebutkan dalam posting itu tentang pemicu build yang tidak perlu bukanlah masalah bagi saya, karena pekerjaan saya dipicu dari pekerjaan hulu, bukan dari polling SCM.

UPDATE APR-2018 - Perhatikan di komentar bahwa ini berfungsi untuk satu orang, dan setuju dengan dokumentasi Jenkins.

Nebu
sumber
Hanya ingin catatan itu-empat tahun setelah jawaban ini telah diposting-menggunakan refs/tags/<tagname>adalah apa dokumentasi Jenkins mengatakan harus digunakan, dan itu bekerja dengan baik bagi saya. Mungkin plugin tersebut bermasalah pada saat postingan aslinya, tetapi ... per April 2018, ini adalah jawaban yang benar.
evadeflow
Memperbarui komentar saya sebelumnya: Sebenarnya, saya telah menemukan bahwa saya dapat menghilangkan refs/tagsawalan dan hanya menggunakan <tagname>. YMMV, tapi ... berfungsi dengan baik untuk tujuan saya.
evadeflow
3

Saya bisa membuat Jenkins membuat tag dengan mengatur Refspec dan Penentu Cabang seperti yang dijelaskan dalam posting blog ini .

Saya juga harus menyetel Nama Repositori (ke "asal" dalam kasus saya) sehingga saya bisa mereferensikannya di Refspec (jika tidak, tampaknya akan menggunakan nama yang dibuat secara acak).

Thilo
sumber
2

Apa yang saya lakukan pada akhirnya adalah:

  • membuat cabang baru jenkins-target, dan mendapatkan jenkins untuk melacaknya
  • menggabungkan dari cabang atau tag mana saja yang ingin saya buat ke jenkins-target
  • setelah build berfungsi, pengujian melewati dll, cukup buat tag dari jenkins-targetcabang

Saya tidak yakin apakah ini akan berhasil untuk semua orang, proyek saya cukup kecil, tidak terlalu banyak tag dan barang, tetapi sangat mudah dilakukan, tidak perlu dipusingkan dengan spesifikasi dan parameter dan hal-hal :-)

Hugh Perkins
sumber
Saya menyukai pendekatan yang sangat sederhana ini.
zochhuana
2

Anda bahkan dapat membuat jenis tag, misalnya 1.2.3-alpha43, menggunakan karakter pengganti:

Referensi: +refs/tags/*:refs/remotes/origin/tags/*

Penentu cabang: origin/tags/1.2.3-alpha*

Anda juga dapat mencentang " Build when a change is push to GitHub " untuk memicu push, tetapi Anda harus menambahkan tindakan "create" ke webhook

sungai
sumber
1

Menambahkan dua sen saya di sini karena saya belum melihat jawaban yang menggunakan opsi "Build with parameter" di Jenkins.

Di sini saya menggunakan konsol browser Jenkins CI untuk proyek starwars_api dan saya dapat membuat langsung dengan "Build with parameter" dengan nilai refs / tags / tag-name

  1. pilih opsi "build with parameter".
  2. tambahkan nilai di kotak sebagai "refs / tags / tag_142" (tag_name = tag_142 untuk contoh saya)

membangun dengan nama tag ref

anayagam.dll
sumber