Cara mengkonfigurasi kait komit Git post

126

Bagaimana cara memicu build dari Jenkins?
Bagaimana cara mengkonfigurasi kait komit Git post?

Persyaratan saya adalah setiap kali perubahan dibuat di repositori Git untuk proyek tertentu, itu secara otomatis akan memulai membangun Jenkins untuk proyek itu.

Di Jenkins memicu membangun bagian saya memilih memicu membangun dari jarak jauh.
Dalam .gitdirektori, ada direktori hooks di mana kita harus mengkonfigurasi file commit.
Saya bingung bagaimana memicu build dari sana (saya tahu beberapa bagian kita harus menggunakan perintah curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

Saya telah menempatkan perintah ini di direktori hook server git saya (post commit hook).
Setiap kali perubahan terjadi di repositori itu menjalankan membangun otomatis.

Saya ingin check in changeset apakah dalam setidaknya satu file java ada membangun harus dimulai.
Misalkan pengembang hanya mengubah file xml atau file properti yang seharusnya tidak dimulai.
Bersamaan dengan itu xml, misalkan .javafile - file itu di sana build harus dimulai.

phanikumar Raja
sumber
Saya telah mengedit jawaban saya untuk menjawab bagian kedua dari pertanyaan Anda.
VonC

Jawaban:

164

Seperti disebutkan dalam " Polling harus mati: memicu Jenkins membangun dari hook git ", Anda dapat memberi tahu Jenkins tentang komitmen baru:

Dengan plugin Git terbaru 1.1.14 (yang baru saja saya lepaskan sekarang), Anda sekarang dapat melakukan ini lebih mudah dengan hanya menjalankan perintah berikut:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Ini akan memindai semua pekerjaan yang dikonfigurasikan untuk memeriksa URL yang ditentukan, dan jika mereka juga dikonfigurasi dengan polling, itu akan segera memicu polling (dan jika itu menemukan perubahan yang layak untuk build, build akan dipicu pada gilirannya. )

Ini memungkinkan skrip untuk tetap sama ketika pekerjaan datang dan pergi di Jenkins.
Atau jika Anda memiliki beberapa repositori di bawah satu aplikasi host repositori (seperti Gitosis), Anda dapat berbagi skrip kait pasca-terima tunggal dengan semua repositori. Akhirnya, URL ini tidak memerlukan otentikasi bahkan untuk Jenkins yang diamankan, karena server tidak secara langsung menggunakan apa pun yang dikirim klien. Itu menjalankan polling untuk memverifikasi bahwa ada perubahan, sebelum benar-benar memulai membangun.

Seperti yang disebutkan di sini , pastikan untuk menggunakan alamat yang tepat untuk server Jenkins Anda:

karena kita menjalankan Jenkins sebagai Webserver mandiri pada port 8080 URL seharusnya tanpa /jenkins, seperti ini:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Untuk memperkuat poin terakhir itu, ptha menambahkan dalam komentar :

Mungkin sudah jelas, tetapi saya memiliki masalah dengan:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

The url parameter harus sesuai apa yang Anda miliki di Repository URL pekerjaan Jenkins Anda.
Ketika menyalin contoh saya meninggalkan protokol, dalam kasus kami ssh://, dan itu tidak berhasil.


Anda juga dapat menggunakan kait pasca-terima sederhana seperti di " Bangun berbasis push menggunakan Jenkins dan GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Konfigurasikan pekerjaan Jenkins Anda untuk dapat "Trigger builds remote" dan menggunakan token otentikasi ( 1qaz2wsxdalam contoh ini).

Namun, ini adalah skrip khusus proyek, dan penulis menyebutkan cara untuk menggeneralisasikannya.
Solusi pertama lebih mudah karena tidak bergantung pada otentikasi atau proyek tertentu.


Saya ingin memeriksa perubahan yang ditetapkan apakah setidaknya ada satu file java yang ada harus mulai dibangun.
Misalkan pengembang hanya mengubah file XML atau file properti, maka build tidak boleh dimulai.

Pada dasarnya, skrip build Anda dapat:

  • letakkan catatan 'bangun' (lihat git notes) pada panggilan pertama
  • pada panggilan berikutnya, ambil daftar commit antara HEADcalon cabang Anda untuk membangun dan komit direferensikan oleh git notes'membangun' ( git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • skrip Anda dapat menguraikan daftar itu dan memutuskan apakah perlu melanjutkan pembuatannya.
  • bagaimanapun, buat / pindahkan git notes' build' Anda ke HEAD.

Mei 2016: cwhsu menunjukkan dalam komentar url yang mungkin berikut:

Anda bisa menggunakan curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENjika Anda mengatur trigger trigger di item Anda

http://i.imgur.com/IolrOOj.png


Juni 2016, polaretto menunjukkan dalam komentar :

Saya ingin menambahkan itu hanya dengan sedikit skrip shell Anda dapat menghindari konfigurasi url manual, terutama jika Anda memiliki banyak repositori di bawah direktori umum.
Sebagai contoh saya menggunakan ekspansi parameter ini untuk mendapatkan nama repo

repository=${PWD%/hooks}; 
repository=${repository##*/} 

dan kemudian gunakan seperti:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VONC
sumber
hi von seperti yang Anda katakan pada panggilan pertama saya harus membuat build notes.my panggilan pertama adalah membaca file .java setiap kali pengembang mendorong perubahan ke git repo. Saya baru mengenal semua hal ini, itulah sebabnya saya meminta setiap langkah. tolong jangan pedulikan dan saya harus menyelesaikan tugas ini.
phanikumar Raja
Ini sangat membantu saya. Saya telah menulis kait Git dengan bantuan topik ini. Tnx guys!
Kirill Bazarov
Saya harus menambahkan panggilan curl ke file pasca-terima, yang tidak sepenuhnya jelas dari jawaban ini. Lagi pula sangat membantu!
Magnilex
1
@IgorGanapolsky dalam folder hook dari repo telanjang Anda yang menerima komit dan yang harus memanggil jenkins:yourRepo.git/hooks/post-receive
VonC
2
Ini mungkin jelas, tapi saya memiliki masalah dengan: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. The url parameter harus sesuai apa yang Anda miliki di Repository URL pekerjaan Jenkins Anda. Ketika menyalin contoh saya meninggalkan protokol, dalam kasus kami ssh: // dan tidak berhasil.
ptha
17

Semoga ini bisa membantu: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Ini hanya masalah menggunakan curluntuk memicu pekerjaan Jenkins menggunakan kait git yang disediakan oleh git.
Perintah

curl http://localhost:8080/job/someJob/build?delay=0sec

dapat menjalankan pekerjaan Jenkins, di mana someJobnama pekerjaan Jenkins.

Cari hooksfolder di folder .git tersembunyi Anda. Ubah nama post-commit.samplefile menjadi post-commit. Buka dengan Notepad, hapus : Nothingbaris dan tempel perintah di atas ke dalamnya.

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

Nav
sumber
Setelah melakukan komit dari mesin dev, post-accept dipanggil, bukan post-commit. Diverifikasi dengan meletakkan laporan log di kedua kait. Apakah saya salah membaca dokumen, bukankah harusnya post-commit yang dipanggil?
Shirish Hirekodi
@ Shirish: Itu aneh. Mungkin Anda melakukan sesuatu yang berbeda
Nav
ini berhasil dibangun ketika saya telah mendorong komit perubahan terakhir tetapi tidak membangun ketika saya mengkomit perubahan ... ???
3

Seperti jawaban sebelumnya memang menunjukkan contoh bagaimana kait penuh mungkin terlihat di sini adalah kode kait pasca-terima saya yang berfungsi:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

Dalam hal ini saya memicu pekerjaan jenkins hanya ketika mendorong untuk menguasai dan bukan cabang lainnya.

Zitrax
sumber
1
Bagaimana Anda mengikat skrip Python ini ke Jenkins? Atau apakah Anda hanya menjalankannya satu kali?
IgorGanapolsky
Jenkins tidak tahu tentang kait ini, bagian utamanya adalah memuat url notifyCommit pada server jenkins yang akan memicu jajak pendapat. Saya pikir pemungutan suara diaktifkan tetapi tanpa jadwal di sisi jenkins.
Zitrax
Jadi di mana skrip python ini berada? Saya berasumsi Anda mengikatnya dengan instalasi git Anda untuk melacak commit ...
IgorGanapolsky
1
Jawaban telat - tetapi lokasi skrip akan ada di server git di hooks / post-accept. Baca di hook git untuk mempelajari lebih lanjut.
Zitrax
3

Saya ingin menambahkan jawaban di atas bahwa itu menjadi sedikit lebih sulit jika otorisasi Jenkins diaktifkan.

Setelah mengaktifkannya saya mendapat pesan kesalahan bahwa pengguna anonim perlu izin baca.

Saya melihat dua solusi yang mungkin:

1: Mengubah kait saya ke:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: mengatur otorisasi berbasis proyek.

Solusi sebelumnya memiliki kelemahan yaitu saya harus mengekspos passwd saya di file hook. Tidak dapat diterima dalam kasus saya.

Yang kedua bekerja untuk saya. Dalam pengaturan auth global saya harus mengaktifkan Keseluruhan> Baca untuk pengguna Anonim. Dalam proyek ini saya ingin memicu saya harus mengaktifkan Job> Build and Job> Read for Anonymous.

Ini masih bukan solusi yang sempurna karena sekarang Anda dapat melihat proyek di Jenkins tanpa login. Mungkin ada solusi yang lebih baik lagi menggunakan pendekatan sebelumnya dengan http login tapi saya belum mengetahuinya.

anhoppe
sumber