2010-12-27 18 views
7

Vorrei aggiungere un hook di aggiornamento per git che impedisca alle persone di spingere codice java che non verrà compilato. Idealmente chiamerebbe javac, vedere il risultato e consentire o rifiutare la spinta.Come posso fare in modo che git rifiuti il ​​push del codice che non verrà compilato?

L'esempio più comune di qualcosa che voglio evitare è che qualcuno non commetta tutte le sue modifiche rompendo così la costruzione. Tuttavia, è a mia conoscenza che git git girano sul client (non sul server), quindi se succede quanto sopra, il gancio permetterà comunque la spinta.

Qual è il modo migliore per impedire alle persone di interrompere la compilazione con commit incompleti?

UPDATE:

Hai una versione primitiva della lavorazione gancio, grazie per tutto l'aiuto!

Estratto dal gancio aggiornamento:

### make sure code compiles 
## currently does this by copying the state of the repository as of the pushed code and attempting to build it 

# for now, hard coded as C:\Windows\Temp 
copydir="/c/Windows/Temp/git_hook_compile_copy" 

echo "making copy of $newrev to $copydir" >&2 
rm -rf "$copydir" 
mkdir "$copydir" 
git archive $newrev | tar -x -C $copydir/ 
if [ "$?" != "0" ]; then 
    echo "*** unable to make copy of code" >&2 
    exit 1 
fi 
echo "attempting to build $newrev" >&2 
"$ANT_HOME/bin/ant" -file "$copydir/appropriatePath/build.xml" 
if [ "$?" != "0" ]; then 
    echo "*** code does not compile" >&2 
    exit 1 
fi 

(notare che questo è un ambiente Windows e si basa su ANT_HOME (e quindi JAVA_HOME) variabili d'ambiente in fase di definizione)

risposta

4

server di Git e il client non differiscono che tanto ;-). Quindi tutti gli hook che girano su "client" verranno eseguiti su "server" se gli stessi eventi si verificano sul server, naturalmente.

Ad esempio, il gancio update rientra completamente in questa categoria. Viene chiamato dopo l'aggiornamento di un ramo e se questo hook restituisce uno stato diverso da zero, l'aggiornamento viene annullato. Quindi potresti voler inserire la compilation e restituire il risultato. Tutti i messaggi che stampi da un gancio verranno mostrati all'utente che si impegna sulla sua console. Questo è abbastanza utile, dal momento che può vedere i messaggi di errore dal tuo script di costruzione, e risolverlo.

Anche se si eseguono due compilation contemporaneamente, il repository git non perderà commit, a causa dell'uso dell'argomento "vecchio refname" nel suo hook di aggiornamento. Tuttavia, potrebbe accadere che un committer aspetta la compilazione, e il suo ref non viene spinto perché invece qualcun altro ha spinto il suo.

Un repository git predefinito contiene un bell'esempio di un hook update (denominato update.sample). Riferiscilo se hai bisogno di un esempio definitivo.

Tuttavia, se la compilazione è troppo lunga e la velocità di commit supera la frequenza con cui è possibile compilare il codice, è possibile utilizzare soluzioni più avanzate. I commentatori suggeriscono di cercare "integrazione continua" in google.

+6

Compilare un progetto ad ogni spinta può essere proibitivo; se è così, 'integrazione continua' è cosa google. – 9000

+0

+1 per l'integrazione continua. –

+0

Per quanto riguarda l'integrazione continua, ne sono un grande fan e utilizziamo Hudson per il nostro progetto principale. Questo è un progetto parallelo e voglio solo qualcosa di veramente semplice che impedisca alle persone di essere in grado di controllare il codice che interrompe la compilazione, in questo modo nessun altro (in questo caso le macchine virtuali che eseguono script) può controllare una build non funzionante. – Zugwalt

1

Facciamo ciò avendo gerrit nel percorso del lavoro che uno sviluppatore fa e ciò che vedono tutti gli altri. Ci vogliono due persone per commettere un errore che rompe le cose per tutti gli altri.

Utilizziamo anche buildbot (per l'integrazione continua) in modo che possiamo eseguire una generazione su tutte le macchine prima che il codice diventi "pubblico".

+0

+1: per gerrit. Ed ecco una demo dal vivo: https://review.source.android.com/ –

Problemi correlati