Git sonrası kaydetme kancası nasıl yapılandırılır


127

Bir derlemeyi Jenkins'ten uzaktan nasıl tetikleyebilirim?
Git post commit kancası nasıl yapılandırılır?

Gereksinimim, belirli bir proje için Git deposunda her değişiklik yapıldığında, o proje için Jenkins derlemesini otomatik olarak başlatacak olmasıdır.

Jenkins tetik oluşturma bölümünde uzaktan tetikleyici derlemeyi seçtim.
In .gitdizin dizin orada biz yapılandırmak mesaja zorunda olduğu dosyayı işlemek kanca.
Oradan bir yapıyı nasıl tetikleyeceğimi karıştırıyorum (bazı kısımları curl komutunu kullanmamız gerektiğini biliyorum).


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

Bu komutu git server hooks dizinime yerleştirdim (post commit hook).
Depoda değişiklik olduğunda, otomatik derlemeyi çalıştırıyor.

En az bir java dosyasında derlemenin başlaması gerekip gerekmediğini kontrol etmek istiyorum.
Geliştiricilerin yalnızca xml dosyalarını veya özellik dosyalarını değiştirdiğini varsayalım, derleme başlamamalıdır.
Bununla birlikte xml, .javadosyaların derlemenin başlaması gereken orada olduğunu varsayalım .


Sorunuzun ikinci kısmına değinmek için cevabımı düzenledim.
VonC

Yanıtlar:


166

" Yoklama ölmeli: Jenkins derlemelerini bir git kancasından tetikleme " bölümünde belirtildiği gibi , Jenkins'e yeni bir kesinleştirme konusunda bildirimde bulunabilirsiniz:

En son Git eklentisi 1.1.14 ile (şimdi yayınladığım), artık bunu daha> kolay bir şekilde aşağıdaki komutu çalıştırarak yapabilirsiniz:

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

Bu, belirtilen URL'yi kontrol etmek için yapılandırılmış tüm işleri tarayacak ve bunlar da yoklama ile yapılandırılmışsa, yoklamayı hemen tetikleyecektir (ve bu, bir derlemeye değer bir değişiklik bulursa, sırayla bir yapı tetiklenecektir. )

Bu, bir komut dosyasının, Jenkins'te işler gelip gittiğinde aynı kalmasını sağlar.
Veya tek bir depo ana bilgisayar uygulaması altında birden fazla deponuz varsa (Gitosis gibi), tüm depolarla tek bir alma sonrası kanca komut dosyasını paylaşabilirsiniz. Son olarak, bu URL, güvenli Jenkins için bile kimlik doğrulaması gerektirmez, çünkü sunucu, istemcinin gönderdiği hiçbir şeyi doğrudan kullanmaz. Bir derlemeye başlamadan önce bir değişiklik olduğunu doğrulamak için yoklamayı çalıştırır.

Burada belirtildiği gibi , Jenkins sunucunuz için doğru adresi kullandığınızdan emin olun:

Jenkins'i 8080 numaralı bağlantı noktasında bağımsız bir Web sunucusu olarak çalıştırdığımız için, URL şu şekilde olmamalıydı /jenkins:

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

Bu son noktayı güçlendirmek için, ptha yorumlara şunları ekliyor :

Açık olabilir, ancak şu konularla ilgili sorunlarım vardı:

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

Url parametresi ne var tam olarak uymalıdır Depo adresten sizin Jenkins işin.
Örnekleri kopyalarken, bizim durumumuzda protokolü dışarıda bıraktım ssh://ve işe yaramadı.


Ayrıca basit kullanabilirsiniz "gibi kanca yazı-alacak temelli Basmalı Jenkins ve GIT kullanarak oluşturur "

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

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

Jenkins işinizi "Derlemeleri uzaktan tetikleyebilecek" şekilde yapılandırın ve bir kimlik doğrulama belirteci kullanın ( 1qaz2wsxbu örnekte).

Ancak, bu projeye özgü bir senaryodur ve yazar bunu genellemenin bir yolundan bahseder.
İlk çözüm, kimlik doğrulamasına veya belirli bir projeye bağlı olmadığı için daha kolaydır.


Derlemenin başlaması gereken en az bir java dosyası olup olmadığını kontrol etmek istiyorum.
Geliştiricilerin yalnızca XML dosyalarını veya özellik dosyalarını değiştirdiğini, ardından derlemenin başlamaması gerektiğini varsayalım.

Temel olarak, derleme komut dosyanız şunları yapabilir:

  • git notesilk görüşmeye bir 'inşa' notları (bakınız ) koyun
  • sonraki çağrılarda arasındaki kaydedilmesini listesini kapmak HEADyapı için şube adayın tarafından başvurulan kesinleştirme git notes'yapı' ( git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • betiğiniz bu listeyi ayrıştırabilir ve derlemeye devam etmesi gerekip gerekmediğine karar verebilir.
  • her durumda, git notes' build' öğenizi oluşturun / taşıyın HEAD.

May 2016: cwhsu Puan yorumlarda aşağıdaki olası url:

yalnızca curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENöğenizde tetikleyici yapılandırması ayarlarsanız kullanabilirsiniz

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


Haziran 2016, polaretto işaret yorumlarda :

Eklemek istedim, sadece biraz kabuk komut dosyası yazarak, özellikle ortak bir dizin altında çok sayıda deponuz varsa, manuel url yapılandırmasından kaçınabilirsiniz.
Örneğin repo adını almak için bu parametre genişletmelerini kullandım.

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

ve sonra şu şekilde kullanın:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

merhaba von, ilk aramada söylediğiniz gibi bir derleme notları koymam gerekiyor. İlk çağrım, geliştirici değişiklikleri git repo'ya her gönderdiğinde .java dosyasını okumaktır. Tüm bu şeylerde yeniyim, bu yüzden her adımı soruyorum. lütfen aldırma ve bu görevi tamamlamalıyım.
phanikumar Raja

Bu benim için çok yardımcı oldu. Bu konunun yardımıyla Git hook yazdım. Tnx çocuklar!
Kirill Bazarov

Curl çağrısını alma sonrası dosyasına eklemek zorunda kaldım, bu cevaptan tamamen anlaşılmıyor. Yine de çok yardımcı oldu!
Magnilex

1
İşlemleri alan ve jenkins'i çağırması gereken çıplak deponuzun hooks klasöründeki @IgorGanapolsky:yourRepo.git/hooks/post-receive
VonC

2
Belli olabilir, ama ben sorunları vardı: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Url parametresi ne var tam olarak uymalıdır Depo adresten sizin Jenkins işin. Örnekleri kopyalarken protokolü bıraktım, bizim durumumuzda ssh: // ve işe yaramadı.
ptha

17

Bunun yardımcı olacağını umuyoruz: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

curlGit tarafından sağlanan git kancalarını kullanarak bir Jenkins işini tetiklemek için kullanma meselesi .
Komuta

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

bir Jenkins işi çalıştırabilir, burada Jenkins işinin someJobadı bulunur.

Ara hooksgizli .git klasörde klasörün. post-commit.sampleDosyayı olarak yeniden adlandırın post-commit. Not Defteri ile açın, : Nothingsatırı kaldırın ve yukarıdaki komutu içine yapıştırın.

Bu kadar. Bir commit yaptığınızda, Git dosyada tanımlanan post-commit komutlarını tetikleyecektir.


Geliştirme makinesinden commit yaptıktan sonra, post-commit değil, post-Rece çağrılır. Her iki kancaya da günlük ifadeleri koyarak doğrulandı. Belgeleri yanlış mı okuyorum, çağrılan post-commit olmamalı mı?
Shirish Hirekodi

@Shirish: Bu tuhaf. Belki de farklı bir şey yapıyorsunuz
Nav

bu, son değişiklik taahhüdünü zorladığımda başarılı bir şekilde inşa edilir, ancak değişiklikleri uyguladığımda inşa etmez ... ???

3

Önceki yanıt, tam kancanın nasıl görünebileceğine dair bir örnek gösterdiği gibi, çalışma sonrası alma kancamın kodu:

#!/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"])

Bu durumda, jenkins işlerini yalnızca diğer dalları değil, ana dallara zorlarken tetiklerim.


1
Bu Python betiğini Jenkins'e nasıl bağlarsınız? Yoksa sadece bir kez mi çalıştırıyorsun?
IgorGanapolsky

Jenkins bu kancayı bilmiyor, ana kısım notifyCommit url'sini jenkins sunucusuna yüklemek ve bu da bir anketi tetikleyecek. Bence yoklama etkin ama jenkins tarafında bir program yok.
Zitrax

Peki bu python betiği nerede bulunuyor?
Taahhütleri

1
Geç cevap - ancak komut dosyası konumu, kancalarda / alım sonrası git sunucusunda olacaktır. Daha fazlasını öğrenmek için git kancalarını okuyun.
Zitrax

3

Yukarıdaki cevaplara, Jenkins yetkilendirmesinin etkinleştirilmesinin biraz daha zor olacağını eklemek istiyorum.

Etkinleştirdikten sonra anonim kullanıcının okuma iznine ihtiyacı olduğuna dair bir hata mesajı aldım.

İki olası çözüm gördüm:

1: Kancamı şu şekilde değiştiriyorum:

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

2: proje bazlı yetkilendirmeyi ayarlama.

Önceki çözümlerin dezavantajı, passwd'mi kanca dosyasında göstermem gerekiyordu. Benim durumumda kabul edilemez.

İkincisi benim için çalışıyor. Global kimlik doğrulama ayarlarında Genel> Anonim kullanıcı için Oku özelliğini etkinleştirmem gerekiyordu. Tetiklemek istediğim projede, İş> Oluştur ve İş> Anonim Olarak Oku seçeneğini etkinleştirmem gerekiyordu.

Bu hala mükemmel bir çözüm değil çünkü projeyi artık oturum açmadan Jenkins'te görebilirsiniz. Eski yaklaşımı http oturum açma ile kullanarak daha da iyi bir çözüm olabilir, ancak henüz çözemedim.

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.