¿Cómo paso el número de compilation de Nant al Control de Cruceros?

Tengo un script de compilation de Nant que CruiseControl usa para crear una solución bajo demanda.

Sin embargo, recientemente obtuvimos CruiseControl, por lo que nuestro número de versión oficial es diferente de lo que figura en CruiseControl.

Sé que CruiseControl inyecta algunas properties en las secuencias de commands de compilation para que pueda acceder al número de compilation CC en la secuencia de commands (CCNetLabel), pero ¿cómo paso un valor a CC para usar como número de compilation en la pantalla de la interfaz de usuario?

Ejemplo, CC dice compilation número 2

El script nAnt incrementa el valor de buildnumber.xml en cada compilation y el número de compilation oficial está en 123.

Quiero que la interfaz de usuario de CC muestre el último número de compilation exitoso: 123, no 2, entonces, ¿cómo respaldo ese valor?

Se requiere una labeldora de construcción personalizada para esto. Perforce es nuestro proveedor de control de fuente y derivamos nuestro número de versión de él. El código es el siguiente:

/// <summary> /// Gets the latest change list number from perforce, for ccnet to consume as a build label. /// </summary> [ReflectorType( "p4labeller" )] public class PerforceLabeller : ILabeller { // perforce executable (optional) [ReflectorProperty("executable", Requinetworking = false)] public string P4Executable = "p4.exe"; // perforce port (ie myserver:1234) [ReflectorProperty("port", Requinetworking = false)] public string P4Port = String.Empty; // perforce user [ReflectorProperty("user", Requinetworking = false)] public string P4User = String.Empty; // perforce client [ReflectorProperty("client", Requinetworking = false)] public string P4Client = String.Empty; // perforce view (ie //Dev/Code1/...) [ReflectorProperty("view", Requinetworking = false)] public string P4View = String.Empty; // Returns latest change list public string Generate( IIntegrationResult previousLabel ) { return GetLatestChangelist(); } // Stores latest change list into a label public void Run( IIntegrationResult result ) { result.Label = GetLatestChangelist(); } // Gets the latest change list public string GetLatestChangelist() { // Build the arguments to pass to p4 to get the latest changelist string theArgs = "-p " + P4Port + " -u " + P4User + " -c " + P4Client + " changes -m 1 -s submitted " + P4View; Log.Info( string.Format( "Getting latest change from Perforce using --> " + theArgs ) ); // Execute p4 ProcessResult theProcessResult = new ProcessExecutor().Execute( new ProcessInfo( P4Executable, theArgs ) ); // Extract the changelist # from the result Regex theRegex = new Regex( @"\s[0-9]+\s", RegexOptions.IgnoreCase ); Match theMatch = theRegex.Match( theProcessResult.StandardOutput ); return theMatch.Value.Trim(); } } 

El método, GetLatestChangelist , es donde probablemente insertías tu propia lógica para hablar con tu sistema de control de versiones. En Perforce existe la idea de la última list de cambios que es única. Nuestros numbers de compilation y, en última instancia, los numbers de versión se basan en eso.

Una vez que construyas esto (en un dll de ensamblaje), tendrás que engancharlo en ccnet. Simplemente puede soltar el ensamblado en el directory del server (al lado de ccnet.exe).

A continuación, modifique su file de proyecto ccnet para utilizar esta labeldora. Hicimos esto con el bloque labeldor pnetworkingeterminado . Algo como lo siguiente:

 <project> <labeller type="p4labeller"> <client>myclient</client> <executable>p4.exe</executable> <port>myserver:1234</port> <user>myuser</user> <view>//Code1/...</view> </labeller> <!-- Other project configuration to go here --> </project> 

Si solo quieres que aparezca el número de compilation en ccnet, ya terminaste y no necesitas hacer nada más. Sin embargo, puede acceder a la label en su script NAnt si lo desea utilizando la propiedad CCNetLabel ya provista.

Espero que esto ayude a algunos. Avíseme si tiene alguna pregunta al publicar los comentarios.

¿Intentó usar algunas variables de entorno? Creo que CCNet puede manejar esto.

Voy a cavar un poco sobre esto.

Bueno, veo una solución, bastante sucia, pero de todos modos:

1- Agregue una sección defaultlabeller en su definición de proyecto CCNET. Contendrá el patrón del número de compilation que desea visualizar.

2- Dentro de NAnt, tenga una secuencia de commands para actualizar su file de configuration, insertando el número de compilation que desea ver.

3- Toque (en el sentido Unix) el file ccnet.exe.config para que vuelva a cargar los files de configuration del proyecto.

et voilà.

Tuvimos este problema también. Terminé escribiendo un complemento de labeldo CC especial.

Si sus numbers de compilation son secuenciales, puede piratear el file de estado de control de crucero para darle el número de compilation correcto para comenzar. Está buscando un file llamado [projectName] .state.

Cambié el elemento Label al número correcto y LastSuccessfulIntegrationLabel como el nuevo número.

Sin embargo, recientemente obtuvimos CruiseControl, por lo que nuestro número de versión oficial es diferente de lo que figura en CruiseControl.

Algo así como lo que dijo gbanfill, puedes decirle a CC de qué numbers de compilation comenzar, pero no hay necesidad de hackear el file .ser. Puede usar la interfaz JMX para establecer el número de compilation actual para sincronizarlo con su número de compilation NAnt.

También puede establecer el valor de label pnetworkingeterminado en su número de compilation actual, eliminar el file .ser y reiniciar CC.

Pero quizás lo más fácil sea escribir el número de compilation en un file de propiedad de NAnt y luego usar el incremento de la label del file de propiedad para leer ese file. (Asegúrese de establecer setPreBuildIncrementer = "true")