¿Cómo se puede publicar una aplicación ClickOnce a través de CruiseControl.NET?


Tengo CruiseControl.NET Versión 1.4 configurada en mi servidor de desarrollo. Cada vez que un desarrollador comprueba el código, hace una compilación.

Ahora estamos en un lugar donde podemos empezar a dar nuestra aplicación a los probadores. Nos gustaría usar ClickOnce para distribuir la aplicación, con la idea de que cuando un probador va a probar la aplicación, tienen la última compilación.

No puedo encontrar una manera de hacer que eso suceda con CruiseControl.NET. Estamos utilizando MSBUILD para realizar el construir.

Author: huseyint, 2008-08-15

5 answers

Hemos hecho esto y podemos darle algunos consejos para comenzar.

2 cosas que debe tener en cuenta:

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

Para usar MSBuild para generar los manifiestos de ClickOnce, aquí está el comando que deberá emitir:

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

Eso le dirá a MSBuild que construya su proyecto y genere la implementación de ClickOnce archivos dentro de la bin\Release\YourProject.publicar directorio.

Todo lo que queda es copiar esos archivos al FTP/UNC share/wherever, y ya está todo listo.

Usted puede decir CruiseControl.NET para construir usando esos parámetros de MSBuild.

Entonces necesitarás un CruiseControl.NET build task para tomar los archivos de implementación generados y copiarlos al recurso compartido FTP o UNC. Usamos un pequeño programa de consola de C# personalizado para esto, pero podría usar un Powershell con la misma facilidad script.

 22
Author: Judah Himango,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-15 17:35:46

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

Nos resultó más fácil manejar el trabajo 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, esto 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 "ccnet.archivo de configuración.

<!-- 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 CopySettings.bat corre. Esto copia la configuración específica del entorno, como las conexiones a la base de datos.

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

Lo último que hay que ejecutar es Publicar.bate. Esto realmente realiza una "reconstrucción" de MSBUILD de nuevo desde la línea de comandos, y los parámetros de CruiseControl se pasan automáticamente en y construido. A continuación, se llama a MSBUILD para el objetivo "publicar". Los mismos parámetros exactos se le dan a la publicación como se emitió la reconstrucción. Esto mantiene los números de compilación sincronizados. Además, nuestros ejecutables tienen nombres diferentes (es decir, ProjectDev y ProjectTest). Terminamos con diferentes números de versión y nombres, y esto permite a ClickOnce hacer su cosa.

La última parte de Publicar.bat copia los archivos reales a sus nuevas casas. No usamos la publicación.htm como todos nuestros usuarios están en la red, solo les damos un acceso directo al archivo de manifiesto en su escritorio y pueden hacer clic y siempre estar ejecutando el ejecutable correcto con un número de versión que se vincula con CruiseControl.

Aquí está CopySettings.mtd

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á Publicar.mtd

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 manera en que los desarrolladores de CruiseControl y MSBUILD pretendían que las cosas funcionaran, pero funciona. Si necesitas que esto funcione ayer, podría ser el solución que estás buscando. ¡Buena suerte!

 12
Author: proudgeekdad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-01-20 18:37:54

Recuerdo haber hecho esto el año pasado para un proyecto de ClickOnce en el que estaba trabajando. Recuerdo que me tomó una eternidad averiguarlo, pero aquí está. Lo que quería que hicieran mis scripts era generar un instalador diferente que apuntara a nuestro dev env y otro diferente para prod. No solo eso, sino que lo necesitaba para inyectar la información de versiones correcta para que los clientes existentes 'se dieran cuenta' de que hay una nueva versión por ahí que es el punto de ClickOnce. En este script tienes que reemplazar con sus propios nombres de servidor, etc. El truco es guardar la publicación.htm y proyecto.publique el archivo e inyecte el nuevo número de versión en función de la versión que le proporcione CC.NET.

Aquí está cómo 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

 4
Author: fnCzar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-20 04:29:24

Solo puede pasar elabel{CCNetLabel} en la CCNET.config tarea msbuild sería una gran mejora.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-03 14:27:04

Desea utilizar las tareas de generación de manifiestos ClickOnce en msbuild. El proceso es un poco largo, así que solo voy a señalar a un par de enlaces. Aquí está la referencia en msdn y un artículo de muestra para comenzar.

 -1
Author: Dale Ragan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-08-15 17:22:33