2010-12-27 12 views
7

Me gustaría agregar una actualización de gancho a git que evita que las personas presionen el código java que no compilará. Lo ideal sería llamar a javac, ver el resultado y permitir o rechazar el empuje.¿Cómo puedo hacer para que git rechace presionar el código que no se compilará?

El ejemplo más común de algo que quiero evitar es que alguien no realice todos los cambios y se rompa la compilación. Sin embargo, tengo entendido que los ganchos de git se ejecutan en el cliente (no en el servidor), de modo que si sucede lo anterior, el gancho aún permitirá la inserción.

¿Cuál es la mejor manera de evitar que las personas rompan la construcción con confirmaciones incompletas?

ACTUALIZACIÓN:

Tienes una versión primitiva del trabajo de gancho, gracias por toda la ayuda!

Extracto de actualización de gancho:

### 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 

(tenga en cuenta que esto es para un entorno de ventanas y se basa en ANT_HOME (y por lo tanto JAVA_HOME) variables de entorno que se definen)

Respuesta

4

servidor de Git y el cliente no difieren de que mucho ;-) Entonces, todos los enganches que se ejecutan en "cliente" se ejecutarán en "servidor" si ocurren los mismos eventos en el servidor, por supuesto.

Por ejemplo, update gancho, entra totalmente en esta categoría. Se invoca después de que se actualizó una rama, y ​​si este enlace devuelve un estado distinto de cero, la actualización se cancela. Por lo tanto, es posible que desee colocar compilación allí y devolver su resultado. Todos los mensajes que imprima desde el gancho se mostrarán al usuario que se compromete en su consola. Esto es bastante útil, ya que puede ver los mensajes de error de su secuencia de comandos de compilación y corregirlos.

Incluso si ejecuta dos compilaciones al mismo tiempo, el repositorio de git no perderá las confirmaciones, debido al uso del argumento "ref name" en su gancho de actualización. Sin embargo, puede suceder que un committer espere la compilación, y su ref no se empuja porque alguien más consiguió su empuje en su lugar.

Un repositorio predeterminado de git contiene un buen ejemplo de un gancho update (llamado update.sample). Consulte si necesita un ejemplo definitivo.

Sin embargo, si la compilación es demasiado larga, y la tasa de confirmaciones excede la frecuencia con la que puede compilar el código, es posible que desee utilizar soluciones más avanzadas. Los comentaristas sugieren buscar "integración continua" en google.

+6

La compilación de un proyecto en cada inserción puede ser prohibitivamente costosa; si es así, 'integración continua' es lo que googlear. – 9000

+0

+1 para integración continua. –

+0

Con respecto a la integración continua, también soy un gran admirador de ella y usamos Hudson para nuestro proyecto principal. Este es un proyecto paralelo y solo quiero algo realmente simple que evite que las personas puedan verificar el código que rompe la compilación, de esa manera nadie más (en este caso las máquinas virtuales que ejecutan scripts) puede verificar una compilación rota. – Zugwalt

1

Hacemos esto teniendo gerrit en la ruta del trabajo que hace un desarrollador y lo que todos los demás ven. Se necesitan dos personas para cometer un error que rompe cosas para todos los demás.

También utilizamos buildbot (para la integración continua) de tal forma que podemos ejecutar una construcción en todas las máquinas antes de que el código se vuelva "público".

+0

+1: Para gerrit. Y aquí hay una demostración en vivo: https://review.source.android.com/ –

Cuestiones relacionadas