Periksa beberapa repositori git ke dalam ruang kerja Jenkins yang sama

127

Menggunakan Jenkins 1.501 dan Jenkins Git plugin 1.1.26

Saya punya 3 git repo berbeda masing-masing dengan beberapa proyek.

Sekarang saya perlu checkout semua proyek dari repo 3 git ke ruang kerja yang sama pada seorang budak Jenkins. Saya telah mendefinisikan setiap repo git di: Source code Management: Multiple SCMs . Tetapi setiap kali repo diperiksa repo sebelumnya (dan proyek terkait) dihapus.

Saya telah membaca ini:

http://jenkins.361315.n4.nabble.com/multiple-git-repos-in-one-job-td4633300.html

tapi itu tidak terlalu membantu. Saya telah mencoba untuk menentukan folder yang sama di bawah Sub direktori lokal untuk repo (opsional) untuk semua repo tetapi memberikan hasil yang sama.

Jika ini tidak mungkin menggunakan Jenkins, saya kira beberapa langkah / skrip pra-bangun dapat digunakan untuk memindahkan proyek ke lokasi yang tepat. Ini bukan opsi untuk memodifikasi konfigurasi pembangunan proyek.

u123
sumber

Jawaban:

69

Memeriksa lebih dari satu repo sekaligus dalam satu ruang kerja tidak dimungkinkan dengan Jenkins + Git Plugin.

Sebagai solusinya, Anda dapat memiliki beberapa pekerjaan hulu yang mencairkan satu repo masing-masing dan kemudian menyalin ke ruang kerja proyek akhir Anda (Bermasalah pada beberapa level), atau Anda dapat mengatur langkah pembuatan skrip shell yang memeriksa setiap repo yang diperlukan untuk ruang kerja pekerjaan saat membangun.

Sebelumnya plugin Multiple SCM dapat membantu mengatasi masalah ini tetapi sekarang sudah usang. Dari halaman plugin Multiple SCM: "Pengguna harus bermigrasi ke https://wiki.jenkins-ci.org/display/JENKINS/Pipeline+Plugin . Pipeline menawarkan cara yang lebih baik untuk mengecek beberapa SCM, dan didukung oleh Jenkins tim pengembangan inti. "

CIGuy
sumber
Mengapa pendekatan pertama bermasalah? Memisahkan pekerjaan sepertinya adalah praktik yang baik.
CurtainDog
1
Ini adalah praktik yang baik secara umum, tetapi ketika Anda memerlukan beberapa checkout di pemeliharaan lokasi fisik yang sama menjadi masalah besar. Misalnya, jika Anda ingin membuat pembangunan cabang, Anda harus mengkloning 4 pekerjaan dan kemudian secara individual mengubah jalur untuk masing-masing. Tentu saja ada plugin untuk membantu dengan ini, tetapi lebih mudah untuk hanya checkout ke jalur relatif dari satu pekerjaan. Kemudian Anda dapat mengkloning sebanyak yang Anda inginkan tanpa mengubah pengaturan.
CIGuy
1
Anda perlu mengubahnya dari jawaban yang benar karena tidak relevan lagi.
Dvir669
2
Saluran pipa mengharuskan Anda mempelajari DSL baru, yang sedikit terlalu banyak untuk pekerjaan yang sangat sederhana (lihat kode dari beberapa repositori) yang kami inginkan. Tetap gunakan plugin Multiple SCM hingga GUI yang layak muncul di sekitar pipa Jenkins DSL. Saya dapat melaporkan bahwa itu berfungsi baik dengan Jenkins 2.17
Burak Arslan
2
Saya hanya mengalami masalah yang sama dengan beberapa repo. Saya sekarang menggunakan plugin Pipeline meskipun saya sama skeptisnya dengan @BurakArslan tentang DSL baru. Ini sebenarnya tidak seburuk yang saya kira dan dilengkapi dengan generator snippet yang cukup baik. Setelah menggunakannya hanya 2 jam saya sekarang sebenarnya lebih suka pendekatan ini karena saya akhirnya dapat melakukan skrip pipeline build untuk git bersama dengan sisa kode.
Ben
81

Dengan Plugin Multiple SCMs:

  • buat entri repositori yang berbeda untuk setiap repositori yang Anda butuhkan untuk checkout (proyek utama atau proyek ketergantungan).

  • untuk setiap proyek, dalam menu "lanjutan" (menu "lanjutan" kedua, ada dua tombol berlabel "lanjutan" untuk setiap repositori), cari kolom teks "Subdirektori lokal untuk repo (opsional)". Anda dapat menentukan di sana subdirektori dalam direktori "ruang kerja" tempat Anda ingin menyalin proyek. Anda dapat memetakan sistem file komputer pengembangan saya.

"Menu lanjutan kedua" tidak ada lagi, sebaliknya yang perlu dilakukan adalah menggunakan tombol "Tambah" (pada bagian "Perilaku Tambahan"), dan pilih "Periksa ke sub-direktori"

  • jika Anda menggunakan semut, seperti sekarang file build.xml dengan target build bukan di direktori root dari ruang kerja tetapi di subdirektori, Anda harus mencerminkannya dalam konfigurasi "Invoke Ant". Untuk melakukannya, dalam "Aktifkan semut", tekan "Lanjutan" dan isi teks masukan "Bangun file", termasuk nama subdirektori tempat build.xml berada.

Semoga itu bisa membantu.

GaRRaPeTa
sumber
3
Ini harus usang. Pada saat penulisan Beberapa plugin SCM, potongan GIT tidak mengandung sub-jalur opsional.
AlexeiOst
12
Di setiap repositori ada daftar turun bawah yang disebut "Tambah". Di dalamnya Anda dapat menemukan opsi "Checkout ke sub-direktori", yang melakukan hal yang sama.
Gary Ye
1
Saya mengikuti panduan Anda dengan beberapa plugin SCM dan git tapi saya punya masalah lucu lainnya. Tampaknya tidak ingin checkout dengan benar cabang yang sama (mengembangkan) untuk repositori yang berbeda. Ia mencoba untuk checkout komit dengan hash (yang hanya valid di repositori pertama). Adakah cara untuk mengatasi ini?
Lefteris
Masalah terbesar dengan beberapa plugin SCM adalah ini: "Pemicu jenis post-commit saat ini tidak berfungsi (setidaknya untuk subversi), jadi perlu untuk mengkonfigurasi polling tipe 'cron'."
grayaii
1
Saluran pipa mengharuskan Anda mempelajari DSL baru, yang sedikit terlalu banyak untuk pekerjaan yang sangat sederhana (lihat kode dari beberapa repositori) yang kami inginkan. Tetap gunakan plugin Multiple SCM hingga GUI yang layak muncul di sekitar pipa Jenkins DSL. Saya dapat melaporkan bahwa itu berfungsi baik dengan Jenkins 2.17
Burak Arslan
41

Karena Multiple SCMs Plugin sudah tidak digunakan lagi.

Dengan Jenkins Pipeline memungkinkan untuk checkout beberapa repositori git dan setelah membangunnya menggunakan gradle

node {   
def gradleHome

stage('Prepare/Checkout') { // for display purposes
    git branch: 'develop', url: 'https://github.com/WtfJoke/Any.git'

    dir('a-child-repo') {
       git branch: 'develop', url: 'https://github.com/WtfJoke/AnyChild.git'
    }

    env.JAVA_HOME="${tool 'JDK8'}"
    env.PATH="${env.JAVA_HOME}/bin:${env.PATH}" // set java home in jdk environment
    gradleHome = tool '3.4.1' 
}

stage('Build') {
  // Run the gradle build
  if (isUnix()) {
     sh "'${gradleHome}/bin/gradle' clean build"
  } else {
     bat(/"${gradleHome}\bin\gradle" clean build/)
  }
}
}

Anda mungkin ingin mempertimbangkan untuk menggunakan submit git alih-alih pipa kustom seperti ini.

Pelawak
sumber
Terima kasih!!! The dirblok kunci, saya tidak tahu mengapa saya hanya melihat repo terbaru-kloning-in ruang kerja pekerjaan saya.
bonh
bagaimana pengertian "perubahan" dipertimbangkan dalam banyak SCM? Apakah hanya jumlah perubahan yang terlihat dari semua repo yang membentuk pekerjaan? Akan bagus untuk memerinci mereka dari masing-masing jika memungkinkan, 23 changes from repo XXX, 3 changes from repo YYYatau sesuatu yang lebih kompak di sepanjang garis itu.
jxramos
20

Saya menggunakan Plugin Multiple SCMs dalam hubungannya dengan Plugin Git berhasil dengan Jenkins.

Frederik Deweerdt
sumber
3
terima kasih itu hebat, saya dapat menempatkan 2 bitbucket path ke dalam bagian repositori, dan sekarang bagaimana saya bisa memberi tahu repo 1 checkout cabang "develop" dan untuk cabang repo 2 checkout "perbaikan"? saya melihat cabang untuk membangun porsi dalam jenkins, bagaimana saya bisa mengatur nama repositori dan Refsec di specifier cabang (kosong untuk 'apa saja') sehingga masing-masing dapat memeriksa cabang yang sesuai yang saya inginkan? atau saya melakukannya dan saya harus mengklik boolean yang mengatakan "Multiple SCMs"?
pelos
@pelos Apakah Anda dapat menemukan solusinya?
Govind
saat ini kami tidak menggunakan file yml dan kami melakukan dua alur kerja yang berbeda dengan tugas rutin
pelos
5

Bergantung pada hubungan repositori, pendekatan lain adalah menambahkan repositori lain (repositori) sebagai submit git ke salah satu repositori. Subdit git menciptakan referensi ke repo lain. Repo submodule tersebut tidak dikloning kecuali Anda menentukan --recursiveflag saat mengkloning "superproject" (istilah resmi).

Inilah perintah untuk menambahkan submodule ke proyek saat ini:

git submodule add <repository URI path to clone>

Kami menggunakan Jenkins v1.645 dan git SCM akan out-of-the-box melakukan klon rekursif untuk proyek super. Voila Anda mendapatkan file proyek super dan semua file repo dependen (submodule) di direktori masing-masing di ruang kerja kerja Jenkins yang sama.

Tidak menjamin bahwa ini adalah pendekatan yang benar melainkan pendekatan.

mikehwang
sumber
5

Jenkins: Multiple SCM - usang. Plugin GIT - tidak berfungsi untuk beberapa repo.

Scripting / pipa sebagai kode - adalah cara untuk pergi.

AKS
sumber
2

Saya juga punya masalah ini. Saya menyelesaikannya menggunakan Trigger / call build pada proyek lain. Untuk setiap repositori saya memanggil proyek hilir menggunakan parameter.

Proyek utama:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, BRANCH, TAG
Use Custom workspace: ${PREFIX}/${MARKETNAME}
Source code management: None

Kemudian untuk setiap repositori saya sebut proyek hilir seperti ini:

Trigger/call builds on other projects: 
Projects to build: Linux-Tag-Checkout
Current Build Parameters
Predefined Parameters: REPOSITORY=<name>

Proyek Hilir: Linux-Tag-Checkout:

This project is parameterized
String Parameters: PREFIX, MARKETNAME, REPOSITORY, BRANCH, TAG
Use Custom workspace:${PREFIX}/${MARKETNAME}/${REPOSITORY}-${BRANCH}
Source code management: Git
git@<host>:${REPOSITORY}
refspec: +refs/tags/${TAG}:refs/remotes/origin/tags/${TAG}
Branch Specifier: */tags/${TAG} 
Torbjörn Gard
sumber
1

Memeriksa lebih dari satu repo pada suatu waktu di ruang kerja tunggal adalah mungkin dengan Jenkins + Git Plugin (mungkin hanya dalam versi yang lebih baru?).

Di bagian "Source-Code-Management", jangan pilih "Git", tetapi "Multiple SCMs" dan tambahkan beberapa repositori git.

Pastikan bahwa di semua kecuali satu yang Anda tambahkan sebagai "Perilaku tambahan" tindakan "Periksa ke sub-direktori" dan tentukan subdirektori individu.

JRA_TLL
sumber
Saya percaya dengan cara ini Anda menggunakan plugin SCM Multiple (usang) daripada vanit Git Plugin.
Robert
0

Kami menggunakan git-repo untuk mengelola beberapa repositori GIT kami. Ada juga plugin Jenkins Repo yang memungkinkan untuk checkout semua atau sebagian dari repositori yang dikelola oleh git-repo ke ruang kerja pekerjaan Jenkins yang sama.

vladisld
sumber
Bagaimana tepatnya Anda memecahkan masalah yang ditanyakan dalam pertanyaan ini? Saya telah menginstal plugin yang Anda sebutkan, dan membaca tentang repo dan plugin, tetapi saya tidak bisa melihat cara mengatur Jenkins untuk mengkloning dua repo untuk dieksekusi dalam satu proyek ...
GreenAsJade
Untuk menggunakan Repo, repositori khusus perlu dibuat yang hanya akan berisi file manifes. Dalam file ini Anda menentukan semua informasi tentang repositori lain. Format yang tepat dari file manifes dijelaskan dalam file docs / manifest-format.txt dari proyek git-repo ( gerrit.googlesource.com/git-repo/+/master/docs/… ). Saat mengonfigurasi Jenkins Repo bagian dari pekerjaan - Anda menentukan lokasi repositori 'manifes' dan secara opsional nama file 'manifes' (Anda mungkin memiliki beberapa). Semua repositori yang ditentukan dalam manifes akan dikloning.
vladisld