Wie kann ich Jenkins CI mit Git-Trigger bei Pushs zum Master machen?


205

Ich versuche, Jenkins-ci für ein Projekt mit GitHub einzurichten. Ich habe Jenkins bereits mit den entsprechenden Plugins eingerichtet. Ich möchte, dass Jenkins Build-Skripte nur dann ausführt, wenn jemand im Projekt zum Master drängt. Bisher konnte ich es so einrichten, dass ein Build immer dann ausgelöst wird, wenn jemand irgendwohin pusht, aber das ist zu weit gefasst. Ich habe dies mit Post-Receive-Service-Hooks auf Git gemacht.

Ich habe das Jenkins-Wiki und einige Tutorials gelesen, aber dieses spezielle Detail fehlt ... hat es vielleicht etwas mit Umfragen zu tun? Oder sollte auf der Git-Seite gearbeitet werden, damit Git Jenkins nur auslöst, wenn masteres geändert wird?


3
Der ursprüngliche Autor von Jenkins, Kohsuke Kawaguchi, beschreibt, wie Push-Benachrichtigungen aus dem Repository mithilfe des Git-Plugins Git-Plugin 1.1.14 ausgeführt werden. Siehe kohsuke.org/2011/12/01/…
GeraldScott

Antworten:


190

Wie bereits von gezzed in seinem Kommentar erwähnt, gibt es mittlerweile eine gute Lösung (beschrieben in Polling muss sterben: Auslösen von Jenkins-Builds über einen Git-Hook ):

  • Legen Sie die Build - Triggers Jenkins Job Poll SCM , aber nicht einen Zeitplan festlegen.

  • Erstellen Sie einen GitHub-Trigger nach dem Empfang, um die URL zu benachrichtigen

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Dies löst alle Builds aus, die das angegebene Git-Repository abfragen.

  • Bei der Abfrage wird jedoch tatsächlich geprüft, ob etwas in den verwendeten Zweig verschoben wurde.

Es funktioniert perfekt.


1
Dies hat auch für mich hervorragend funktioniert. Sie können den gleichen Ansatz mit einer lokalen Installation verwenden: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith

4
Funktioniert auch mit dem POST-Hook von Bitbucket (nicht mit Jenkins). Um Anmeldeinformationen für die Authentifizierung anzugeben, können Sie den Benutzer verwenden: password@my.ci.server/git/notifyCommit? Url = ... als URL.
Loevborg

Kann es so konfiguriert werden, dass Jenkins nur die Bibliotheken / Projekte erstellt, die vom letzten Push zum Repo betroffen sind? Bauen Sie nicht die ganze Niederlassung wieder auf?
Croolman

Können Sie diesen Teil klarstellen? "Erstellen Sie einen Github-Post-Receive-Trigger, um die URL zu benachrichtigen"
Dewwwald

Ich gehe davon aus, dass Github in der Lage sein muss, Ihre Jenkins-Instanz zu erreichen, was bedeutet, dass sie öffentlich zugänglich sein muss. Ist es möglich, dies mit einem nicht öffentlichen Jenkins-Server zum Laufen zu bringen?
A. Murray

33

Ab Version 0.5 kann das GitHub-Plugin für Jenkins einen Build auslösen, wenn eine Änderung an GitHub übertragen wird .


23
@asveikau - Die ursprüngliche Frage betraf Github.
docwhat

Dies ist keine gute Lösung, da der Build unabhängig davon ausgelöst wird, welcher Zweig verschoben wurde.
Shannon

Tatsächlich sieht es so aus, als würde es dem Verzweigungsspezifizierer in den Einstellungen des Git-Plugins gehorchen, wenn Sie "Poll SCM" aktivieren (kein Zeitplan erforderlich).
Shannon

1
Dies mag zwar zutreffen, löst den Build jedoch immer noch falsch aus, wenn kein Arbeitsbereich vorhanden ist ("Arbeitsbereich ist offline. Planen eines neuen Builds zum Abrufen eines Arbeitsbereichs. (Nicht vorhandener Arbeitsbereich) Fertig. 0 ms vorgenommene Änderungen"). Siehe auch issue.jenkins-ci.org/browse/JENKINS-18079
Shannon

Das GitHub-Plugin listet das Git-Plugin als Abhängigkeit auf . Das Wiki sagt "Wenn Sie einen Job erstellen, geben Sie die URL unter" Github-Projekt "an und wählen Sie die Git-URL unter" Quellcodeverwaltung "aus. Es heißt" Dieser Trigger kickt nur das interne Polling-Algo des Git-Plugins für jedes eingehende Ereignis gegen ein übereinstimmendes Repo. "I. Ich denke, das bedeutet, dass das Poll SCM in der akzeptierten Antwort ziemlich gut funktioniert, aber es hat Optionen zum automatischen Einrichten des Webhooks und einige andere Funktionen.
Dosentmatter

9

Anstatt Builds remote auszulösen , ändern Sie Ihre Jenkins-Projektkonfiguration so, dass Builds durch Abfragen ausgelöst werden.

Jenkins kann basierend auf einer festen internen oder einer URL abfragen. Letzteres möchten Sie Builds überspringen, wenn für diesen Zweig keine Änderungen vorgenommen wurden. Die genauen Details finden Sie in der Dokumentation . Im Wesentlichen müssen Sie nur die Option "SCM abrufen" aktivieren, den Zeitplanabschnitt leer lassen und eine Remote-URL festlegen, um JENKINS_URL / job / name / polling zu treffen.

Ein Problem, wenn Sie eine gesicherte Jenkins-Umgebung haben, ist anders /build, die /pollingURL erfordert eine Authentifizierung. Die Anweisungen hier enthalten Details. Zum Beispiel habe ich einen GitHub Post-Receive-Hook username:apiToken@JENKIS_URL/job/name/polling.


8

Führen Sie für GitLab die folgenden Schritte aus:

  1. Gehen Sie zu den Einstellungen Ihres Projekts → Web-Hooks
  2. Geben Sie die URL "Jetzt erstellen" aus Ihrem Jenkins-Projekt als Push-Ereignis-URL ein:

    http://server.com/jenkins/job/project_name/build?delay=0sec beispielsweise

  3. Klicken Sie auf Add Web Hookund danntest hook

Jedes Mal, wenn Sie sich für das Repository festlegen, wird der Web-Hook ausgelöst und ein Build erstellt. Stellen Sie sicher, dass Ihr Jenkins-Arbeitsbereich delete workspace before each buildso eingestellt ist, dass Sie eine neue Kopie des neuen Codes erhalten.


2
Wie lösen Sie das Problem bei der Frage, ob Sie gerade beim Push-on-Master-Zweig bauen möchten?
Custodio

4

Nicht mit Git verwandt, aber unten werde ich bei der Jenkins-Jobkonfiguration im Detail mit Mercurial helfen. Es kann anderen mit einem ähnlichen Problem helfen.

  1. Installieren Sie das URL Trigger Plugin
  2. Gehen Sie zur Jobkonfigurationsseite und wählen Sie die Poll SCMOption. Stellen Sie den Wert auf ein* * * * *
  3. Aktivieren Sie die Option : [URLTrigger] - Poll with a URL. Jetzt können Sie einige Optionen wie Änderung des Änderungsdatums, URL-Inhalt usw. auswählen.
  4. Wählen Sie in den Optionen die Option URL-Inhalt ändern, wählen Sie die erste Option - Monitor change of content
  5. Speichern Sie die Änderungen.

Lösen Sie jetzt durch einige Test-Check-Ins eine Änderung am Mercurial-Repository aus.

Stellen Sie sicher, dass der Jenkins-Job jetzt ausgeführt wird, indem Sie die SCM-Änderungen erkennen. Wenn der Build aufgrund von Mercurial-Änderungen ausgeführt wird, wird Text angezeigt Started by an SCM change. Andernfalls der Benutzer, der es manuell gestartet hat.


3

Ich hoffe das hilft: Wie man einen Jenkins Build auf Git Commit auslöst

Es ist nur eine Frage der Verwendung von Curl, um einen Jenkins-Job mithilfe der von Git bereitgestellten Git-Hooks auszulösen.

Der Befehl curl http://localhost:8080/job/someJob/build?delay=0seckann einen Jenkins-Job ausführen, wobei someJobder Name des Jenkins-Jobs lautet.

Suchen Sie in Ihrem versteckten .git-Ordner nach dem Ordner "hooks". Benennen Sie die Datei "post-commit.sample" in "post-commit" um. Öffnen Sie es mit Notepad, entfernen Sie die Zeile ": Nothing" und fügen Sie den obigen Befehl ein.

Das ist es. Immer wenn Sie ein Commit durchführen, löst Git die in der Datei definierten Post-Commit-Befehle aus.


Ich war hier zunächst mit Ihrem Kommentar verwechselt, weil ich dachte, ich müsste den "Job" in der obigen URL in einen Jobnamen ändern. Ich war auch verwirrt, weil ich beim Drücken von "New Item" in Jenkins ein "Project" eingerichtet habe, kein Job. Als Sie oben auf "someJob" verwiesen haben, wusste ich nicht, dass dies der Name meines Projekts ist. Ich habe endlich die URL herausgefunden, die ich brauchte: localhost: 8078 / job / codecept% 20tests / build wobei "codecept% 20tests" der Name meines Projekts war. Vielen Dank für Ihre Lösung
Paul Preibisch

1
Danke Paul. Ich habe den Blog-Beitrag mit einem zusätzlichen Hinweis aktualisiert, in dem Ihre Lösung erwähnt wird. Die "% 20" sind besonders für andere hilfreich.
Nav

3

Kontinuierliche Integration mit Jenkins, nachdem der Code vom Git-Befehl / der GUI in das Repository verschoben wurde:

  1. Erstellen Sie einen Job in Jenkins nur mit dem Jobnamen und wählen Sie den Typ des Projekt-Freestyles aus. Klicken Sie auf OK. Die nächste Seite fügt nichts hinzu - klicken Sie einfachSave .
  2. Gehen Sie zu Ihrem lokalen Git-Repository, in dem Sie den Quellcode haben, und navigieren Sie zu .git/hooks Ordner.
  3. Der hooksOrdner enthält die wenigen Dateien. Überprüfen Sie das "Post-Commit". Wenn nicht vorhanden, erstellen Sie eine Datei "post-commit" ohne Dateierweiterung:

    C:\work\test\\.git\hooks\post-commit
    
  4. Bearbeiten Sie die "Post-Commit" -Datei mit dem folgenden Befehl. Stellen Sie sicher, dass es in Ihrem lokalen Quellcode-Hooks-Ordner vorhanden ist.

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

    Beispiel:

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

    5.

    userName: Jenkins Benutzername

    jobName: Jobname des Builds

    apiToken: Um Ihr API-Token zu erhalten, rufen Sie Ihre Jenkins-Benutzerseite auf (oben rechts in der Benutzeroberfläche). Es ist im Menü "Konfigurieren" links auf der Seite verfügbar: "API-Token anzeigen"

  5. Nehmen Sie Änderungen an Ihrem Quellcode vor und übergeben Sie den Code an das Repository.

  6. Ihr Job http://localhost:8080/jenkins/job/Gitcommittest/sollte das Bauen sein.


3

Sie müssen den Zweig angeben. Standardmäßig hört es alles. Siehe den Blog-Beitrag Hudson: Git and Maven Plugins .


Ich habe Jenkins kürzlich bei der Arbeit eingerichtet, um Änderungen von git in einem bestimmten Zweig abzurufen. Funktioniert gut. +1
Greg K

Ich habe diese Einstellung auch eingestellt. Was mir auffällt, ist, dass Jenkins über jeden Push an Github benachrichtigt wird und darauf reagiert, aber die Build-Schritte nur ausführt, wenn sich der Zweigmaster geändert hat. Wir erhalten also eine Menge falscher Build-Berichte mit der Aufschrift "No Changes". Beobachten Sie dieses Verhalten auch?
Ziggy

Die ursprüngliche Frage betrifft die Lösung des in Ihrer Antwort konfigurierten breiten und unnötigen Auslösers (Auslösen, wenn jemand auf einen Zweig drückt). Wenn Sie 5 Jenkins-Jobs mit derselben Konfiguration haben, mit der Ausnahme, dass der erste Job-Listen-Master-Zweig, der zweite der Entwicklungszweig, der dritte der FeatureX-Zweig usw., wenn Sie nur auf den FeatureX-Zweig drücken, werden alle Jenkins-Jobs ausgelöst, was dazu führt Arbeitsüberlastung mit Builds sehr langsam.
Geoom

2

Das generische Webhook Trigger Plugin kann mit Filtern konfiguriert werden, um dies zu erreichen.

Bei Konfiguration mit

  • Eine Variable mit dem Namen refund Ausdruck $.ref.
  • Ein Filter mit Text $refund Filterausdruck wie ^refs/heads/master$.

Dann wird dieser Job bei jedem Push an ausgelöst master . Keine Abstimmung.

Sie möchten wahrscheinlich mehr Werte aus dem Webhook, um den Build tatsächlich auszuführen. Fügen Sie mit JSONPath einfach weitere Variablen hinzu, um auszuwählen, was Sie benötigen.

Hier gibt es einige Anwendungsfälle: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


Was ist "Achi" ?
Peter Mortensen

Es ist / war ein Rechtschreibfehler.
Tomas Bjerre

Wie greift man nach dem $ GITCOMMIT in Jenkins? Mit einem Webhook scheint es immer null zu sein. Der Status kann dann nicht zurückgesendet werden, um Erfolg oder Misserfolg anzuzeigen.
user3520245

1

In meiner aktuellen Organisation tun wir dies nicht in Master, sondern sowohl in Develop als auch in Release / Branch (wir verwenden Git Flow), um Snapshot-Builds zu generieren.

Da wir eine Multi-Branch-Pipeline verwenden, tun wir dies in der Jenkins-Datei mit der when {} -Syntax ...

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

Dies wird in diesem Blog-Beitrag detailliert beschrieben: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

Die obigen Antworten sind richtig, aber ich spreche sie an, die wegen ihrer Einfachheit Neulinge hier sind

speziell zum Setzen des Build-Triggers für die Pipeline:

Angenommen, Sie haben zwei Github-Zweige: 1.master, 2.dev und Jenkinsfile (wo das Pipeline-Skript geschrieben ist) und andere Dateien sind in jedem Zweig verfügbar

Neues Pipeline-Projekt konfigurieren (für Entwicklungszweig)

## 1.Code-Integration mit Git-Plugin und Cron-basiertem Ansatz Das vorausgesetzte Git-Plugin sollte installiert sein und mit Ihrem Namen und Ihrer E-Mail- Adresse konfiguriert werden

  1. Allgemeiner Abschnitt. Aktivieren Sie das Kontrollkästchen - 'Dieses Projekt ist parametrisiert' und fügen Sie Name-SBRANCH-Standardwert -refs / remotes / origin / dev hinzu.
  2. Abschnitt "Trigger erstellen" Aktivieren Sie das Kontrollkästchen - "SCM abfragen" und planen Sie nach Bedarf, ob Commits überprüft werden sollen, z. B. "* / 1 * * * *", um jede Minute zu überprüfen
  3. Abschnitt zur Pipeline-Definition. Wählen Sie - Pipeline-Skript aus SCM -> wählen Sie git -> addRepository URL -> fügen Sie git-Anmeldeinformationen hinzu -> wählen Sie "Erweitert" -> "Name-Ursprung hinzufügen", "RefSpec-" + refs / Heads / dev: refs / remotes / origin / dev '(dev ist Github-Zweig) -> Zu erstellende Zweige - $ {SBRANCH} (Parametername ab Referenzpunkt 1) -> Skriptpfad -> Jenkins-Datei -> Deaktivieren Sie Lightweightcheckout
  4. Übernehmen -> Speichern

## 2.Code-Integration: Github-Plugin und Webhook-Ansatz Voraussetzung Das Github-Plugin muss installiert und der Github-Server konfiguriert sein. Die Verbindung sollte getestet werden, wenn die folgende Konfiguration nicht berücksichtigt wird

Konfigurieren Sie das Github-Plugin mit einem Konto auf Jenkins

GitHub-Abschnitt Fügen Sie einen Github-Server hinzu, wenn keine API-URL vorhanden ist: https://api.github.com Anmeldeinformationen: Hinzufügen von geheimem Text (Klicken Sie auf die Schaltfläche Hinzufügen: Wählen Sie Typ für geheimen Text aus) mit dem Wert Persönliches Zugriffstoken (Generieren Sie ihn aus Ihren Github-Konten -> Einstellungen -> Entwicklereinstellung -> persönliches Zugriffstoken -> Token hinzufügen -> Bereiche überprüfen -> Token kopieren) Verbindung testen -> Überprüfen Sie, ob eine Verbindung zu Ihrem Github-Konto besteht oder nicht Aktivieren Sie das Kontrollkästchen mit Hooks verwalten vorheriger Berechtigungsnachweis für 'gemeinsames Geheimnis'

Fügen Sie einen Webhook hinzu, wenn er nicht von zu Ihrem Repository hinzugefügt wurde

  1. Gehen Sie zu Github Repository-Einstellung -> Webhook hinzufügen -> URL hinzufügen
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Oder wenn Sie nicht über Public_IP verfügen, verwenden Sie ngrok . Installieren, authentifizieren, öffentliche IP-Adresse vom Befehl ./ngrok http 80 abrufen (verwenden Sie Ihren jenkins_port) und dann Webhook hinzufügen -> URL hinzufügen http: // Ngrok_IP / github-webhook /
  3. Testen Sie es, indem Sie Nutzdaten von der Webhook-Seite bereitstellen, und prüfen Sie, ob Sie den Status 200 erhalten oder nicht.

Wenn Sie ein Github Pull-Anforderungs-Plugin haben, konfigurieren Sie es auch mit der veröffentlichten Jenkins-URL.

  1. Allgemeiner Abschnitt. Kontrollkästchen aktivieren - 'Github-Projekt' Projekt-URL hinzufügen - (Github-Link endet mit '.git /')
  2. Allgemeiner Abschnitt. Aktivieren Sie das Kontrollkästchen - 'Dieses Projekt ist parametrisiert' und fügen Sie Name-SBRANCH-Standardwert -refs / remotes / origin / dev hinzu.
  3. Build triggers.section.Check checkbox - 'GitHub-Hook-Trigger für GITScm-Polling'
  4. Abschnitt "Pipeline def'n": Wählen Sie - Pipeline-Skript aus SCM -> wählen Sie "git" -> "addRepository URL" -> fügen Sie git-Anmeldeinformationen hinzu -> wählen Sie "Erweitert" -> "Name-Ursprung hinzufügen", "RefSpec-" + refs / Heads / dev: refs / remotes / origin / dev '(dev ist Github-Zweig) -> Zu erstellende Zweige - $ {SBRANCH} (Parametername ab Punkt 1.) -> Skriptpfad -> Jenkins-Datei -> Deaktivieren Sie Lightweightcheckout
  5. Übernehmen -> Speichern


0

Meine Lösung für einen lokalen Git-Server: Gehen Sie zu Ihrem lokalen Git-Server-Hook-Verzeichnis, ignorieren Sie das vorhandene update.sample und erstellen Sie eine neue Datei mit dem wörtlichen Namen "update", z.

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$ 

Die Echo-Anweisung wird unter Ihrem Git-Push-Ergebnis angezeigt. Das Token kann aus Ihrer Jenkins-Jobkonfiguration entnommen werden. Suchen Sie danach. Wenn die Datei "update" nicht aufgerufen wird, versuchen Sie es mit anderen gleichnamigen Dateien ohne Erweiterung "sample".

Das ist alles was du brauchst

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.