2011-01-06 23 views
5

Después de cada commit en 'trunk', automáticamente ejecutamos un montón de pruebas contra el trunk. Cuando pasen esas pruebas, me gustaría una fusión automatizada en una rama llamada 'pasado por pruebas'. Cuando las pruebas fallan, no debe producirse una fusión, pero una vez que el problema se soluciona en 'trunk' en el compromiso siguiente o posterior, todos los cambios deben fusionarse.¿Cómo se sincroniza automáticamente cuando pasan las pruebas automatizadas?

El objetivo es tener una rama que tenga el mismo contenido que la troncal, pero eso es un poco más sensato que 'troncal' porque al menos las pruebas automatizadas han pasado.

Tengo un script que intenta hacerlo manualmente pero es un hack que usa propiedades personalizadas que no siempre funciona correctamente, como acabo de descubrir. ¿Cómo puedo hacer que Subversion haga esto?

+0

¿Cómo planeas manejar los conflictos de combinación? – Steve

+1

No creo que deba haber conflictos de fusión: 'tests-passed' siempre tiene el mismo contenido que 'trunk', excepto cuando HEAD en 'trunk' no pasa las pruebas, en cuyo caso tiene el mismo contenido que 'trunk' la última vez que pasaron las pruebas. –

Respuesta

5

Ejecutar estos comandos en la raíz de una copia de trabajo de pruebas pasaron cada vez que haya determinado que una nueva versión trunk <somerev> ha superado las pruebas:

svn update 
svn merge http://example.com/svn/myproject/trunk -r 0:<somerev> 
svn commit -m "merged trunk revisions up to <somerev> into tests-passed" 

Cada vez que se utiliza el comando de combinación, SVN registrarán las fusiones en la propiedad svn:mergeinfo. Por lo tanto, el comando anterior debe determinar automáticamente qué revisiones en el rango 0:<somerev> son elegibles para la fusión, excluyendo las fusiones que ya se hayan realizado.

Como dijo en un comentario, no se esperan conflictos. Pero a veces he visto conflictos inesperados de todos modos al fusionar un rango de revisiones SVN que contienen cambios de nombre. Para deshacerse de estos conflictos, puede usar la opción --accept theirs-full con el comando merge para aceptar siempre el estado del tronco.

+0

Ah, el "determinar automáticamente qué revisiones ... son elegibles" es genial, no lo sabía. Pensé que tenía que analizar esto de alguna manera, lo cual sonaba feo. ¿Cómo sugieres que encuentre ? Intenté 'svnversion trunk', ¿o necesita ser +1? –

+0

@Johannes: no necesita ser +1. Por ejemplo, si la última versión exitosa es para la revisión 100, puede fusionar '-r 0: 100'. –

0

Me imagino usando el banco de pruebas para hacerlo.

En mi experiencia, ejecutaba un script ANT para probar mi código, y tenía un condicional final para ejecutar la rama si las pruebas eran exitosas.

+0

Efectuamos las pruebas con hormiga, y tenemos una condición final tal como usted dice. La pregunta es: ¿cómo puedo hacer que svn realice la fusión correcta en función de esa condición? –

+0

¿Ustedes siguen el Name_spacing con cada código nuevo? (code_ versioning) podría ayudar en esta situación. – NaV

+0

¿Ejem? No tengo idea de lo que estás hablando ... –

1

Puede usar una herramienta de integración continua para eso. Uno muy popular: Hudson

http://hudson-ci.org/

Usted puede script ese tipo de comportamiento allí.

+0

Una vez más, mi pregunta es sobre la parte svn de ella, no sobre la parte de scheduling o scripting. A menos que Hudson tenga algo de magia svn que yo no sepa.(Nuestra configuración aquí sí utiliza Hudson para ejecutar las compilaciones y las pruebas en respuesta a los checkins en 'trunk') –

Cuestiones relacionadas