Come configurare Git post commit hook


126

Come attivare una build in remoto da Jenkins?
Come configurare Git post commit hook?

Il mio requisito è ogni volta che vengono apportate modifiche nel repository Git per un particolare progetto che avvierà automaticamente la build di Jenkins per quel progetto.

Nella sezione build trigger di Jenkins ho selezionato la generazione trigger in remoto.
Nella .gitdirectory, la directory hooks è lì in quanto dobbiamo configurare il file post commit.
Sto confondendo come innescare una build da lì (conosco alcune parti che dovremmo usare il comando curl).


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

Ho inserito questo comando nella mia directory hooks git server (post commit hook).
Ogni volta che le modifiche si verificano nel repository, è in esecuzione automate build.

Voglio controllare nel changeset se in almeno un file java c'è la build dovrebbe iniziare.
Supponiamo che gli sviluppatori abbiano modificato solo i file xml o i file delle proprietà che la build non deve iniziare.
Assieme a xml, supponiamo che i .javafile siano lì dovrebbe iniziare la compilazione.


Ho modificato la mia risposta per rispondere alla seconda parte della tua domanda.
VonC,

Risposte:


164

Come menzionato in "Il polling deve morire: innescare build Jenkins da un hook git ", è possibile informare Jenkins di un nuovo commit:

Con l'ultimo plugin Git 1.1.14 (che ho appena rilasciato ora), ora puoi farlo di più> facilmente semplicemente eseguendo il seguente comando:

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

Questo eseguirà la scansione di tutti i lavori configurati per verificare l'URL specificato e, se sono anche configurati con il polling, attiverà immediatamente il polling (e se trova una modifica degna di una build, una build verrà attivata a sua volta. )

Ciò consente a una sceneggiatura di rimanere la stessa quando i lavori vanno e vengono in Jenkins.
Oppure, se si dispone di più repository in un'unica applicazione host di repository (come Gitosis), è possibile condividere un singolo script hook post-ricezione con tutti i repository. Infine, questo URL non richiede autenticazione anche per Jenkins sicuro, poiché il server non utilizza direttamente tutto ciò che il client sta inviando. Esegue il polling per verificare la presenza di una modifica, prima che inizi effettivamente una generazione.

Come menzionato qui , assicurati di utilizzare l'indirizzo giusto per il tuo server Jenkins:

poiché stiamo eseguendo Jenkins come server Web standalone sulla porta 8080, l'URL avrebbe dovuto essere privo di /jenkins, in questo modo:

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

Per rafforzare l'ultimo punto, ptha aggiunge nei commenti :

Può essere ovvio, ma ho avuto problemi con:

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

Il parametro url deve corrispondere esattamente a quello che hai nell'URL del repository del tuo lavoro Jenkins.
Quando ho copiato degli esempi ho lasciato fuori il protocollo, nel nostro caso ssh://, e non ha funzionato.


Puoi anche usare un semplice hook post-ricezione come in " Build basati su push usando Jenkins e GIT "

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

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

Configurare il lavoro Jenkins per essere in grado di "Attivare build in remoto" e utilizzare un token di autenticazione ( 1qaz2wsxin questo esempio).

Tuttavia, questo è uno script specifico del progetto e l'autore menziona un modo per generalizzarlo.
La prima soluzione è più semplice in quanto non dipende dall'autenticazione o da un progetto specifico.


Voglio controllare il set di modifiche se almeno un file java è lì, la build dovrebbe iniziare.
Supponiamo che gli sviluppatori abbiano modificato solo i file XML o i file delle proprietà, quindi la generazione non dovrebbe iniziare.

Fondamentalmente, il tuo script di build può:

  • metti un "build" note (vedi git notes) alla prima chiamata
  • sulle chiamate successive, afferrare l'elenco dei commit tra HEADdi vostro candidato ramo per costruire e il commit fa riferimento il git notes'build' ( git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • lo script può analizzare tale elenco e decidere se deve continuare con la build.
  • in ogni caso, crea / sposta il tuo git notes' build' in HEAD.

Maggio 2016: cwhsu sottolinea nei commenti il seguente url possibile:

potresti usarlo solo curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENse imposti la configurazione trigger nel tuo oggetto

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


Giugno 2016, polaretto sottolinea nei commenti :

Volevo aggiungere che con solo un po 'di scripting della shell puoi evitare la configurazione manuale dell'URL, specialmente se hai molti repository in una directory comune.
Ad esempio ho usato queste espansioni di parametri per ottenere il nome del repository

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

e poi usalo come:

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

ciao von come hai detto alla prima chiamata devo mettere un build notes.la mia prima chiamata è leggere il file .java ogni volta che lo sviluppatore inserisce le modifiche in git repo. Sono nuovo di tutte queste cose, ecco perché sto chiedendo ogni singolo passo. per favore non importa e devo completare questo compito.
phanikumar Raja,

Questo è molto utile per me. Ho scritto Git hook con l'aiuto di questo argomento. Grazie ragazzi!
Kirill Bazarov,

Ho dovuto aggiungere la chiamata curl al file post-ricezione, che non è del tutto chiaro da questa risposta. Molto utile comunque!
Magnilex,

1
@IgorGanapolsky nella cartella hooks del tuo repository nudo che sta ricevendo commit e che deve chiamare jenkins:yourRepo.git/hooks/post-receive
VonC

2
Potrebbe essere ovvio, ma ho avuto problemi con: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Il parametro url deve corrispondere esattamente a quello che hai nell'URL del repository del tuo lavoro Jenkins. Quando ho copiato degli esempi ho lasciato fuori il protocollo, nel nostro caso ssh: // e non ha funzionato.
ptha,

17

Spero che questo aiuti: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

Si tratta solo di usare curlper innescare un lavoro Jenkins usando i git hook forniti da git.
Il comando

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

può eseguire un lavoro Jenkins, dove si someJobtrova il nome del lavoro Jenkins.

Cerca la hookscartella nella cartella nascosta .git. Rinomina il post-commit.samplefile in post-commit. Aprilo con Blocco note, rimuovi la : Nothinglinea e incolla il comando sopra.

Questo è tutto. Ogni volta che esegui un commit, Git attiverà i comandi post-commit definiti nel file.


Dopo aver eseguito il commit dalla macchina di sviluppo, viene chiamato post-ricezione, non post-commit. Verificato inserendo le istruzioni di registro in entrambi gli hook. Sto leggendo i documenti in modo errato, non dovrebbe essere post-commit che viene chiamato?
Shirish Hirekodi,

@Shirish: è strano. Forse stai facendo qualcosa di diverso
Nav

questo viene compilato correttamente quando ho eseguito il push dell'ultima modifica del commit, ma non quando ho eseguito il commit delle modifiche ... ???

3

Come la risposta precedente ha mostrato un esempio di come potrebbe apparire l'hook completo qui è il codice del mio hook post-ricezione funzionante:

#!/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 questo caso, innesco i lavori di jenkins solo quando spingo verso il master e non altri rami.


1
Come leghi questo script Python a Jenkins? O lo esegui solo una volta?
IgorGanapolsky,

Jenkins non è a conoscenza di questo hook, la parte principale sta caricando l'url notificationCommit sul server jenkins che attiverà un sondaggio. Penso che il polling sia abilitato ma senza un programma sul lato jenkins.
Zitrax,

Quindi dove risiede questo script Python? Suppongo che lo
colleghi

1
Risposta in ritardo - ma la posizione dello script sarebbe sul server git in hook / post-ricezione. Leggi su git hook per saperne di più.
Zitrax,

3

Voglio aggiungere alle risposte sopra che diventa un po 'più difficile se l'autorizzazione di Jenkins è abilitata.

Dopo averlo abilitato, ho ricevuto un messaggio di errore in cui l'utente anonimo necessita dell'autorizzazione in lettura.

Ho visto due possibili soluzioni:

1: cambiando il mio gancio in:

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

2: impostazione dell'autorizzazione basata sul progetto.

Le prime soluzioni hanno lo svantaggio che ho dovuto esporre il mio passwd nel file hook. Inaccettabile nel mio caso.

Il secondo funziona per me. Nelle impostazioni di autenticazione globale ho dovuto abilitare Generale> Leggi per utente anonimo. Nel progetto che volevo attivare, dovevo abilitare Job> Build and Job> Leggi per Anonimo.

Questa non è ancora una soluzione perfetta perché ora puoi vedere il progetto in Jenkins senza effettuare l'accesso. Potrebbe esserci una soluzione ancora migliore usando il precedente approccio con http login ma non l'ho capito.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.