Pregunta

Tengo CruiseControl.NET versión 1.4 configurado en mi servidor de desarrollo.Cada vez que un desarrollador registra el código, realiza una compilación.

Ahora estamos en un lugar donde podemos comenzar a entregar nuestra aplicación a los evaluadores.Nos gustaría utilizar ClickOnce para distribuir la aplicación, con la idea de que cuando un evaluador vaya a probar la aplicación, tenga la última versión.

No puedo encontrar una manera de hacer que eso suceda con CruiseControl.NET.Estamos usando MSBUILD para realizar las compilaciones.

¿Fue útil?

Solución 2

Gracias por toda la ayuda.La solución final que implementamos tomó un poco de cada respuesta.

Nos resultó más fácil trabajar con múltiples entornos utilizando archivos por lotes simples.No estoy sugiriendo que esta sea la mejor manera de hacerlo, pero para nuestro escenario y requisitos dados, funcionó bien.Complemente "Proyecto" con el nombre de su proyecto y "Entorno" con el nombre de su entorno (desarrollo, prueba, etapa, producción, lo que sea).

Aquí está el área de tareas de nuestro archivo "ccnet.config".

<!-- override settings  -->
<exec>
    <executable>F:\Source\Project\Environment\CruiseControl\CopySettings.bat</executable>
</exec>

<!-- compile -->
<msbuild>
    <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
    <workingDirectory>F:\Source\Project\Environment\</workingDirectory>
    <projectFile>Project.sln</projectFile>
    <buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
    <targets>Rebuild</targets>
    <timeout>0</timeout>
    <logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>

<!-- clickonce publish  -->
<exec>
    <executable>F:\Source\Project\Environment\CruiseControl\Publish.bat</executable>
</exec>

Lo primero que notará es que se ejecuta CopySettings.bat.Esto copia configuraciones específicas para el entorno, como las conexiones de bases de datos.

A continuación, se ejecuta la tarea estándar MSBUILD.Cualquier error de compilación se detecta aquí y se maneja normalmente.

Lo último que debe ejecutar es Publish.bat.En realidad, esto realiza una "reconstrucción" de MSBUILD nuevamente desde la línea de comando, y los parámetros de CruiseControl se pasan y construyen automáticamente.A continuación, se llama a MSBUILD para el objetivo de "publicación".Se proporcionan exactamente los mismos parámetros a la publicación cuando se emitió la reconstrucción.Esto mantiene sincronizados los números de compilación.Además, nuestros ejecutables tienen nombres diferentes (es decir,- ProjectDev y ProjectTest).Terminamos con diferentes números y nombres de versión, y esto permite que ClickOnce haga lo suyo.

La última parte de Publish.bat copia los archivos reales a sus nuevos hogares.No usamos publicar.htm ya que todos nuestros usuarios están en la red, simplemente les damos un acceso directo al archivo de manifiesto en su escritorio y pueden hacer clic y siempre ejecutar el ejecutable correcto con un número de versión que se relaciona con Control de crucero.

Aquí está CopySettings.bat

XCOPY "F:\Source\Project\Environment\CruiseControl\Project\app.config" "F:\Source\Project\Environment\Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.Designer.vb" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.settings" "F:\Source\Project\Environment\Project\My Project" /Y /I /R

Y por último, aquí está Publish.bat

C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:rebuild "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationRevision=%CCNetLabel% /property:AssemblyName="ProjectEnvironment" /property:PublishUrl="\\Server\bin\Project\Environment\\"
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:publish "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationVersion="1.0.0.%CCNetLabel%" /property:AssemblyVersion="1.0.0.%CCNetLabel%" /property:AssemblyName="ProjectEnvironment" 

XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish" "F:\Binary\Project\Environment" /Y /I
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish\Application Files" "F:\Binary\Project\Environment\Application Files" /Y /I /S

Como dije, probablemente no se haya hecho de la forma en que los desarrolladores de CruiseControl y MSBUILD pretendían que funcionara, pero funciona.Si necesita que esto funcione ayer, podría ser la solución que está buscando.¡Buena suerte!

Otros consejos

Hemos hecho esto y podemos darle algunos consejos para comenzar.

2 cosas que debes tener en cuenta:

  • MSBuild puede generar los archivos de implementación necesarios para usted.
  • MSBuild no implementará los archivos en el recurso compartido FTP o UNC.Necesitará un paso separado para esto.

Para usar MSBuild para generar los manifiestos ClickOnce, este es el comando que deberá ejecutar:

msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj"

Eso le indicará a MSBuild que cree su proyecto y genere archivos de implementación de ClickOnce dentro del bin elease uProyecto.publish directorio.

Todo lo que queda es copiar esos archivos al recurso compartido FTP/UNC/donde sea, y ya está todo listo.

Puede indicarle a CruiseControl.NET que cree utilizando esos parámetros de MSBuild.

Luego necesitará una tarea de compilación de CruiseControl.NET para tomar los archivos de implementación generados y copiarlos al recurso compartido FTP o UNC.Usamos un pequeño programa de consola C# personalizado para esto, pero también puedes usar un script de Powershell.

Recuerdo haber hecho esto el año pasado para un proyecto ClickOnce en el que estaba trabajando.Recuerdo que me tomó una eternidad darme cuenta, pero aquí está.Lo que quería que hicieran mis scripts era generar un instalador diferente que apuntara a nuestro entorno de desarrollo y uno diferente para prod.No solo eso, sino que lo necesitaba para inyectar la información de versión correcta para que los clientes existentes se "daran cuenta" de que existe una nueva versión, que es el objetivo de hacer clic una vez.En este script debe reemplazarlo con sus propios nombres de servidor, etc.El truco consiste en guardar el archivo Publish.htm y project.publish e inyectar el nuevo número de versión según la versión que le proporciona CC.NET.

Así es como se veía mi script de compilación:

<target name="deployProd">
  <exec program="<framework_dir>\msbuild.exe" commandline="<project>/<project>.csproj /property:Configuration=PublishProd /property:ApplicationVersion=${build.label}.*;PublishUrl=\\<prod_location>\binups$\;InstallUrl=\\<prod_location>\binups$\;UpdateUrl=\\<prod_location>\binups$\;BootstrapperComponentsUrl=\\<prod_location>\prereqs$\ /target:publish"/>

  <copy todir="<project>\bin\PublishProd\<project>.publish">

    <fileset basedir=".">
      <include name="publish.htm"/>
    </fileset>

    <filterchain>
      <replacetokens>
        <token key="CURRENT_VERSION" value="${build.label}"/>
      </replacetokens>
     </filterchain>
  </copy>

</target>

Espero que esto ayude

Ser capaz de pasar ${CCNetLabel} en la tarea msbuild de CCNET.config sería una gran mejora.

Desea utilizar las tareas de generación de manifiesto ClickOnce en msbuild.El proceso es un poco largo, así que sólo voy a indicarle un par de enlaces.Aquí está el referencia en msdn y un artículo de muestra para, con suerte, comenzar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top