2012-10-09 4 views
101

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

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

Nella sezione di creazione trigger di Jenkins ho selezionato la generazione di trigger da remoto.
Nella directory .git, la directory di hook è lì in cui dobbiamo configurare il file di commit post.
Sto confondendo come attivare una build da lì (conosco una parte dovremmo usare il comando curl).


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

ho messo questo comando nella mia directory ganci del server git (posta commit hook).
Ogni volta che le modifiche si verificano nel repository, è in esecuzione la generazione automatica.

Voglio verificare in changeset se in almeno un file java c'è la generazione dovrebbe iniziare.
Supponendo che gli sviluppatori abbiano modificato solo file xml o file di proprietà, la generazione non dovrebbe iniziare.
Insieme a xml, supponiamo che i file .java siano lì che la generazione dovrebbe iniziare.

+0

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

risposta

125

Come accennato in "Polling must die: triggering Jenkins builds from a git hook", è possibile notificare Jenkins di un nuovo impegno:

Con l'ultima Git plugin 1.1.14 (che ho appena rilascio ora), ora è possibile farlo più> facilmente semplicemente eseguendo il seguente comando:

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

Questa la scansione di tutti i posti di lavoro che è configurato per controllare l'URL specificato, e se sono anche configurati con sondaggi, sarà innescare immediatamente il polling (e se questo trova un cambiamento vale la pena build, una build verrà attivata a turno.)

Ciò consente a uno script di rimanere lo stesso quando i lavori vanno e vengono in Jenkins.
Oppure se si dispone di più repository in un'unica applicazione host di repository (ad esempio Gitosis), è possibile condividere un singolo script di hook di post-ricezione con tutti i repository. Infine, questo URL non richiede l'autenticazione nemmeno per Jenkins protetto, perché il server non utilizza direttamente nulla che il client sta inviando. Esegue il polling per verificare che vi sia un cambiamento, prima che inizi effettivamente una build.

Come mentioned here, assicurarsi di utilizzare l'indirizzo giusto per il server Jenkins:

dal momento che stiamo correndo Jenkins come Webserver autonomo sulla porta 8080 l'URL avrebbe dovuto essere senza il /jenkins, come questo :

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

a rafforzare tale ultimo punto, ptha aggiunge in the comments:

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 quello che hai in URL Repository del vostro lavoro Jenkins.
Quando si copia esempi che ho lasciato fuori il protocollo, nel nostro caso ssh://, e non ha funzionato.


È inoltre possibile utilizzare un semplice post-ricezione gancio come in "Push based builds using Jenkins and GIT"

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

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

configurare il vostro lavoro Jenkins per essere in grado di “Trigger costruisce a distanza” e utilizzare l'autenticazione token (1qaz2wsx in questo esempio).

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


voglio controllare nel cambiamento impostare se almeno un file java c'è la build dovrebbe iniziare.
Supponiamo gli sviluppatori modificati solo i file XML o file di proprietà, quindi la build non dovrebbe iniziare.

In sostanza, il vostro script di build può:

  • mettere un note 'build' (vedi git notes) in prima convocazione
  • sulle chiamate successive, afferrare l'elenco dei commit tra HEAD della vostra ramo candidato per accumulo e il commit riferimento dal git notes 'costruire' (git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • lo script può analizzare questa lista e decidere se ha bisogno di andare avanti con la compilazione.
  • in ogni caso, creare/spostare il git notes 'build' a HEAD.

maggio 2016: cwhsu punti su in the comments il seguente possibile url:

si potrebbe utilizzare curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN se si imposta grilletto config nella vostra voce

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


giugno 2016, polaretto punti su in the comments:

volevo aggiungere che, con solo un po 'di scripting di shell è possibile evitare la configurazione manuale url, specialmente se si hanno molti repository in una directory comune.
Per esempio ho usato queste espansioni di parametri per ottenere il nome repo

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

e quindi utilizzarlo come:

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

hi von come hai detto in prima chiamata devo mettere un build notes.my prima chiamata è leggere .java file ogni volta che lo sviluppatore spinge le modifiche in git repo. Sono nuovo a tutte queste cose, ecco perché sto chiedendo ogni passo. per favore non importa e devo completare questo compito. –

+0

Questo è molto utile per me. Ho scritto Git hook con l'aiuto di questo argomento. Ragazzi! –

+0

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

3

Come la risposta precedente ha mostrato un esempio di come il gancio completo potrebbe sembra che questo sia il codice del mio hook di post-ricezione:

#!/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://[email protected]/var/git/repo.git"]) 

In questo caso, io t lavoro jenkins rigger solo quando si spinge a padroneggiare e non altri rami.

+1

Come leghi questo script Python a Jenkins? O lo esegui una volta sola? –

+0

Jenkins non conosce questo hook, la parte principale sta caricando l'url notifyCommit sul server jenkins che attiverà un sondaggio. Penso che il sondaggio sia abilitato ma senza un programma sul lato jenkins. – Zitrax

+0

Quindi, dove si trova questo script python? Presumo che tu leghi con la tua installazione git per tenere traccia dei commit ... –

15

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

E 'solo una questione di usare curl per innescare un lavoro Jenkins utilizzando i ganci git forniti da git.
Il comando

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

possibile eseguire un lavoro Jenkins, dove someJob è il nome del lavoro Jenkins.

cercare la cartella hooks nella cartella .git nascosta. Rinominare il file post-commit.sample a post-commit. Aprirlo con il Blocco note, rimuovere la riga : Nothing e incollare il comando precedente in esso.

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

+0

Dopo aver eseguito il commit dalla macchina di sviluppo, il post-ricezione viene chiamato, non post-commit. Verificato mettendo le dichiarazioni di registro in entrambi i ganci. Sto leggendo i documenti errati, se non dovessi essere post-commit che viene chiamato? –

+0

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

+1

questa è una risposta perfetta. Grazie! – chao

2

voglio aggiungere alle risposte di cui sopra che diventa un po 'più difficile se l'autorizzazione Jenkins è abilitato.

Dopo aver abilitato lo ho ricevuto un messaggio di errore che le esigenze degli utenti anonimi i permessi di lettura.

ho visto due possibili soluzioni:

1: Modifica il mio gancio a:

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

2: l'autorizzazione a base di progetto impostazione.

Le soluzioni precedenti hanno lo svantaggio di dover esporre il mio passwd nel file hook. Inaccettabile nel mio caso.

Il secondo funziona per me. Nelle impostazioni dell'author globale ho dovuto abilitare Overall> Read per l'utente anonimo. Nel progetto che volevo attivare dovevo abilitare Job> Build e Job> Read for Anonymous.

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