it-swarm.com.de

So konfigurieren Sie den Git-Post-Commit-Hook

Wie starte ich einen Build von Jenkins aus?
Wie konfiguriere ich den Git Post Commit Hook?

Meine Anforderung ist, wann immer Änderungen im Git-Repository für ein bestimmtes Projekt vorgenommen werden, automatisch Jenkins Build für dieses Projekt zu starten.

In Jenkins Trigger Build Sektion habe ich Trigger Build Remote ausgewählt.
Im .git Verzeichnis, Hooks-Verzeichnis ist da, in dem wir die Post-Commit-Datei konfigurieren müssen.
Ich bin verwirrend, wie man von dort aus einen Build auslöst (ich weiß, dass wir zum Teil den Befehl curl verwenden sollten).


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

Ich habe diesen Befehl in meinem Git-Server-Hook-Verzeichnis abgelegt (Post-Commit-Hook).
Jedes Mal, wenn die Änderungen im Repository vorgenommen werden, wird die automatische Erstellung ausgeführt.

Ich möchte im Changeset prüfen, ob in mindestens einer Java Datei der Build gestartet werden soll.
Angenommen, die Entwickler haben nur XML-Dateien oder Eigenschaftendateien geändert, die vom Build nicht gestartet werden sollen.
Stellen Sie sich zusammen mit xml das .Java files ist dort, wo der Build beginnen soll.

119
phanikumar Raja

Wie unter " Abfrage muss sterben: Jenkins-Builds auslösen von einem Git-Hook " erwähnt, können Sie Jenkins über ein neues Commit benachrichtigen:

Mit dem neuesten Git-Plugin 1.1.14 (das ich gerade veröffentliche) können Sie dies jetzt einfacher tun, indem Sie einfach den folgenden Befehl ausführen:

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

Dadurch werden alle Jobs gescannt, die zum Auschecken der angegebenen URL konfiguriert sind. Wenn sie auch mit Polling konfiguriert sind, wird das Polling sofort ausgelöst (und wenn dabei eine Änderung gefunden wird, die einen Build wert ist, wird wiederum ein Build ausgelöst. )

Dies ermöglicht, dass ein Skript gleich bleibt, wenn Jobs in Jenkins ein- und ausgehen.
Oder wenn Sie mehrere Repositorys unter einer einzelnen Repository-Host-Anwendung (wie Gitosis) haben, können Sie ein einzelnes Post-Receive-Hook-Skript für alle Repositorys freigeben. Schließlich erfordert diese URL auch für gesicherte Jenkins keine Authentifizierung, da der Server nichts verwendet, was der Client sendet. Es wird eine Abfrage ausgeführt, um zu überprüfen, ob eine Änderung vorliegt, bevor ein Build gestartet wird.

Stellen Sie als hier erwähnt sicher, dass Sie die richtige Adresse für Ihren Jenkins-Server verwenden:

da wir Jenkins als eigenständigen Webserver auf Port 8080 ausführen, sollte die URL ohne den /jenkins lauten:

http://jenkins:8080/git/[email protected]:tools/common.git

Um diesen letzten Punkt zu verstärken, fügt pthain den Kommentaren hinzu:

Es mag offensichtlich sein, aber ich hatte Probleme mit:

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

Der Parameter url sollte genau mit Ihrer Repository-URL übereinstimmen Jenkins Job.
Beim Kopieren von Beispielen habe ich das Protokoll ausgelassen, in unserem Fall ssh://, Und es hat nicht funktioniert.


Sie können auch einen einfachen Post-Receive-Hook wie in " Push-basierte Builds mit Jenkins und GIT " verwenden.

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

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

Konfigurieren Sie Ihren Jenkins-Job so, dass "Builds remote auslösen" und ein Authentifizierungstoken (in diesem Beispiel 1qaz2wsx) Verwendet werden kann.

Dies ist jedoch ein projektspezifisches Skript, und der Autor nennt eine Möglichkeit, es zu verallgemeinern.
Die erste Lösung ist einfacher, da sie nicht von der Authentifizierung oder einem bestimmten Projekt abhängt.


Ich möchte beim einchecken festlegen, ob mindestens eine Java Datei vorhanden ist, die der Build starten soll.
Angenommen, die Entwickler haben nur XML-Dateien oder Eigenschaftendateien geändert, dann sollte der Build nicht gestartet werden.

Grundsätzlich kann Ihr Build-Skript:

  • schreiben Sie beim ersten Aufruf eine 'Build'-Notiz (siehe git notes )
  • greifen Sie bei den nachfolgenden Aufrufen die Liste der Festschreibungen zwischen HEAD Ihres Zweigstellenkandidaten für den Build und der Festschreibung ab, auf die durch den git notes 'build' (git show refs/notes/build) verwiesen wird: git diff --name-only SHA_build HEAD.
  • ihr Skript kann diese Liste analysieren und entscheiden, ob der Build fortgesetzt werden soll.
  • erstellen/verschieben Sie in jedem Fall Ihren git notes 'build' nach HEAD.

Mai 2016: cwhs weist auf in den Kommentaren die folgende mögliche URL hin:

sie könnten einfach curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN verwenden, wenn Sie die Triggerkonfiguration in Ihrem Artikel festlegen

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


Juni 2016, polaretto weist darauf hin in den Kommentaren :

Ich wollte hinzufügen, dass Sie mit ein wenig Shell-Skripting die manuelle URL-Konfiguration vermeiden können, insbesondere wenn Sie viele Repositorys in einem gemeinsamen Verzeichnis haben.
Zum Beispiel habe ich diese Parametererweiterungen verwendet, um den Reponamen zu erhalten

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

und benutze es dann wie folgt:

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

Hoffe, das hilft: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Es ist nur eine Frage der Verwendung von curl, um einen Jenkins-Job mit den von git bereitgestellten Git-Hooks auszulösen.
Der Befehl

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

kann einen Jenkins-Job ausführen, wobei someJob der Name des Jenkins-Jobs ist.

Suchen Sie in Ihrem versteckten .git-Ordner nach dem Ordner hooks. Benenne das post-commit.sample Datei an post-commit. Öffne es mit Notepad, entferne das : Nothing Zeile und fügen Sie den obigen Befehl ein.

Das ist es. Bei jedem Commit löst Git die in der Datei definierten Post-Commit-Befehle aus.

16
Nav

Wie die vorherige Antwort gezeigt hat, sieht der vollständige Hook wie folgt aus:

#!/usr/bin/python

import sys
from subprocess import call

if __== '__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://[email protected]/var/git/repo.git"])

In diesem Fall löse ich Jenkins-Jobs nur aus, wenn ich zum Master schiebe, und nicht zu anderen Zweigen.

3
Zitrax

Ich möchte zu den obigen Antworten hinzufügen, dass es etwas schwieriger wird, wenn die Jenkins-Autorisierung aktiviert ist.

Nach dem Aktivieren erhalte ich eine Fehlermeldung, dass ein anonymer Benutzer eine Leseberechtigung benötigt.

Ich sah zwei mögliche Lösungen:

1: Ändern Sie meinen Haken auf:

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

2: Projektbasierte Autorisierung festlegen.

Die früheren Lösungen haben den Nachteil, dass ich mein passwd in der Hook-Datei verfügbar machen musste. In meinem Fall nicht akzeptabel.

Der zweite funktioniert bei mir. In den globalen Auth-Einstellungen musste ich Overall> Read for Anonymous User aktivieren. In dem Projekt, das ich auslösen wollte, musste ich Job> Build und Job> Read for Anonymous aktivieren.

Dies ist immer noch keine perfekte Lösung, da Sie das Projekt jetzt in Jenkins ohne Anmeldung sehen können. Es könnte eine noch bessere Lösung geben, die den früheren Ansatz mit http login verwendet, aber ich habe es nicht herausgefunden.

3
anhoppe