Hoe Git Post Concurt haak configureren

Hoe een build op afstand van Jenkins te activeren?
Hoe Git Post Concurt Hook configureren?

Mijn vereiste is wanneer wijzigingen worden aangebracht in de git-repository voor een bepaald project, start het automatisch Jenkins build voor dat project.

In Jenkins trigger build sectie Ik heb op afstand getrouwde trigger gebouwd.
In .gitDirectory, Hooks Directory is er in dat we POST COMMIT-bestand moeten configureren.
Ik verwarring hoe je een build van daar kunt triggeren (ik ken een deel dat we Curl Command moeten gebruiken).


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

Ik heb deze opdracht geplaatst in mijn Git Server Hooks Directory (Post Commit Hook).
Telkens wanneer de wijzigingen gebeuren in de repository, wordt het uitgevoerd automatiseer.

Ik wil inchecken inchecken inchecken of in ten minste één Java-bestand is, de build zou moeten beginnen.
Stel dat de ontwikkelaars alleen XML-bestanden of vastgoedbestanden hebben gewijzigd, zou de build niet moeten beginnen.
Samen met xml, stel dat de .javabestanden er is, de build moet beginnen.


Antwoord 1, Autoriteit 100%

Zoals vermeld in “Polling moet sterven: triggeren Jenkins builds van een Git Hook “, kun je Jenkins van een nieuwe commit op de hoogte brengen van:

Met de nieuwste git plugin 1.1.14 (dat ik gewoon Laat nu vrijblijvend), je kunt dit nu meer doen en gt; gemakkelijk door eenvoudig de volgende opdracht uit te voeren:

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

Hierdoor wordt alle taken gescand die zijn geconfigureerd om de opgegeven URL te bekijken, en als ze ook worden geconfigureerd met polling, triggeert het onmiddellijk de polling (en als dat een verandering voor een build vindt, wordt een build geactiveerd op zijn beurt.)

Hierdoor kan een script hetzelfde blijven wanneer banen komen en in Jenkins gaan.
Of als u meerdere repositories heeft onder een enkele repository host-applicatie (zoals Gitose), kunt u een haakscript na ontvangst delen met alle repositories. Ten slotte heeft deze URL zelfs geen authenticatie nodig, zelfs voor beveiligde Jenkins, omdat de server niet direct iets wordt gebruikt dat de client verzendt. Het loopt polling om te verifiëren dat er een verandering is, voordat het daadwerkelijk een build begint.

Zoals hier vermeld Zorg ervoor dat u het juiste adres voor uw Jenkins-server gebruikt:

Sinds we Jenkins gebruiken als stand-alone webserver op poort 8080 had de URL zonder de /jenkinszijn geweest, zoals deze:

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

Om dat laatste punt te versterken, ptha voegt In de opmerkingen :

Het kan duidelijk zijn, maar ik had problemen met:

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

De parameter URL moet precies overeenkomen met wat u hebt in Repository URL van uw Jenkins-taak.
Bij het kopiëren van voorbeelden heeft ik het protocol achtergelaten, in ons geval ssh://, en het werkte niet.


U kunt ook een eenvoudige post-ontvangsthaak gebruiken zoals in “Push Based Builds met behulp van Jenkins en Git

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \
http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Configureer uw Jenkins-taak om ‘builds op afstand te kunnen triggeren’ en gebruik een authenticatietoken (1qaz2wsxin dit voorbeeld).

Dit is echter een projectspecifiek script en de auteur noemt een manier om het te generaliseren.
De eerste oplossing is eenvoudiger omdat deze niet afhankelijk is van authenticatie of een specifiek project.


Ik wil in de wijzigingsset controleren of er ten minste één java-bestand aanwezig is en de build zou moeten beginnen.
Stel dat de ontwikkelaars alleen XML-bestanden of eigenschapsbestanden hebben gewijzigd, dan zou de build niet moeten beginnen.

In principe kan uw buildscript:

  • plaats een ‘build’-notities (zie git notes) bij de eerste oproep
  • neem bij de volgende aanroepen de lijst met commits tussen HEADvan je branchkandidaat voor build en de commit waarnaar wordt verwezen door de git notes‘build’ (git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • uw script kan die lijst ontleden en beslissen of het verder moet gaan met de build.
  • maak/verplaats in ieder geval je git notesbuild‘ naar HEAD.

Mei 2016: cwhsuwijst op in de opmerkingende volgende mogelijke url:

je zou gewoon curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENkunnen gebruiken als je de triggerconfiguratie in je item instelt


Juni 2016, polarettowijst op in de reacties:

Ik wilde hieraan toevoegen dat je met slechts een klein beetje shellscripting handmatige URL-configuratie kunt vermijden, vooral als je veel repositories onder een gemeenschappelijke map hebt.
Ik heb bijvoorbeeld deze parameteruitbreidingen gebruikt om de repo-naam te krijgen

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

en gebruik het dan als volgt:

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

Antwoord 2, autoriteit 11%

Ik hoop dat dit helpt: http: //nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Het is gewoon een kwestie van curlgebruiken om een ​​Jenkins-taak te activeren met behulp van de git-hooks die door git worden geleverd.
Het commando

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

kan een Jenkins-taak uitvoeren, waarbij someJobde naam is van de Jenkins-taak.

Zoek naar de map hooksin je verborgen .git-map. Hernoem het bestand post-commit.samplenaar post-commit. Open het met Kladblok, verwijder de regel : Nothingen plak het bovenstaande commando erin.

Dat is het. Telkens wanneer je een commit doet, zal Git de post-commit commando’s activeren die in het bestand zijn gedefinieerd.


Antwoord 3, autoriteit 2%

Zoals het vorige antwoord een voorbeeld liet zien van hoe de volledige hook eruit zou kunnen zien, is hier de code van mijn werkende post-receive hook:

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

In dit geval activeer ik jenkins-taken alleen wanneer ik push naar master en niet naar andere branches.


Antwoord 4, autoriteit 2%

Ik wil aan de bovenstaande antwoorden toevoegen dat het een beetje moeilijker wordt als Jenkins-autorisatie is ingeschakeld.

Na het inschakelen kreeg ik een foutmelding dat de anonieme gebruiker leesrechten nodig heeft.

Ik zag twee mogelijke oplossingen:

1: Mijn hook veranderen in:

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

2: autorisatie op projectbasis instellen.

De vorige oplossingen hebben het nadeel dat ik mijn passwd in het hook-bestand moest blootleggen. In mijn geval onaanvaardbaar.

De tweede werkt voor mij. In de algemene auth-instellingen moest ik Algehele>Lezen voor anonieme gebruiker inschakelen. In het project dat ik wilde activeren, moest ik Job>Build en Job>Read for Anonymous inschakelen.

Dit is nog steeds geen perfecte oplossing, want nu kun je het project in Jenkins zien zonder in te loggen. Er is misschien een nog betere oplossing met de vorige benadering met http-login, maar ik ben er nog niet achter.

Other episodes