Bagaimana saya bisa membuat Jenkins CI dengan pemicu Git saat didorong untuk dikuasai?

205

Saya mencoba mengatur Jenkins-ci untuk proyek menggunakan GitHub. Saya sudah menyiapkan Jenkins dengan plugin yang sesuai. Saya ingin Jenkins menjalankan skrip pembuatan hanya setiap kali seseorang di proyek mendorong untuk menguasainya. Sejauh ini saya sudah bisa mengaturnya sehingga build akan dipicu kapan saja ada orang yang mendorong ke mana pun, tapi itu terlalu luas. Saya telah melakukan ini dengan kait layanan pasca-terima di Git.

Saya telah membaca wiki Jenkins, dan beberapa tutorial, tetapi detail khusus ini hilang ... apakah ada hubungannya dengan pemungutan suara mungkin? Atau haruskah pekerjaan dilakukan di sisi Git, sehingga Git hanya memicu Jenkins ketika masterdiubah?

Ziggy
sumber
3
Penulis asli Jenkins, Kohsuke Kawaguchi, menjelaskan cara melakukan pemberitahuan push dari repositori menggunakan plugin Git Plugin Git 1.1.14. Lihat kohsuke.org/2011/12/01/…
GeraldScott

Jawaban:

190

Seperti yang sudah dicatat oleh gezzed dalam komentarnya, sementara itu ada solusi yang baik (dijelaskan dalam Polling harus mati: memicu Jenkins membangun dari kait Git ):

  • Mengatur Jenkins pekerjaan ini membangun pemicu untuk Poll SCM , tetapi tidak menentukan jadwal.

  • Buat pemicu pasca-penerimaan GitHub untuk memberi tahu URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Ini akan memicu semua build yang mensurvei repositori Git yang ditentukan.

  • Namun, polling benar-benar memeriksa apakah ada sesuatu yang didorong ke cabang yang digunakan.

Ini bekerja dengan sempurna.

olenz
sumber
1
Ini bekerja sangat baik untuk saya juga, Anda dapat menggunakan pendekatan yang sama dengan instalasi gitorious lokal: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith
4
Bekerja dengan kait POST Bitbucket (bukan Jenkins) juga. Untuk menentukan kredensial otentikasi, Anda dapat menggunakan pengguna: [email protected]/git/notifyCommit? Url = ... sebagai URL.
loevborg
Bisakah itu dikonfigurasi sehingga jenkins hanya membangun libs / proyek yang dipengaruhi oleh dorongan terbaru untuk repo? Tidak membangun seluruh cabang lagi?
Croolman
Bisakah Anda memperjelas bagian ini? "Buat pemicu pasca-penerimaan github untuk memberi tahu URL"
dewwwald
Saya berasumsi bahwa github harus dapat mencapai contoh Jenkins Anda, yang berarti itu harus dapat diakses secara publik. Apakah mungkin menjalankan ini dengan server Jenkins yang non-publik?
A. Murray
33

Pada versi 0.5, plugin GitHub untuk Jenkins dapat memicu pembangunan ketika perubahan didorong ke GitHub .

docwhat
sumber
23
@asveikau - Pertanyaan aslinya adalah tentang github.
docwhat
Itu bukan solusi yang baik karena memicu pembangunan terlepas dari cabang mana yang didorong.
Shannon
Sebenarnya, sepertinya ia mematuhi specifier cabang di pengaturan plugin git jika Anda mengaktifkan "Poll SCM" (tidak perlu jadwal).
Shannon
1
Meskipun itu mungkin benar, masih memicu pembangunan yang salah ketika tidak ada ruang kerja ("Workspace sedang offline. Menjadwalkan membangun baru untuk mendapatkan ruang kerja. (Nonexisting_workspace) Selesai. Mengambil 0 ms Perubahan ditemukan"). Lihat juga issues.jenkins-ci.org/browse/JENKINS-18079
Shannon
Itu GitHub Plugin daftar Git Plugin sebagai dependensi . The wiki mengatakan "saat membuat pekerjaan, tentukan URL di bawah 'proyek Github' dan pilih Git menentukan URL di bawah 'Source Code Management'. Ia mengatakan 'pemicu ini hanya tendangan Git Plugin polling internal yang algo untuk setiap acara yang masuk terhadap repo cocok.' Saya berpikir itu berarti cukup seperti Poll SCM seperti dalam jawaban yang diterima, tetapi memiliki opsi untuk mengatur webhook secara otomatis dan beberapa fitur lainnya.
dosentmatter
9

Alih-alih memicu build dari jarak jauh, ubah konfigurasi proyek Jenkins Anda menjadi trigger build dengan polling.

Jenkins dapat memilih berdasarkan internal yang tetap, atau dengan URL. Yang terakhir adalah apa yang Anda ingin lompati membangun jika tidak ada perubahan untuk cabang itu. Rincian persisnya ada di dokumentasi . Pada dasarnya Anda hanya perlu memeriksa opsi "Poll SCM", biarkan bagian jadwal kosong, dan atur URL jarak jauh untuk menekan JENKINS_URL / job / name / polling.

Sekali saja, jika Anda memiliki lingkungan Jenkins yang aman tidak seperti itu /build, /pollingURL memerlukan otentikasi. Instruksi di sini memiliki detail. Sebagai contoh, saya memiliki hook GitHub Post-Receive username:apiToken@JENKIS_URL/job/name/polling.

Wei Wang
sumber
8

Untuk GitLab , gunakan langkah-langkah ini:

  1. Buka pengaturan proyek Anda → Web hooks
  2. Masukkan URL "Bangun Sekarang" dari proyek Jenkins Anda sebagai URL Acara Push:

    http://server.com/jenkins/job/project_name/build?delay=0sec sebagai contoh

  3. Klik Add Web Hookdan kemudiantest hook

Kemudian kapan pun Anda berkomitmen pada repositori, kait web dipicu dan build dibuat. Pastikan untuk mengatur ruang kerja Jenkins delete workspace before each buildAnda sehingga Anda mendapatkan salinan baru kode baru.

etusm
sumber
2
bagaimana Anda memecahkan masalah pada pertanyaan tentang membangun hanya ketika dorongan pada cabang utama?
Custodio
4

Tidak terkait dengan Git, tetapi di bawah ini saya akan membantu dengan konfigurasi pekerjaan Jenkins secara rinci dengan Mercurial. Ini dapat membantu orang lain dengan masalah yang sama.

  1. Pasang Plugin URL Pemicu
  2. Buka halaman konfigurasi pekerjaan dan pilih Poll SCMopsi. Tetapkan nilainya menjadi* * * * *
  3. Periksa opsi: [URLTrigger] - Poll with a URL. Sekarang Anda dapat memilih beberapa opsi seperti perubahan tanggal modifikasi, konten URL, dll.
  4. Dalam opsi, pilih perubahan konten URL, pilih opsi pertama - Monitor change of content
  5. Simpan perubahannya.

Sekarang, memicu beberapa perubahan pada repositori Mercurial dengan beberapa test check-in.

Lihat bahwa pekerjaan Jenkins sekarang dijalankan dengan mendeteksi perubahan SCM. Saat build dijalankan karena perubahan Mercurial, Anda akan melihat teks Started by an SCM change. Lain, pengguna yang secara manual memulainya.

Krishnam
sumber
3

Saya harap ini membantu: Bagaimana memicu membangun Jenkins pada Git commit

Ini hanya masalah menggunakan curl untuk memicu pekerjaan Jenkins menggunakan kait Git yang disediakan oleh Git.

Perintah curl http://localhost:8080/job/someJob/build?delay=0secdapat menjalankan pekerjaan Jenkins, di mana someJobnama pekerjaan Jenkins.

Cari folder "kait" di folder .git tersembunyi Anda. Ganti nama file "post-commit.sample" menjadi "post-commit". Buka dengan Notepad, hapus baris ": Nothing" dan rekatkan perintah di atas.

Itu dia. Setiap kali Anda melakukan komit, Git akan memicu perintah post-komit yang ditentukan dalam file.

Nav
sumber
Saya bingung di sini dengan komentar Anda pada awalnya karena, saya pikir saya harus mengubah "pekerjaan" di url di atas menjadi nama pekerjaan. Saya juga bingung karena ketika saya menekan "Item Baru" di Jenkins, saya membuat "Proyek" bukan pekerjaan, jadi ketika Anda merujuk "beberapa pekerjaan" di atas, saya tidak tahu bahwa itu adalah nama proyek saya. Saya akhirnya menemukan url yang saya butuhkan: localhost: 8078 / job / codecept% 20tests / build di mana "codecept% 20tests" adalah nama proyek saya. Terima kasih atas solusi Anda
Paul Preibisch
1
Terima kasih Paul. Saya telah memperbarui posting blog dengan catatan tambahan, menyebutkan solusi Anda. "% 20" akan sangat membantu orang lain.
Nav
3

Integrasi berkelanjutan dengan Jenkins, setelah kode didorong ke repositori dari perintah Git / GUI:

  1. Buat pekerjaan di Jenkins dengan hanya nama pekerjaan dan pilih jenis freestyle proyek. Klik OK. Halaman berikutnya tidak menambahkan apa pun - cukup klikSave .
  2. Pergi ke repositori Git lokal Anda di mana Anda memiliki kode sumber dan navigasikan ke .git/hooks folder.
  3. The hooksfolder berisi beberapa file. Periksa "pasca-komit". Jika tidak ada, buat file, "pasca-komit" tanpa ekstensi file:

    C:\work\test\\.git\hooks\post-commit
    
  4. Edit file "post-commit" dengan perintah di bawah ini. Pastikan ada di folder kait kode sumber lokal Anda.

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    Contoh:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5.

    userName: Nama pengguna Jenkins

    jobName: Nama pekerjaan build

    apiToken: Untuk mendapatkan token API Anda, buka halaman pengguna Jenkins Anda (kanan atas di antarmuka). Ini tersedia di menu "Konfigurasi" di sebelah kiri halaman: "Tampilkan token API"

  5. Buat perubahan pada kode sumber Anda dan komit kode ke repositori.

  6. Pekerjaan Anda http://localhost:8080/jenkins/job/Gitcommittest/,, seharusnya membangun.

Venkata Naresh Babu
sumber
3

Anda perlu menentukan cabang. Secara default ia mendengarkan apa pun. Lihat posting blog Hudson: Git and Maven plugins .

Adam Dymitruk
sumber
Saya baru-baru ini mengatur Jenkins di kantor untuk menarik perubahan dari git pada cabang tertentu. Bekerja dengan baik. +1
Greg K
Saya telah menetapkan pengaturan itu juga. Apa yang saya perhatikan adalah bahwa Jenkins diberitahu tentang setiap dorongan untuk github, dan bereaksi terhadapnya, tetapi hanya menjalankan langkah-langkah pembangunan jika master cabang telah berubah. Jadi kami mendapatkan satu ton laporan bangunan palsu yang mengatakan "Tidak Ada Perubahan". Apakah Anda mengamati perilaku ini juga?
Ziggy
Pertanyaan aslinya adalah tentang bagaimana menyelesaikan pemicu yang luas dan tidak perlu (memicu ketika ada orang yang mendorong cabang apa pun) yang dikonfigurasi dalam jawaban Anda. Jika Anda memiliki 5 pekerjaan jenkin dengan konfigurasi yang sama kecuali bahwa pekerjaan pertama mendengarkan cabang master, yang kedua cabang devel, yang ketiga cabang FeatureX dan sebagainya, ketika Anda hanya mendorong ke cabang FeatureX semua pekerjaan jenkins akan dipicu apa yang menyebabkan kelebihan kerja dengan build sangat lambat.
geoom
2

Plugin Pemicu Webhook Umum dapat dikonfigurasi dengan filter untuk mencapai ini.

Saat dikonfigurasi dengan

  • Variabel bernama refdan ekspresi$.ref .
  • Filter dengan teks $refdan ekspresi filter seperti ^refs/heads/master$.

Maka pekerjaan itu akan memicu untuk setiap dorongan untuk master . Tidak ada polling.

Anda mungkin ingin lebih banyak nilai dari webhook untuk benar-benar melakukan build. Cukup tambahkan lebih banyak variabel, dengan JSONPath, untuk memilih apa yang Anda butuhkan.

Ada beberapa kasus penggunaan di sini: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd

Tomas Bjerre
sumber
Apa itu "achi" ?
Peter Mortensen
Ini adalah kesalahan pengejaan.
Tomas Bjerre
bagaimana Anda mengambil $ GITCOMMIT di Jenkins, sepertinya selalu nol dengan webhook. Kemudian tidak dapat mengirim status kembali untuk mengatakan berhasil atau gagal.
user3520245
1

Di organisasi saya saat ini, kami tidak melakukan ini di master tetapi melakukannya di kedua mengembangkan dan melepaskan / cabang (kami menggunakan Git Flow), untuk menghasilkan build snapshot.

Karena kami menggunakan pipa multi-cabang, kami melakukan ini di Jenkinsfile dengan sintaks when {} ...

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

Ini dirinci dalam posting blog ini: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline

jesses.co.tt
sumber
1

Jawaban di atas sudah benar tetapi saya berbicara kepada mereka yang masih baru di sini karena kesederhanaannya

terutama untuk pengaturan pemicu bangunan untuk pipa:

Pertimbangkan Anda memiliki dua cabang Github: 1.master, 2.dev, dan Jenkinsfile (tempat skrip pipeline ditulis) dan file lain tersedia di setiap cabang

Konfigurasikan proyek Pipeline baru (untuk cabang dev)

## 1. Integrasi kode dengan git-plugin dan pendekatan berbasis cron Plugin git prasyarat harus diinstal dan mengkonfigurasinya dengan nama dan email Anda

  1. Bagian umum.Periksa kotak centang - 'Proyek ini parameter' dan tambahkan Nama-SBRANCH Nilai Default-'refs / remote / asal / dev '
  2. Bangun pemicu bagian "Centang kotak - 'Polling SCM' dan jadwalkan sesuai kebutuhan untuk memeriksa komit misalnya '* / 1 * * * *' untuk memeriksa setiap menit
  3. Bagian definisi pipeline. Pilih - Skrip pipeline dari SCM—> pilih git—> addRepository URL—> tambahkan kredensial git—> pilih lanjutan—> tambah Nama- asal, RefSpec- '+ refs / head / dev: refs / remote / origin / dev '(dev is github branch) -> Branches to build - $ {SBRANCH} (Nama parameter dari ref 1st point) -> Script Path—> Jenkinsfile -> Hapus centang Lightweightcheckout
  4. Terapkan—> simpan

## 2. Integrasi kode: pendekatan github-plugin dan webhook Prasyarat Github plugin harus diinstal dan server Github harus dikonfigurasi, koneksi harus diuji jika tidak mempertimbangkan konfigurasi berikut

Konfigurasikan plugin Github dengan akun di Jenkins

Bagian GitHub Tambahkan server Github jika tidak ada URL API: https://api.github.com Kredensial: Tambahkan teks rahasia (Klik tombol add: pilih jenis teks rahasia) dengan nilai Token Akses Pribadi (Hasilkan dari Token Github Anda—> pengaturan -> pengaturan pengembang—> token akses pribadi—> tambahkan token—> periksa lingkup—> salin token) Uji Koneksi—> Periksa apakah itu terhubung ke akun Github Anda atau tidak. Centang kotak centang dengan Kelola Kait Di sub-bagian sebelumnya, cukup pilih kredensial sebelumnya untuk 'rahasia bersama'

Tambahkan webhook jika tidak ditambahkan ke repositori Anda oleh

  1. Buka pengaturan Repositori Github -> tambahkan webhook—> tambahkan URL
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Atau jika Anda tidak memiliki Public_IP gunakan ngrok . Instal, otentikasi, dapatkan IP publik dari perintah ./ngrok http 80 (gunakan jenkins_port Anda) lalu tambahkan webhook -> tambahkan URL http: // Ngrok_IP / github-webhook /
  3. Uji dengan mengirimkan payload dari halaman webhook dan periksa apakah Anda mendapatkan 200 status atau tidak.

Jika Anda memiliki plugin Github Tarik, konfigurasikan juga dengan URL Jenkins yang dipublikasikan.

  1. Bagian umum.Periksa kotak centang - 'proyek Github' tambahkan URL proyek - (tautan github berakhir dengan '.git /')
  2. Bagian umum.Periksa kotak centang - 'Proyek ini parameter' dan tambahkan Nama-SBRANCH Nilai Default-'refs / remote / asal / dev '
  3. Bangun kotak centang triggers.section.Check - 'Pemicu kait GitHub untuk polling GITScm'
  4. Bagian def'n pipeline: Pilih - Skrip pipeline dari SCM—> pilih git—> addRepository URL—> tambahkan kredensial git—> pilih lanjutan -> tambah Nama- asal, RefSpec- '+ ref / kepala / dev / ref: ref / remote / origin / dev '(dev is github branch) -> Cabang yang akan dibangun - $ {SBRANCH} (Nama parameter dari ref 1.st point) -> Script Path—> Jenkinsfile—> Hapus centang Lightweightcheckout
  5. Terapkan—> simpan
Akshay Shikre
sumber
0

Solusi saya untuk server git lokal: buka direktori hook server git lokal Anda, abaikan pembaruan yang ada.contoh dan buat file baru yang secara harfiah bernama "pembaruan", seperti:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

Pernyataan gema akan ditampilkan di bawah hasil git push Anda, token dapat diambil dari konfigurasi pekerjaan jenkins Anda, telusuri untuk menemukannya. Jika file "pembaruan" tidak dipanggil, coba beberapa file lain dengan nama yang sama tanpa ekstensi "sampel".

Itu yang kamu butuhkan

Charlie
sumber