Jak mogę sprawić, by Jenkins CI z Git wyzwalał na wypychaniach do opanowania?


205

Próbuję skonfigurować Jenkins-ci dla projektu przy użyciu GitHub. Mam już skonfigurowane Jenkins z odpowiednimi wtyczkami. Chcę, aby Jenkins uruchamiał skrypty budowania tylko wtedy, gdy ktoś w projekcie próbuje opanować. Do tej pory mogłem go skonfigurować tak, aby kompilacja była uruchamiana za każdym razem, gdy ktoś popchnie go w dowolne miejsce, ale jest to zbyt szerokie. Zrobiłem to za pomocą haków serwisowych po odbiorze na Git.

Przeczytałem wiki Jenkins i kilka samouczków, ale brakuje tego szczególnego szczegółu ... czy to może mieć coś wspólnego z ankietami? Czy też należy pracować po stronie Gita, aby Git uruchamiał Jenkinsa tylko po masterzmianie?


3
Oryginalny autor Jenkins, Kohsuke Kawaguchi, opisuje, jak wykonać powiadomienie wypychane z repozytorium za pomocą wtyczki Git Wtyczka Git 1.1.14. Zobacz kohsuke.org/2011/12/01/…
GeraldScott

Odpowiedzi:


190

Jak już zauważył Gezzed w swoim komentarzu, tymczasem istnieje dobre rozwiązanie (opisane w Polling musi umrzeć: wyzwalanie kompilacji Jenkinsa z haka Git ):

  • Ustaw wyzwalacz kompilacji zadania Jenkins na Poll SCM , ale nie określaj harmonogramu.

  • Utwórz wyzwalacz po otrzymaniu GitHub, aby powiadomić adres URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Spowoduje to uruchomienie wszystkich kompilacji, które sondują określone repozytorium Git.

  • Jednak odpytywanie sprawdza, czy coś zostało przekazane do używanej gałęzi.

Działa idealnie.


1
Działa to również świetnie dla mnie, możesz zastosować to samo podejście z lokalną gigantyczną instalacją: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith

4
Działa również z hakiem POST Bitbucket (nie Jenkins). Aby określić dane uwierzytelniające, możesz użyć user: password@my.ci.server/git/notifyCommit? Url = ... jako adres URL.
loevborg

Czy można to skonfigurować, aby Jenkins budował tylko biblioteki / projekty, na które wpłynęło ostatnie wypychanie repozytorium? Nie budujesz ponownie całego oddziału?
Croolman,

Czy możesz wyjaśnić tę część? „Utwórz wyzwalacz po otrzymaniu github, aby powiadomić adres URL”
dewwwald

Zakładam, że github musi być w stanie dotrzeć do twojej instancji Jenkinsa, co oznacza, że ​​musi być publicznie dostępny. Czy jest możliwe, aby działało to z niepublicznym serwerem Jenkins?
A. Murray,

33

Począwszy od wersji 0.5, wtyczka GitHub dla Jenkins może wyzwalać kompilację, gdy zmiana zostanie przekazana do GitHub .


23
@asveikau - Oryginalne pytanie dotyczyło github.
docwhat

To nie jest dobre rozwiązanie, ponieważ uruchamia kompilację niezależnie od tego, która gałąź została wypchnięta.
Shannon,

Właściwie wygląda na to, że podąża za specyfikatorem gałęzi w ustawieniach wtyczki git, jeśli włączysz „Poll SCM” (harmonogram nie jest konieczny).
Shannon,

1
Chociaż może to być prawda, nadal niepoprawnie uruchamia kompilację, gdy nie istnieje żaden obszar roboczy („Obszar roboczy jest offline. Planowanie nowej kompilacji w celu uzyskania obszaru roboczego. (Nieistniejący_ obszar roboczy) Gotowe. Zajęło 0 ms Znaleziono zmiany”). Zobacz także Issues.jenkins-ci.org/browse/JENKINS-18079
Shannon

GitHub wtyczki listach Git plugin jako zależność . Wiki mówi „podczas tworzenia zadania, należy podać adres URL na podstawie projektu«github»i wybierz Git określić adres URL pod«Source Code Management». To mówi«Ten wyzwalacz tylko kopie Git plugin wewnętrznego odpytywania algo dla każdego przychodzącego zdarzenia przeciwko dopasowane repo». I myślę, że oznacza to, że w zasadzie przypomina SCM ankiety, jak w zaakceptowanej odpowiedzi, ale ma opcje automatycznego konfigurowania haka i kilka innych funkcji
dosentmatter

9

Zamiast wyzwalać kompilacje zdalnie, zmień konfigurację projektu Jenkins, aby uruchamiać kompilacje przez odpytywanie.

Jenkins może sondować na podstawie ustalonego wewnętrznego lub adresu URL. To drugie chcesz pominąć kompilacje, jeśli nie ma zmian w tej gałęzi. Dokładne szczegóły znajdują się w dokumentacji . Zasadniczo musisz tylko zaznaczyć opcję „Ankieta SCM”, pozostaw pustą sekcję harmonogramu i ustawić zdalny adres URL, aby trafiał na JENKINS_URL / job / name / polling.

Jeden problem, jeśli masz zabezpieczone środowisko Jenkins, jest inny /build, /pollingadres URL wymaga uwierzytelnienia. Instrukcje tutaj mają szczegóły. Na przykład mam przechwytujący GitHub po otrzymaniu username:apiToken@JENKIS_URL/job/name/polling.


8

W przypadku GitLab wykonaj następujące kroki:

  1. Przejdź do ustawień projektu → Haczyki internetowe
  2. Wprowadź adres URL „Build Now” z projektu Jenkins jako adres URL zdarzenia push:

    http://server.com/jenkins/job/project_name/build?delay=0sec na przykład

  3. Kliknij, Add Web Hooka następnietest hook

Następnie po każdym zatwierdzeniu do repozytorium uruchamiany jest zaczep sieciowy i tworzona jest kompilacja. Pamiętaj, aby ustawić obszar roboczy Jenkins, aby delete workspace before each builduzyskać świeżą kopię nowego kodu.


2
jak rozwiązujesz problem z pytaniem dotyczącym kompilacji właśnie w momencie wypychania gałęzi master?
Custodio,

4

Nie dotyczy Gita, ale poniżej pomogę szczegółowo skonfigurować zadanie Jenkins z Mercurialem. Może pomóc innym z podobnym problemem.

  1. Zainstaluj wtyczkę Trigger URL
  2. Przejdź do strony konfiguracji zadania i wybierz Poll SCMopcję. Ustaw wartość na* * * * *
  3. Zaznacz opcję: [URLTrigger] - Poll with a URL. Teraz możesz wybrać niektóre opcje, takie jak zmiana daty modyfikacji, treść adresu URL itp.
  4. W opcjach wybierz zmianę treści adresu URL, wybierz pierwszą opcję - Monitor change of content
  5. Zapisz zmiany.

Teraz dokonaj pewnych zmian w repozytorium Mercurial przez niektóre testy testowe.

Sprawdź, czy zadanie Jenkins teraz działa, wykrywając zmiany SCM. Gdy kompilacja zostanie uruchomiona z powodu zmian Mercurial, zobaczysz tekst Started by an SCM change. W przeciwnym razie użytkownik, który ręcznie go uruchomił.


3

Mam nadzieję, że to pomoże: jak uruchomić wersję Jenkins na Git commit

To tylko kwestia użycia curl do uruchomienia zadania Jenkinsa za pomocą haków Git dostarczonych przez Git.

Polecenie curl http://localhost:8080/job/someJob/build?delay=0secmoże uruchomić zadanie Jenkins, gdzie someJobjest nazwa zadania Jenkins.

Wyszukaj folder „hooks” w ukrytym folderze .git. Zmień nazwę pliku „post-commit.sample” na „post-commit”. Otwórz go za pomocą Notatnika, usuń wiersz „: Nic” i wklej do niego powyższe polecenie.

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


Z początku pomyliłem się tutaj z twoim komentarzem, ponieważ myślałem, że muszę zmienić „pracę” w powyższym adresie URL na nazwę pracy. Byłem również zdezorientowany, ponieważ kiedy nacisnąłem „Nowy przedmiot” w Jenkins, stworzyłem „Projekt”, a nie zadanie, więc kiedy wspomniałeś powyżej „someJob”, nie wiedziałem, że to nazwa mojego projektu. W końcu wymyśliłem adres URL, którego potrzebuję: localhost: 8078 / job / codecept% 20tests / build, gdzie „codecept% 20tests” to nazwa mojego projektu. Dzięki za rozwiązanie
Paul Preibisch,

1
Dzięki Paul. Zaktualizowałem post na blogu o dodatkową notatkę, w której wspomniałem o twoim rozwiązaniu. „% 20” będzie szczególnie pomocne dla innych.
Nav

3

Ciągła integracja z Jenkins, po wypchnięciu kodu do repozytorium z polecenia Git / GUI:

  1. Utwórz pracę w Jenkins z tylko nazwą pracy i wybierz typ projektu freestyle. Kliknij OK. Następna strona nic nie dodaje - wystarczy kliknąć Save.
  2. Przejdź do lokalnego repozytorium Git, w którym masz kod źródłowy, i przejdź do .git/hooksfolderu.
  3. hooksFolder zawiera kilka plików. Sprawdź „po zatwierdzeniu”. Jeśli nie jest obecny, utwórz plik „po zatwierdzeniu” bez rozszerzenia pliku:

    C:\work\test\\.git\hooks\post-commit
    
  4. Edytuj plik „po zatwierdzeniu” za pomocą poniższego polecenia. Upewnij się, że jest on obecny w folderze hooks lokalnego kodu źródłowego.

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

    Przykład:

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

    5

    userName: Nazwa użytkownika Jenkins

    jobName: Nazwa zadania kompilacji

    apiToken: Aby uzyskać token API, przejdź do strony użytkownika Jenkins (w prawym górnym rogu interfejsu). Jest dostępny w menu „Konfiguruj” po lewej stronie: „Pokaż token API”

  5. Wprowadź zmiany w kodzie źródłowym i przekaż kod do repozytorium.

  6. Twoim zadaniem http://localhost:8080/jenkins/job/Gitcommittest/powinno być budowanie.


3

Musisz podać gałąź. Domyślnie nasłuchuje wszystkiego. Zobacz wpis na blogu Hudson: Wtyczki Git i Maven .


Niedawno skonfigurowałem Jenkinsa w pracy, aby pobierał zmiany z git w określonej gałęzi. Działa w porządku. +1
Greg K

Ustawiłem również to ustawienie. Zauważam, że Jenkins jest powiadamiany o każdym wypychaniu do github i reaguje na to, ale uruchamia kroki kompilacji tylko wtedy, gdy zmienił się master oddziału. Otrzymujemy więc mnóstwo fałszywych raportów o kompilacji, które mówią „Bez zmian”. Czy również obserwujesz to zachowanie?
Ziggy,

Pierwotne pytanie dotyczy tego, jak rozwiązać szeroki i niepotrzebny wyzwalacz (uruchamiany, gdy ktoś naciska na dowolną gałąź) skonfigurowany w odpowiedzi. Jeśli masz 5 zadań typu jenkin z tą samą konfiguracją, z wyjątkiem tego, że pierwsze zadanie nasłuchuje gałęzi master, drugie gałęzi devel, trzecie gałęzi FeatureX i tak dalej, po naciśnięciu na gałąź FeatureX wszystkie zadania jenkins zostaną uruchomione, co prowadzi do przeciążenie pracą kompilacjami bardzo wolno.
geoom

2

W tym celu można skonfigurować ogólną wtyczkę wyzwalacza Webhook z filtrami.

Po skonfigurowaniu z

  • Zmienna o nazwie refi wyrażeniu $.ref.
  • Filtr z tekstem $refi wyrażeniem filtru podobnym do ^refs/heads/master$.

Wtedy to zadanie zostanie uruchomione przy każdym naciśnięciu przycisku master. Brak odpytywania.

Prawdopodobnie chcesz więcej wartości z haka do faktycznego wykonania kompilacji. Wystarczy dodać więcej zmiennych za pomocą JSONPath, aby wybrać to, czego potrzebujesz.

Oto kilka przypadków użycia: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


Co to jest „achi” ?
Peter Mortensen

To był błąd pisowni.
Tomas Bjerre

jak zdobyć $ GITCOMMIT w Jenkins, zawsze wydaje się być zerowy z hakiem sieciowym. Nie można wtedy odesłać statusu z powrotem, aby powiedzieć sukces lub niepowodzenie.
user3520245,

1

W mojej obecnej organizacji nie robimy tego w trybie głównym, ale robimy to zarówno w fazie rozwoju, jak i wydania / gałęzi (używamy Git Flow), aby wygenerować kompilacje migawek.

Ponieważ używamy potoku z wieloma gałęziami, robimy to w pliku Jenkins przy użyciu składni when {} ...

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

Jest to szczegółowo opisane w tym poście na blogu: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

Powyższe odpowiedzi są poprawne, ale zwracam się do tych, którzy są nowicjuszami ze względu na ich prostotę

szczególnie do ustawiania wyzwalacza kompilacji dla potoku:

Rozważ, że masz dwie gałęzie Github: 1.master, 2.dev i Jenkinsfile (gdzie jest zapisany skrypt potoku), a inne pliki są dostępne w każdej gałęzi

Skonfiguruj nowy projekt rurociągu (dla oddziału deweloperskiego)

## 1. Integracja kodu z wtyczką git i podejściem opartym na cron Wymagana wtyczka git powinna zostać zainstalowana i skonfigurować ją z Twoim imieniem i adresem e-mail

  1. Sekcja ogólna Zaznacz pole wyboru - „Ten projekt jest sparametryzowany” i dodaj wartość domyślną Nazwa-SBRANCH -refs / piloty / pochodzenie / dev
  2. Utwórz sekcję wyzwalaczy „Pole wyboru -„ Ankieta SCM ”i zaplanuj zgodnie z potrzebą sprawdzania zatwierdzeń, np.„ * / 1 * * * * ”, aby sprawdzać co minutę
  3. Sekcja definicji potoku Wybierz - Skrypt potoku z SCM—> wybierz git—> addRepository URL—> dodaj poświadczenia git -> wybierz zaawansowane -> dodaj Nazwa- pochodzenie, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev jest gałęzią github) -> Gałęzie do zbudowania - $ {SBRANCH} (Nazwa parametru od pierwszego punktu odniesienia) -> Ścieżka skryptu—> Jenkinsfile -> Odznacz Lightweightcheckout
  4. Zastosuj—> zapisz

## 2. Integracja kodu: wtyczka github i podejście do webhooka Wymaganie wstępne Należy zainstalować wtyczkę Github i skonfigurować serwer Github, należy przetestować połączenie, jeśli nie rozważa się następującej konfiguracji

Skonfiguruj wtyczkę Github z kontem na Jenkins

Sekcja GitHub Dodaj serwer Github, jeśli nie jest obecny Adres URL API: https://api.github.com Poświadczenia: Dodaj tajny tekst (kliknij przycisk Dodaj: wybierz typ tajnego tekstu) o wartości Osobisty token dostępu (Wygeneruj go z kont Github—> ustawienia -> ustawienie programisty—> osobisty token dostępu—> dodaj token—> sprawdź zakresy -> skopiuj token) Testuj połączenie -> Sprawdź, czy jest on podłączony do konta Github, czy nie Zaznacz pole wyboru za pomocą Zarządzaj hakami Wcześniej podsekcja po prostu wybierz poprzednie poświadczenie dotyczące „wspólnego hasła”

Dodaj element webhook, jeśli nie został dodany do repozytorium przez

  1. Przejdź do ustawienia repozytorium Github -> dodaj element webhook—> dodaj adres URL
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Lub jeśli nie masz Public_IP użyj ngrok . Zainstaluj, uwierzytelnij, uzyskaj publiczny adres IP z komendy ./ngrok http 80 (użyj portu jenkins_port), a następnie dodaj element webhook -> dodaj adres URL http: // Ngrok_IP / github-webhook /
  3. Przetestuj go, dostarczając ładunek ze strony haka internetowego i sprawdź, czy masz status 200, czy nie.

Jeśli masz wtyczkę Github Pull, skonfiguruj ją również za pomocą opublikowanego adresu URL Jenkins.

  1. Sekcja ogólna Zaznacz pole wyboru - „Projekt Github” dodaj adres URL projektu - (link github kończący się na „.git /”)
  2. Sekcja ogólna Zaznacz pole wyboru - „Ten projekt jest sparametryzowany” i dodaj wartość domyślną Nazwa-SBRANCH -refs / piloty / pochodzenie / dev
  3. Zbuduj triggers.section.Sprawdź pole wyboru - „GitHub hook trigger for polling GITScm”
  4. Rurociąg def'n sekcja: Wybierz - Skrypt potoku z SCM—> wybierz git—> addRepository URL—> dodaj poświadczenia git -> wybierz zaawansowane -> dodaj Nazwa pochodzenia, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev jest gałęzią github) -> Gałęzie do zbudowania - $ {SBRANCH} (Nazwa parametru od 1. punktu) -> Ścieżka skryptu—> Jenkinsfile—> Odznacz Lightweightcheckout
  5. Zastosuj—> zapisz


0

Moje rozwiązanie dla lokalnego serwera git: przejdź do katalogu lokalnego serwera git, zignoruj ​​istniejącą aktualizację.sample i utwórz nowy plik o nazwie dosłownie „aktualizacja”, taki jak:

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$ 

Instrukcja echo zostanie wyświetlona pod wynikiem git push, token można pobrać z konfiguracji zadania jenkins, przeglądaj, aby go znaleźć. Jeśli plik „aktualizacja” nie jest wywoływany, wypróbuj inne pliki o tej samej nazwie bez rozszerzenia „sample”.

To wszystko czego potrzebujesz

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.