2011-02-09 11 views
8

La mia configurazione è un server XAMPP di Windows, con cURL abilitato e Git e Hudson installati. Hudson interroga Git ogni minuto per cercare le modifiche e, se le trova, crea una build. Io uso questa build come mio server di test. Funziona beneGit post-ricezione non funzionante

Vorrei installare un hook di post-ricezione sul mio repository centrale remoto che esegue la funzione di build forzata di Hudson.

Ho creato un file di post-ricezione chiamato "post-receive" nella directory hooks nel mio repository Git centrale, quello che viene inviato dai rami locali degli sviluppatori. Ciascuno spinge al proprio ramo nel repository centrale. Voglio eseguire la build post-ricezione immediatamente dopo ogni push, invece di avere il sondaggio Git Hudson ogni minuto.

Quando apro una shell al server remoto ed eseguo "post-receive" nella cartella hooks, viene eseguito. Semplicemente non viene chiamato quando le persone lo spingono dalle copie del repository locale a quella centrale.

Forse non sto spiegando questo, ma è come capisco Git.

Il post-codice ricevuto è di due linee:

#!/bin/sh 
curl http://myserver.com:8080/hudson/job/myjobname/build?token=mytoken 

nuovo, quando apro una shell ed eseguire questo, funziona, ma quando qualcuno spinge ad esso, non succede nulla, finché un minuto o meno va da, Hudson si rende conto che Git è stato cambiato, e poi si costruisce.

Sono felice di chiarire se necessario. Qualsiasi aiuto è molto apprezzato.

EDIT: Dopo aver giocato con esso, ho l'impressione che forse la post-ricezione non è in esecuzione perché gli aggiornamenti non vengono aggiornati di qualcosa? La documentazione git dice

Esegue sul repository remoto una volta che tutti gli aggiornamenti sono stati aggiornati.

Significa che se non si aggiorna nulla, non verrà eseguito? E se è così, sono abbastanza sicuro che le cose si stanno aggiornando comunque, quindi non dovrebbe applicarsi.

Ecco il mio processo: Apporta le modifiche localmente. Applica modifiche. Spingere dal mio HEAD al ramo remoto chiamato 'mybranch' (non il ramo principale, che è estratto) Questo è il punto in cui voglio eseguire il mio hook.

+0

L'utente vostro demone git è in esecuzione ha permesso di eseguire quello script? – jweyrich

+0

Non sicuro. Lo esegue quando lo eseguo tramite Git Bash, ma non quando lo spingo. Come dovrei controllare quelle autorizzazioni? – spanky

+0

l'autorizzazione corretta dipende dal modo in cui si condivide il repository e dalle configurazioni effettive. Tuttavia, msquared ti dice il modo di dare l'autorizzazione eseguibile a tutti gli utenti/gruppi, quindi dovrebbe funzionare se il problema è davvero così. – jweyrich

risposta

3

Tutte queste risposte sono utili, ma si scopre che mi serviva la directory "bin" di git nella mia variabile PATH. Ho avuto solo la directory "cmd". Aggiunto c:\my_path_to_git\git\bin a PATH e funziona bene. Ho trovato questa risposta per tentativi ed errori e guardando il log degli errori di Apache. Grazie a tutti per il vostro aiuto!

11

Verificare se il file ha diritti eseguibili. Altrimenti non può essere eseguito. Qualcosa come rwxr-xr-x dovrebbe essere sufficiente.

È possibile aggiungere il bit mancante con

$ chmod +x /path/to/post-receive 
+0

Fatto così. Ora è rwxr-xr-x, e ricorda che è stato eseguito dalla shell Git Bash, ma non è ancora in esecuzione da solo tramite push. – spanky

1

di file Provare a utilizzare il percorso completo per arricciare in post-ricezione, come percorso può essere diverso rispetto a quando l'esecuzione di script a mano.

Se volete vedere che cosa è l'ambiente di esecuzione di script di post-ricezione:

#!/bin/sh 
export > file 

o semplicemente (mostrerà env.variabili dopo aver spinto in pronti contro termine)

#!/bin/sh 
export 

Inoltre, io non sono sicuro di come l'esecuzione di shell scrips funziona su Windows, in modo #!/path/to/installato/sh al posto di #!/bin/sh potrebbe aiutare

+0

Non so quale sia il percorso completo da arricciare. Sono completamente perso qui. Il percorso "sh" dovrebbe essere lo sh che è venuto con Git? Windows è confuso. Quando eseguo l'esportazione, va bene, quando eseguo manualmente lo script di post-ricezione, ma lo script non è in esecuzione quando spingo, quindi non mi aiuta davvero lì. Il percorso CURL sarebbe utile. Ho c: \ xampp \ php nel mio PERCORSO, che altro ho bisogno? – spanky

+0

È necessario capire dove è installato Curl e utilizzare il percorso completo per arricciare il copione. Esegui la * shell * (git's shell) manualmente e digita "which curl" - stamperà qualcosa come/usr/bin/curl. Sostituisci "arricciatura" nel tuo script con qualsiasi cosa stampi. – ebneter

5

Quale metodo di trasporto stai usando per spingere per il repo?

ganci vengono eseguite solo nell'uso dei protocolli di 'intelligenti' di trasporto come ssh e l'attuazione di cgi http. Per altri protocolli di trasporto "stupidi" come ftp, rsync e l'implementazione http precedente, i hook non verranno mai eseguiti. Presumo che il protocollo git eseguirà i ganci ma che il protocollo non è mai stato considerato una buona idea.

+0

Oh uomo. Sto usando http. Fallire. Qualche consiglio su come passare a una versione diversa senza rovinare quello che ho attualmente nel repository? Guarderò anche me stesso. – spanky

+0

È comunque possibile utilizzare HTTP se si utilizza http://www.kernel.org/pub/software/scm/git/docs/git-http-backend.html ma non si sa nulla circa la prova di installarla sul Finestre. È anche possibile impostare un server SSH utilizzando un server Windows nativo o con cygwin, di cui anch'io non ho esperienza. Come hai scoperto, Windows non è esattamente il sistema operativo più amichevole su cui ospitare i repository git. – Arrowmaster

+0

@Arrowmaster Il tuo commento si è rivelato utile per me per creare un repository di giocattoli su HTTP e avevo bisogno anche degli hook da eseguire. Grazie! –

1

Penso che la risposta più semplice è che devi spostare il contenuto del post-ricezione lato server gancio al posto di lato client

+1

Benvenuti in Stack Overflow! Questo è davvero un commento, non una risposta. Con un po 'più di ripetizione, [sarai in grado di postare commenti] (// stackoverflow.com/privileges/comment). – Mat