2013-09-04 5 views
7

Mi chiedevo che cosa è il modo migliore per creare un gancio pre-push (in un repo git), che esegue le seguenti operazioni:Crea gancio pre-push di pelucchi/test

  • Run JSHint/JSLint
  • Run test unitari e funzionali
  • Se tutto è ok quindi accettare l'aggiornamento
  • In caso contrario, rifiutano l'aggiornamento
+2

Github (il servizio di hosting git) non consente di aggiungere hook arbitrari alle copie ospitate dei repository. Impostazione ganci sulla versione * locali * di repository è certamente possibile, ma allora la questione non è Github specifico :) – Gareth

+2

Così, l'unico modo per aggiungere un gancio è con quelli pre-definito da [GitHub] (http : //developer.github.com/v3/repos/hooks/#create-a-hook)? –

+0

Prima di tutto, tieni presente che il pre-push viene eseguito sulla macchina che esegue la spinta e che non sarà mai Github. L'evento "push" che Github offre per Web Hook è in realtà attivato come post-ricezione, come indicato nella parte superiore della pagina a cui sei collegato. Quindi, può essere utilizzato solo per le notifiche – Gareth

risposta

2

è possibile utilizzare un Git pre commettere gancio per Fai questo. Ho impostato i ganci di preavviamento per verificare le dichiarazioni di debug, ecc.

I ganci lato client come questo appartengono alla cartella .git/hooks. Ma dal momento che non puoi trasferire nulla nel repository .git nel controllo della versione sei bloccato.

Quello che devi fare è mantenere il comando della shell che controlla la correttezza in alcune cartelle del tuo repository git, ad esempio una directory di livello superiore tools.

Poi "solo" dire alla gente di installarlo tramite:

chmod u+x tools/precommit-checks.sh 

ln -s $PWD/tools/precommit-checks.sh .git/hooks/pre-commit 

e, partendo dal presupposto che tutti lo installa, si può avere il controllo come si chiede.

Probabilmente un modo migliore è catturare solo questo lato server: disporre di una sorta di server di integrazione continua che estrae gli ultimi commit dal repository Github e controlla il codebase.

No, non ti darà la possibilità di "negare una spinta" che desideri.

Supponendo che tu stessi ospitando il tuo repository git, c'è anche un'altra ruga: pensavo che i ganci di pre-ricezione sul server avrebbero bloccato i client per tutto il tempo necessario. (Questo è documentato come vero per i ganci post-ricezione, quindi suppongo che sia vero anche qui). Quindi, se i test CI richiedono 2 minuti, alcuni sviluppatori stanno scrivendo git push e aspettano 2 minuti perché la loro console esegua nuovamente qualcosa.

Quindi, probabilmente, è meglio eseguire l'analisi push post utilizzando un server CI o altri test di qualità.

+1

, perché rendere questo è un pre-commit invece di un hook pre-push? Come un gancio pre-push, darebbe l'opzione per rifiutare una spinta - http://git-scm.com/docs/githooks#_pre-push –

+0

Se pre-push avviene sulla macchina client, allora potrebbe essere una buona idea. Se succede sul server, come pre-ricevo, allora vedi il mio problema a questo proposito. Ma il pre-push potrebbe essere interessante: so che faccio un sacco di lavoro, quindi faccio un mucchio di commit estraendo i vari pezzi. pre-push potrebbe evitare "Sì, so che i test unitari falliscono per questo commit, dammi un secondo". A meno che non _want_ questa caratteristica (aka: la vostra squadra utilizza git-bisect molto, quindi unit test devono passare) – RyanWilcox

+0

se si aggiunge al vostro locale.git/hooks hook, tutti gli hook sono locali. il pre-push si attiva appena prima che la spinta sia consentita, e se qualsiasi script esegue qualcosa di diverso da 0, la spinta viene annullata. –