2008-11-06 12 views
6

Tengo un script de compilación de Nant que CruiseControl usa para crear una solución bajo demanda.Cómo paso el número de compilación de Nant a Cruise Control

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 propiedades en los scripts de compilación para que pueda acceder al número de compilación CC en el script (CCNetLabel) pero ¿cómo paso un valor a CC para usar como número de compilación en la pantalla de IU?

ejemplo, CC dice el número de compilación 2

guión Nant incrementa un valor buildnumber.xml cada proyecto de construcción, y el número oficial de construcción es de 123.

Quiero que la interfaz de usuario para mostrar CC último número de compilación exitosa : 123, no 2, entonces, ¿cómo paso nuevamente ese valor?

Respuesta

7

Se requiere una etiquetadora 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", Required = false)] 
    public string P4Executable = "p4.exe"; 

    // perforce port (i.e. myserver:1234) 
    [ReflectorProperty("port", Required = false)] 
    public string P4Port = String.Empty; 

    // perforce user 
    [ReflectorProperty("user", Required = false)] 
    public string P4User = String.Empty; 

    // perforce client 
    [ReflectorProperty("client", Required = false)] 
    public string P4Client = String.Empty; 

    // perforce view (i.e. //Dev/Code1/...) 
    [ReflectorProperty("view", Required = 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 es probable que insertar su propia lógica de hablar con su sistema de control de versiones. En Perforce existe la idea de la última lista de cambios que es única. Nuestros números de compilación y, en última instancia, los números de versión se basan en eso.

Una vez que compile esto (en un dll de ensamblaje), tendrá que engancharlo en ccnet. Simplemente puede soltar el ensamblado en el directorio del servidor (al lado de ccnet.exe).

A continuación, modifique su archivo de proyecto ccnet para utilizar esta etiquetadora. Hicimos esto con el default labeller block. Algo así 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 acaba de querer que el número de compilación aparezca en CCNet luego que haya terminado y realmente no necesita hacer nada más. Sin embargo, puede acceder a la etiqueta en su secuencia de comandos 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.

+1

Para compilar esto, tuve que agregar referencias a ThoughtWorks.CruiseControl.Core.dll y NetReflector.dll (ambos en la carpeta de instalación CruiseControl.Net y luego agregar lo siguiente para importar los espacios de nombres: usando Exortech.NetReflector; usando ThoughtWorks .CruiseControl.Core; – robaker

+0

La otra cosa que agregaría es que se asegure de que su dll de ensamblado se llame "ccnet. *. Plugin.dll" donde * sea el nombre que elija para su complemento. – Ken

1

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

Voy a cavar un poco sobre esto.

Bien veo una solución, bastante sucio, pero de todos modos:

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

2- Dentro de NAnt, tenga una secuencia de comandos para actualizar su archivo de configuración, insertando el número de compilación que desea ver.

3- Toque (en el sentido Unix) el archivo ccnet.exe.config para que vuelva a cargar los archivos de configuración de los proyectos.

y voilà.

0

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

+0

No tiene el código para distribuir, ¿verdad? –

+0

No, pero realmente no es tan difícil. Heredar de net.sourceforge.cruisecontrol.LabelIncrementer, seguir los documentos de API, compilar el complemento en un contenedor y agregar el archivo jar a su CC config.xml. – JesperE

0

Si sus números de compilación son secuenciales, puede piratear el archivo de estado de control de crucero para darle el número de compilación correcto para empezar. Está buscando un archivo llamado [projectName] .state.

he cambiado el elementoetiqueta con el número correcto y el LastSuccessfulIntegrationLabel para ser el nuevo número.

0

Sin embargo, sólo recientemente se climatizador por lo que nuestra estructura oficial número es diferente de lo que es enumerados en climatizador.

De acuerdo con lo que dijo gbanfill, puedes decirle a CC de qué números de compilación empezar, pero no hay necesidad de hackear el archivo .ser. Puede usar la interfaz JMX para establecer el número de compilación actual para sincronizarlo con su número de compilación NAnt.

También puede establecer el valor default label en su número de compilación actual, eliminar el archivo .ser y reiniciar CC.

Pero quizás lo más fácil es escribir el número de compilación en un archivo de propiedad de NAnt y luego usar el property file label incrementer para leer ese archivo. (Asegúrese de establecer setPreBuildIncrementer = "true")

Cuestiones relacionadas