Jak skonfigurować przechwycenie po zatwierdzeniu przez Git

126

Jak zdalnie wyzwolić kompilację z Jenkinsa?
Jak skonfigurować przechwytywanie po zatwierdzeniu przez Git?

Moim wymaganiem jest to, że za każdym razem, gdy w repozytorium Git zostaną wprowadzone zmiany dla określonego projektu, automatycznie rozpocznie się kompilacja Jenkinsa dla tego projektu.

W sekcji budowy wyzwalaczy Jenkinsa wybrałem zdalnie kompilację wyzwalacza.
W .gitkatalogu hooks jest tam, gdzie musimy skonfigurować plik po zatwierdzeniu.
Nie wiem, jak uruchomić stamtąd kompilację (znam część, w której powinniśmy użyć polecenia curl).


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

Umieściłem to polecenie w moim katalogu hooks serwera git (punkt zaczepienia po zatwierdzeniu).
Za każdym razem, gdy zmiany zachodzą w repozytorium, uruchamia się automatyczne budowanie.

Chcę sprawdzić w zestawie zmian, czy w co najmniej jednym pliku java znajduje się kompilacja powinna się rozpocząć.
Załóżmy, że programiści zmienili tylko pliki xml lub pliki właściwości, których kompilacja nie powinna się rozpocząć.
Wraz z xmlzałóżmy, że te .javapliki są tam budowa powinna rozpocząć.

phanikumar Raja
źródło
Zredagowałem swoją odpowiedź, aby odpowiedzieć na drugą część twojego pytania.
VonC

Odpowiedzi:

164

Jak wspomniano w „ Polling must die: triggering Jenkins builds from a git hook ”, możesz powiadomić Jenkinsa o nowym zatwierdzeniu:

Dzięki najnowszej wtyczce Git 1.1.14 (którą właśnie opublikowałem) możesz teraz zrobić to łatwiej> łatwiej, wykonując po prostu następujące polecenie:

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

Spowoduje to przeskanowanie wszystkich zadań skonfigurowanych do pobierania określonego adresu URL, a jeśli są one również skonfigurowane z odpytywaniem, natychmiast uruchomi sondowanie (a jeśli znajdzie zmianę wartą kompilacji, zostanie uruchomiona kompilacja po kolei. )

Dzięki temu skrypt pozostaje niezmieniony, gdy zadania pojawiają się i znikają w Jenkins.
Lub jeśli masz wiele repozytoriów w ramach jednej aplikacji hosta repozytorium (takiej jak Gitosis), możesz udostępnić pojedynczy skrypt przechwytujący po odbiorze ze wszystkimi repozytoriami. Wreszcie, ten adres URL nie wymaga uwierzytelniania nawet w przypadku zabezpieczonego Jenkinsa, ponieważ serwer nie używa bezpośrednio niczego, co przesyła klient. Uruchamia odpytywanie w celu sprawdzenia, czy nastąpiła zmiana, zanim faktycznie rozpocznie kompilację.

Tak jak wspomniano tutaj , upewnij się, że używasz właściwego adresu dla swojego serwera Jenkins:

ponieważ używamy Jenkinsa jako samodzielnego serwera WWW na porcie 8080, adres URL powinien być bez rozszerzenia /jenkins przykład:

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

Aby wzmocnić ten ostatni punkt, ptha dodaje w komentarzach :

Może to oczywiste, ale miałem problemy z:

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

Url parametr powinien pasować dokładnie to, co masz w repozytorium URL swojej pracy Jenkins.
Kopiując przykłady, w naszym przypadku pominąłem protokółssh:// i nie zadziałał.


Możesz także użyć prostego haka po odbiorze, takiego jak „ Kompilacje oparte na wypychaniu przy użyciu Jenkinsa i GIT

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

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

Skonfiguruj swoje zadanie Jenkins, aby móc „wyzwalać kompilacje zdalnie” i używać tokena uwierzytelniania (1qaz2wsx w tym przykładzie).

Jest to jednak skrypt specyficzny dla projektu i autor podaje sposób na jego uogólnienie.
Pierwsze rozwiązanie jest łatwiejsze, ponieważ nie zależy od uwierzytelnienia ani konkretnego projektu.


Chcę sprawdzić, czy zmiana jest ustawiona, czy jest tam przynajmniej jeden plik java, którego kompilacja powinna się rozpocząć.
Załóżmy, że programiści zmienili tylko pliki XML lub pliki właściwości, a następnie kompilacja nie powinna się rozpocząć.

Zasadniczo skrypt kompilacji może:

  • umieść notatki dotyczące `` kompilacji '' (patrz git notes ) przy pierwszym wywołaniu
  • podczas kolejnych wywołań, pobierz listę zatwierdzeń między HEADkandydatem na gałąź do zbudowania a zatwierdzeniem, do którego odwołuje się polecenie git notes'build' (git show refs/notes/build ) git diff --name-only SHA_build HEAD.
  • Twój skrypt może przeanalizować tę listę i zdecydować, czy musi kontynuować kompilację.
  • w każdym razie utwórz / przenieś swój git notesbuild” do HEAD.

Maj 2016: cwhsu wskazuje w komentarzach następujący możliwy adres URL:

możesz po prostu użyć, curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENjeśli ustawisz konfigurację wyzwalacza w swoim elemencie

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


Czerwiec 2016, polaretto zwraca uwagę w komentarzach :

Chciałem dodać, że dzięki niewielkiemu skryptowi powłoki można uniknąć ręcznej konfiguracji adresu URL, szczególnie jeśli masz wiele repozytoriów we wspólnym katalogu.
Na przykład użyłem tych rozszerzeń parametrów, aby uzyskać nazwę repozytorium

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

a następnie użyj go jak:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository
VonC
źródło
cześć von, jak powiedziałeś podczas pierwszego połączenia, muszę umieścić kompilację notes.my, pierwsze wywołanie to odczytanie pliku .java za każdym razem, gdy programista wprowadzi zmiany do repozytorium git. jestem nowy w tych wszystkich sprawach, dlatego pytam na każdym kroku. proszę, nie przejmuj się i muszę wykonać to zadanie.
phanikumar Raja
To jest dla mnie bardzo pomocne. Przy pomocy tego tematu napisałem hooka Git. Faceci z Tnx!
Kirill Bazarov,
Musiałem dodać wywołanie curl do pliku po odbiorze, co nie jest całkowicie jasne z tej odpowiedzi. W każdym razie bardzo pomocne!
Magnilex
1
@IgorGanapolsky w folderze hooks twojego samego repozytorium, które otrzymuje zatwierdzenia i które musi wywołać jenkins:yourRepo.git/hooks/post-receive
VonC
2
Może to być oczywiste, ale miałem problemy z: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Url parametr powinien pasować dokładnie to, co masz w repozytorium URL swojej pracy Jenkins. Kopiując przykłady pominąłem protokół, w naszym przypadku ssh: // i nie zadziałał.
ptha
17

Mam nadzieję, że to pomoże: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

To tylko kwestia użycia curldo wywołania zadania Jenkinsa za pomocą haków git dostarczonych przez git.
Komenda

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

może uruchomić zadanie Jenkinsa, gdzie someJobjest nazwa zadania Jenkinsa.

Wyszukaj hooksfolder w ukrytym folderze .git. Zmień nazwę post-commit.samplepliku na post-commit. Otwórz go za pomocą Notatnika, usuń : Nothinglinię i wklej do niej powyższe polecenie.

Otóż ​​to. Za każdym razem, gdy wykonujesz zatwierdzenie, Git wyzwoli polecenia po zatwierdzeniu zdefiniowane w pliku.

Nav
źródło
Po wykonaniu zatwierdzenia z maszyny deweloperskiej wywoływana jest funkcja post-Receive, a nie post-commit. Weryfikowane przez umieszczenie instrukcji dziennika w obu zaczepach. Czy źle czytam dokumenty, czy nie powinno to być wywoływane po zatwierdzeniu?
Shirish Hirekodi
@Shirish: To dziwne. Być może robisz coś inaczej
nawigacja
jest to kompilacja pomyślna, gdy mam zatwierdzenie ostatniej zmiany push, ale nie kompiluję, gdy zatwierdzam zmiany ... ???
3

Tak jak poprzednia odpowiedź pokazała przykład tego, jak może wyglądać pełny punkt zaczepienia, oto kod mojego działającego zaczepu po odbiorze:

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

W tym przypadku uruchamiam zlecenia Jenkinsa tylko wtedy, gdy pcham do mastera, a nie do innych gałęzi.

Zitrax
źródło
1
Jak powiązać ten skrypt Pythona z Jenkinsem? A może po prostu uruchomisz to raz?
Igor Ganapolsky
Jenkins nie wie o tym podpięciu, główną częścią jest ładowanie adresu URL notifyCommit na serwerze jenkins, który wywoła ankietę. Myślę, że odpytywanie jest włączone, ale bez harmonogramu po stronie Jenkinsa.
Zitrax
Więc gdzie znajduje się ten skrypt Pythona? Zakładam, że
powiążesz
1
Późna odpowiedź - ale lokalizacja skryptu znajdowałaby się na serwerze git w hookach / post-Receive. Przeczytaj o hakach git, aby dowiedzieć się więcej.
Zitrax
3

Chcę dodać do powyższych odpowiedzi, że staje się to trochę trudniejsze, jeśli autoryzacja Jenkins jest włączona.

Po włączeniu otrzymałem komunikat o błędzie, że anonimowy użytkownik potrzebuje uprawnień do odczytu.

Widziałem dwa możliwe rozwiązania:

1: Zmiana haka na:

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

2: ustawianie uprawnień na podstawie projektu.

Poprzednie rozwiązanie ma tę wadę, że musiałem ujawnić swoje hasło w pliku przechwytującym. Niedopuszczalne w moim przypadku.

Drugi działa dla mnie. W globalnych ustawieniach uwierzytelniania musiałem włączyć Ogólne> Odczyt dla użytkownika anonimowego. W projekcie, który chciałem uruchomić, musiałem włączyć Praca> Tworzenie i Praca> Czytaj dla anonimowych.

To wciąż nie jest idealne rozwiązanie, ponieważ teraz możesz zobaczyć projekt w Jenkins bez logowania. Może istnieć jeszcze lepsze rozwiązanie przy użyciu pierwszego podejścia z logowaniem przez http, ale nie rozgryzłem tego.

anhoppe
źródło