Git tetiklemeli Jenkins CI'yi master'lara nasıl bastırabilirim?


205

GitHub kullanarak bir proje için Jenkins-ci kurmaya çalışıyorum. Jenkins'i zaten uygun eklentilerle kurdum. Jenkins'in projedeki komut dosyalarını yalnızca projedeki bir kişi master yapmaya çalıştığında çalıştırmasını istiyorum. Şimdiye kadar, herkes herhangi bir yere ittiğinde bir yapının tetiklenmesini sağlayacak şekilde ayarlayabildim, ancak bu çok geniş. Bunu Git'teki alma sonrası servis kancaları ile yaptım.

Jenkins wiki ve birkaç öğretici okudum, ama bu özel detay eksik ... yoklama ile ilgili bir şey olabilir mi? Yoksa Git tarafında çalışmalar yapılmalıdır, böylece Git masterdeğiştiğinde Jenkins sadece tetikler ?


3
Orjinal yazar Jenkins, Kohsuke Kawaguchi, Git eklentisi Git eklentisi 1.1.14'ü kullanarak depodan push bildiriminin nasıl yapılacağını açıklar. Bkz kohsuke.org/2011/12/01/…
GeraldScott

Yanıtlar:


190

Yorumunda gezzed tarafından daha önce belirtildiği gibi , bu arada iyi bir çözüm var ( Polling'de ölmeli: Jenkins'in bir Git kancasını inşa etmesini tetiklemek ):

  • Jenkins işin inşa tetikleyici ayarlayın Anket SCM , ama yok değil bir zamanlama belirtin.

  • URL'yi bilgilendirmek için bir GitHub alma sonrası tetikleyicisi oluşturma

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Bu, belirtilen Git deposunu yoklayan tüm yapıları tetikler.

  • Ancak, yoklama aslında kullanılan dalda bir şey olup olmadığını kontrol eder.

Mükemmel çalışıyor.


1
Bu benim için de çok işe yaradı, yerel bir zarif kurulumda aynı yaklaşımı kullanabilirsiniz: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith

4
Bitbucket'in POST kancasıyla (Jenkins değil) de çalışır. Kimlik doğrulama bilgilerini belirtmek için URL olarak user: password@my.ci.server/git/notifyCommit? Url = ... kullanabilirsiniz .
loevborg

Jenkinler sadece son repo baskısından etkilenen kütüphaneleri / projeleri inşa edecek şekilde yapılandırılabilir mi? Tüm şubeyi tekrar inşa etmiyor musunuz?
Croolman

Bu kısmı açıklayabilir misiniz? "URL'yi bildirmek için bir github alım sonrası tetikleyicisi oluştur"
dewwwald

Github'un Jenkins örneğinize erişebilmesi gerektiğini varsayıyorum, yani halka açık olması gerekiyordu. Bunu halka açık olmayan bir Jenkins sunucusuyla çalıştırmak mümkün mü?
A. Murray

33

Sürüm 0.5'ten itibaren Jenkins için GitHub eklentisi, GitHub'a bir değişiklik gönderildiğinde bir derlemeyi tetikleyebilir .


23
@asveikau - Orijinal soru github hakkındaydı.
docwhat

Bu iyi bir çözüm değildir, çünkü hangi dalın itildiğine bakılmaksızın yapıyı tetikler.
Shannon

Aslında, "Anket SCM" yi etkinleştirirseniz (zamanlama gerekmez) git eklenti ayarlarında dal belirtecine uyuyor gibi görünüyor.
Shannon

1
Bu doğru olsa da, hiçbir çalışma alanı olmadığında derlemeyi hatalı olarak tetikler ("Çalışma alanı çevrimdışı. Bir çalışma alanı almak için yeni bir yapı zamanlama. (Varolmayan_çalışma alanı) Bitti. 0 ms Değişiklik bulundu"). Ayrıca bkz. İssue.jenkins
Shannon

GitHub listeleri eklentisi Git bir bağımlılık olarak eklentisi . Wiki Github proje "Bir işi oluştururken, altında URL belirtin '' ve Git altında URL belirtin seçin 'Kaynak Kodu Yönetimi' diyor. Diyor 'Bu tetikleyici yalnızca eşleşen repo karşı her gelen olay için algo iç yoklama eklentisi Git başladı.' Ben Anlaşma SCM'nin kabul edilen cevaptaki gibi olduğu anlamına gelir, ancak webhook'u otomatik olarak ve birkaç başka özellik ayarlama seçenekleri vardır.
dosentmatter

9

Derlemeleri uzaktan tetiklemek yerine, anketleri yoklayarak tetiklemek için Jenkins proje yapılandırmanızı değiştirin.

Jenkins, sabit bir dahili URL'ye veya bir URL'ye göre anket oluşturabilir. İkincisi, o dal için değişiklik yoksa derlemeleri atlamak istediğiniz şeydir. Kesin detaylar dokümantasyondadır . Temelde "Anket SCM" seçeneğini işaretlemeniz, zamanlama bölümünü boş bırakmanız ve JENKINS_URL / job / name / polling'i tıklamak için uzak bir URL ayarlamanız yeterlidir.

Güvenli bir Jenkins ortamına sahipseniz /build, /pollingURL kimlik doğrulaması gerektirir. Talimatları burada ayrıntılara sahip. Örneğin, GitHub Post-Receive kancaya gidiyorum username:apiToken@JENKIS_URL/job/name/polling.


8

İçin GitLab adımları kullanın:

  1. Projenizin ayarlarına gidin → Web kancaları
  2. Bir Push Event URL'si olarak Jenkins projenizden "Şimdi Oluştur" URL'sini girin:

    http://server.com/jenkins/job/project_name/build?delay=0sec Örneğin

  3. Tıklayın Add Web Hookve sonratest hook

Daha sonra depoya her taahhüt ettiğinizde, web kancası tetiklenir ve bir yapı oluşturulur. delete workspace before each buildYeni kodun yeni bir kopyasını almak için Jenkins çalışma alanınızı ayarladığınızdan emin olun .


2
nasıl sadece ana dal itmek inşa soru ile ilgili sorunu çözmek?
Custodio

4

Git ile ilgili değil, ama aşağıda Mercurial ile Jenkins iş yapılandırmasına ayrıntılı olarak yardımcı olacağım. Benzer bir sorunu olan diğerlerine de yardımcı olabilir.

  1. URL Tetikleyici Eklentisini Yükleme
  2. İş yapılandırma sayfasına gidin ve seçeneği seçin Poll SCM. Değeri* * * * *
  3. Seçeneği işaretleyin: [URLTrigger] - Poll with a URL. Artık değişiklik tarihi değişikliği, URL içeriği vb. Gibi bazı seçenekleri belirleyebilirsiniz.
  4. Seçeneklerde URL içeriği değişikliğini seçin, ilk seçeneği belirleyin - Monitor change of content
  5. Değişiklikleri kaydedin.

Şimdi, bazı test check-in'leriyle Mercurial deposunda bazı değişiklikleri tetikleyin.

Jenkins işinin SCM değişikliklerini algılayarak çalıştığını görün. Mercurial değişiklikler nedeniyle yapı çalıştırıldığında, metni görürsünüz Started by an SCM change. Else, manuel olarak başlatan kullanıcı.


3

Umarım bu yardımcı olur: Git taahhüdünde bir Jenkins derlemesi nasıl tetiklenir

Sadece Git tarafından sağlanan Git kancalarını kullanarak bir Jenkins işini tetiklemek için kıvrılma kullanma meselesi.

Komut curl http://localhost:8080/job/someJob/build?delay=0sec, Jenkins işinin someJobadı olan Jenkins işini çalıştırabilir.

Gizli .git klasörünüzdeki "kancalar" klasörünü arayın. "Post-commit.sample" dosyasını "post-commit" olarak yeniden adlandırın. Not Defteri ile açın, ": Nothing" satırını kaldırın ve yukarıdaki komutu içine yapıştırın.

Bu kadar. Bir taahhütte bulunduğunuzda Git, dosyada tanımlanan kesinleştirme sonrası komutlarını tetikler.


Burada ilk başta yorumunuzla kafam karıştı, çünkü yukarıdaki URL'deki "işi" bir iş adına değiştirmek zorunda olduğumu düşündüm. Jenkins de "Yeni Öğe" ye bastığımda, bir iş değil bir "Proje" kurduğum için de kafam karıştı, bu yüzden yukarıdaki "someJob" a başvurduğunuzda bunun projemin adı olduğunu bilmiyordum. Sonunda ihtiyacım olan url anladım: localhost: 8078 / job / codecept% 20tests / "codecept% 20tests" projemin adı burada. Çözümünüz için teşekkürler
Paul Preibisch

1
Teşekkürler Paul. Blog gönderisini ek bir notla güncelleyerek çözümünüzden bahsettim. "% 20" özellikle başkalarına yardımcı olacaktır.
Nav

3

Kod Git komutundan / GUI'den depoya aktarıldıktan sonra Jenkins ile Sürekli Entegrasyon:

  1. Jenkins'te yalnızca iş adıyla bir iş oluşturun ve proje serbest stilinin türünü seçin. Tıklayın OK. Bir sonraki sayfa hiçbir şey eklemiyor - tıklamanız yeterli Save.
  2. Kaynak kodun bulunduğu yerel Git deponuza gidin ve .git/hooksklasöre gidin .
  3. hooksKlasör kaç dosyaları içerir. "Sonradan taahhüt" olup olmadığını kontrol edin. Mevcut değilse, dosya uzantısı olmadan "post-commit" adlı bir dosya oluşturun:

    C:\work\test\\.git\hooks\post-commit
    
  4. Aşağıdaki komutla "taahhüt sonrası" dosyasını düzenleyin. Yerel kaynak kodu kancaları klasörünüzde bulunduğundan emin olun.

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

    Misal:

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

    5.

    userName: Jenkins kullanıcı adı

    jobName: Yapının iş adı

    apiToken: API jetonunuzu almak için Jenkins kullanıcı sayfanıza gidin (arayüzde sağ üstte). Sayfanın sol tarafındaki "Yapılandır" menüsünde bulunur: "API jetonunu göster"

  5. Kaynak kodunuzda değişiklik yapın ve kodu depoya gönderin.

  6. İşiniz, http://localhost:8080/jenkins/job/Gitcommittest/inşa edilmelidir.


3

Şube belirtmeniz gerekiyor. Varsayılan olarak her şeyi dinler. Hudson: Git ve Maven eklentileri adlı blog gönderisine bakın .


Geçenlerde Jenkins'i belirli bir dalda git'ten değişiklikleri almak için işte kurdum. İyi çalışıyor. +1
Greg K

Ben de bu ayarı yaptım. Fark ettiğim şey, Jenkins'in github'a her basıştan haberdar edilmesi ve buna tepki vermesidir, ancak sadece şube yöneticisi değiştiğinde oluşturma adımlarını çalıştırır. Bu yüzden "Değişiklik Yok" diyen bir sürü sahte derleme raporu alıyoruz. Bu davranışı da gözlemliyor musunuz?
Ziggy

Orijinal soru, cevabınızda yapılandırılan geniş ve gereksiz tetikleyiciyi (herhangi bir dalı ittiğinde tetikleme) nasıl çözeceğinizle ilgilidir. İlk iş dinleme yöneticisi dalı, ikincisi devel dalı, üçüncüsü FeatureX dalı ve benzeri dışında aynı yapılandırmaya sahip 5 jenkin işiniz varsa, yalnızca FeatureX dalına bastığınızda tüm jenkins işleri tetiklenir İş yükü çok yavaştır.
geoom

2

Genel Webhook Tetikleyici Eklentisi , bunu başarmak için filtrelerle yapılandırılabilir.

İle yapılandırıldığında

  • Adlı değişken refve ifade $.ref.
  • Metin $refve filtre ifadesi gibi bir filtre ^refs/heads/master$.

Sonra bu iş her itme için tetikleyecektir master. Yoklama yok.

Muhtemelen webhook'tan daha fazla değer oluşturmak istersiniz. İhtiyacınız olanı seçmek için JSONPath ile daha fazla değişken ekleyin.

Burada bazı kullanım örnekleri vardır: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


Nedir "achi" ?
Peter Mortensen

Yazım hatasıydı.
Tomas Bjerre

Jenkins $ GITCOMMIT nasıl kapılır, her zaman bir webhook ile null gibi görünüyor. Daha sonra, başarılı veya başarısız olduğunu söylemek için durumu geri gönderemezsiniz.
user3520245

1

Şu anki kuruluşumda, bunu master olarak yapmıyoruz, ancak anlık görüntü oluşturmaları oluşturmak için hem geliştirme hem de serbest bırakma / dallarda (Git Akışını kullanıyoruz) yapıyoruz.

Çok dallı bir boru hattı kullandığımız için bunu Jenkinsfile içinde {} sözdizimi ile yapıyoruz ...

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

Bu, bu blog yazısında ayrıntılıdır: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

Yukarıdaki cevaplar doğru ama sadelik için burada yeni başlayan onlara hitap ediyorum

özellikle boru hattı için inşa tetikleyicisini ayarlamak için:

İki Github şubeniz olduğunu düşünün: 1.master, 2.dev ve Jenkinsfile (boru hattı komut dosyasının yazıldığı yer) ve her dalda başka dosyalar var

Yeni Boru Hattı projesini yapılandırma (geliştirme dalı için)

## 1. git-plugin ve cron tabanlı yaklaşım ile kod entegrasyonu Prerequisite git plugin kurulmalı ve adınız ve e-postanızla yapılandırılmalıdır.

  1. Genel bölümü. Onay kutusunu işaretleyin - 'Bu proje parametrelendirildi' ve Ad-SBRANCH Varsayılan Değeri-'refs / remotes / origin / dev 'öğesini ekleyin
  2. "Onay kutusunu işaretleyin - 'Anket SCM' tetikleyicileri oluşturun ve her dakika kontrol etmek için '* / 1 * * * *' gibi kontrol taahhütlerine göre planlayın
  3. Boru hattı tanımı bölümü. - SCM'den boru hattı komut dosyası seçin -> git git -> addRepository URL'si -> git kimlik bilgilerini ekle -> gelişmiş seçin -> ad orijini ekle, RefSpec- '+ refs / heads / dev: refs / uzaktan kumandalar / origin / dev '(dev github şubesidir) -> Oluşturulacak şubeler - $ {SBRANCH} (ref 1. noktadan parametre adı) -> Komut Dosyası Yolu—> Jenkinsfile -> Lightweightcheckout'un işaretini kaldırın
  4. Uygula -> kaydet

## 2.Kod entegrasyonu: github-eklentisi ve webhook yaklaşımı Önkoşul Github eklentisi kurulmalı ve Github sunucusu yapılandırılmalıdır, aşağıdaki yapılandırmayı dikkate almıyorsanız bağlantı test edilmelidir

Jenkins'teki hesapla Github eklentisini yapılandırma

GitHub bölümü Mevcut değilse Github sunucusu ekle API URL'si: https://api.github.com Kimlik Bilgileri: Kişisel Erişim Jetonu (> Github hesaplarınızdan oluşturun>> ayarları ile gizli metin ekleyin (Ekle düğmesine tıklayın: gizli metin seçin) -> geliştirici ayarı—> kişisel erişim belirteci -> belirteç ekle -> kapsamları denetle -> belirteci kopyala) Test Bağlantısı -> Github hesabınıza bağlı olup olmadığını kontrol edin Kancaları Yönet onay kutusunu işaretleyin Önceden alt bölümü seçin 'paylaşılan sır' için önceki kimlik bilgisi

Tarafından deponuza eklenmediyse webhook ekleyin

  1. Github Deposu ayarına gidin -> webhook ekle -> URL ekle
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Yoksa Public_IP kullanımı yoksa ngrok . Kur, kimlik doğrulaması yap, genel IP'yi komuttan al ./ngrok http 80 (jenkins_port'u kullan) sonra webhook ekle -> URL ekle http: // Ngrok_IP / github-webhook /
  3. Webhook sayfasından yük taşıyarak test edin ve 200 durum alıp almadığınızı kontrol edin.

Github Pull istekleri eklentiniz varsa, yayınlanan Jenkins URL'si ile de yapılandırın.

  1. Genel bölümü. Onay kutusunu işaretleyin - 'Github projesi' proje URL'si ekleyin - ('.git /' ile biten github bağlantısı)
  2. Genel bölümü. Onay kutusunu işaretleyin - 'Bu proje parametrelendirildi' ve Ad-SBRANCH Varsayılan Değeri-'refs / remotes / origin / dev 'öğesini ekleyin
  3. Onay kutusunu işaretleyin - 'GITScm yoklaması için GitHub kanca tetiği'
  4. Pipeline def'n bölümü: - SCM'den Pipeline betiği seçin -> git git -> addRepository URL'si -> git kimlik bilgilerini ekle -> gelişmiş - seç -> İsim kaynağı, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev github şubesidir) -> Oluşturulacak şubeler - $ {SBRANCH} (ref 1.st noktasından parametre adı) -> Script Path—> Jenkinsfile—> Lightweightcheckout'un işaretini kaldırın
  5. Uygula -> kaydet


0

Yerel git sunucusu için çözümüm: yerel git sunucusu kanca dizininize gidin, varolan güncellemeyi yoksayın. Örnek ve tam anlamıyla "güncelleme" olarak adlandırılan yeni bir dosya oluşturun:

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$ 

Echo ifadesi git push sonucunuz altında görüntülenir, jenkins iş yapılandırmanızdan jeton alınabilir, bulmak için göz atın. "Update" dosyası çağrılmazsa, "sample" uzantısı olmadan aynı ada sahip diğer bazı dosyaları deneyin.

Tüm ihtiyacınız olan bu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.