Estoy buscando diferentes técnicas / herramientas que utiliza para implementar un proyecto de aplicación web ASP.NET ( NO un sitio web ASP.NET) en producción.
Estoy particularmente interesado en el flujo de trabajo que ocurre entre el momento en que su servidor Continuous Integration Build suelta los binarios en alguna ubicación y el momento en que la primera solicitud del usuario llega a estos binarios.
¿Está utilizando algunas herramientas específicas o simplemente XCOPY? ¿Cómo se empaqueta la aplicación (ZIP, MSI, ...)?
Cuando se implementa una aplicación por primera vez, ¿cómo se configura el grupo de aplicaciones y el directorio virtual (los crea manualmente o con alguna herramienta)?
Cuando cambia un recurso estático (CSS, JS o archivo de imagen), ¿vuelve a implementar toda la aplicación o solo el recurso modificado? ¿Qué pasa cuando cambia una página ASPX / ensamblado?
¿Realiza un seguimiento de todas las versiones implementadas para una aplicación determinada y, en caso de que algo salga mal, tiene procedimientos para restaurar la aplicación a un estado de trabajo conocido anterior?
Siéntase libre de completar la lista anterior.
Y esto es lo que usamos para implementar nuestras aplicaciones ASP.NET:
- Agregamos un proyecto de implementación web a la solución y lo configuramos para construir la aplicación web ASP.NET
- Agregamos un proyecto de instalación ( NO un proyecto de instalación web) a la solución y lo configuramos para que tome la salida del proyecto de implementación web.
- Agregamos una acción de instalación personalizada y en el evento OnInstall ejecutamos un ensamblado .NET de compilación personalizado que crea un grupo de aplicaciones y un directorio virtual en IIS usando System.DirectoryServices.DirectoryEntry (esta tarea se realiza solo la primera vez que se implementa una aplicación) . Admitimos múltiples sitios web en IIS, autenticación para directorios virtuales y configuración de identidades para grupos de aplicaciones.
- Agregamos una tarea personalizada en TFS para construir el proyecto de instalación (TFS no admite proyectos de instalación, por lo que tuvimos que usar devenv.exe para construir el MSI)
- El MSI está instalado en el servidor en vivo (si hay una versión anterior del MSI, primero se desinstala)
fuente
Respuestas:
Hemos implementado todo nuestro código en MSI mediante Setup Factory. Si algo tiene que cambiar, volvemos a implementar toda la solución. Esto suena exagerado para un archivo css, pero mantiene absolutamente todos los entornos sincronizados y sabemos exactamente qué está en producción (implementamos en todos los entornos de prueba y uat de la misma manera).
fuente
Realizamos una implementación continua en los servidores activos, por lo que no usamos proyectos de instalación; tenemos algo más parecido a CI:
robocopy asegura automáticamente que solo se implementen los cambios.
Re el grupo de aplicaciones, etc; Me encantaría que esto fuera automático ( ver esta pregunta ), pero por el momento es manual. Sin embargo, realmente quiero cambiar eso.
(Probablemente ayude que tengamos nuestro propio centro de datos y granja de servidores "en el sitio", por lo que no tenemos que cruzar muchos obstáculos)
fuente
approved
fuente? ramas?Sitio web
Implementador: http://www.codeproject.com/KB/install/deployer.aspx
Publico el sitio web en una carpeta local, lo comprimo y luego lo subo a través de FTP. El implementador en el servidor luego extrae zip, reemplaza los valores de configuración (en Web.Config y otros archivos), y eso es todo.
Por supuesto, para la primera ejecución, debe conectarse al servidor y configurar IIS WebSite, la base de datos, pero después de eso, la publicación de actualizaciones es muy fácil.
Base de datos
Para mantener las bases de datos sincronizadas, utilizo http://www.red-gate.com/products/sql-development/sql-compare/
Si el servidor está detrás de un montón de enrutadores y no puede conectarse directamente (que es un requisito de SQL Compare), use https://secure.logmein.com/products/hamachi2/ para crear VPN.
fuente
Implemento principalmente aplicaciones ASP.NET en servidores Linux y vuelvo a implementar todo, incluso para el cambio más pequeño. Aquí está mi flujo de trabajo estándar:
La verificación se realiza con la versión de línea de comandos de Subversion y la construcción se realiza con xbuild (msbuild funciona igual que el proyecto Mono). La mayor parte de la magia se realiza en ReleaseIt.
En mi servidor de desarrollo, básicamente tengo una integración continua, pero en el lado de la producción, en realidad, SSH en el servidor e inicio la implementación manualmente ejecutando el script. Mi script se llama inteligentemente 'implementar', por lo que es lo que escribo en el indicador de bash. Soy muy creativo No.
En producción, tengo que escribir 'implementar' dos veces: una vez para realizar el check-out, compilar e implementar en un directorio con fecha y una vez para convertir ese directorio en la instancia predeterminada. Dado que los directorios están fechados, puedo volver a cualquier implementación anterior simplemente escribiendo 'implementar' desde el directorio correspondiente.
La implementación inicial toma un par de minutos y la reversión a una versión anterior toma unos segundos.
Ha sido una buena solución para mí y se basa solo en las tres utilidades de la línea de comandos (svn, xbuild y releaseit), el cliente DB, SSH y Bash.
Realmente necesito actualizar la copia de ReleaseIt en CodePlex en algún momento:
http://releaseit.codeplex.com/
fuente
XCopy simple para ASP.NET. Ciérrelo, sftp al servidor, extráigalo en la ubicación correcta. Para la primera implementación, configuración manual de IIS
fuente
Contestando tus preguntas:
Para las DLL, implementamos las páginas DLL y ASPX modificadas.
Mantenerlo agradable y simple nos ha ahorrado muchos dolores de cabeza hasta ahora.
fuente
Como desarrollador de BuildMaster , esto es, naturalmente, lo que uso. Todas las aplicaciones se crean y empaquetan dentro de la herramienta como artefactos, que se almacenan internamente como archivos ZIP.
Manualmente: creamos un control de cambios dentro de la herramienta que nos recuerda los pasos exactos a realizar en entornos futuros a medida que la aplicación se mueve a través de sus entornos de prueba. Esto también podría automatizarse con un simple script de PowerShell, pero no agregamos nuevas aplicaciones con mucha frecuencia, por lo que es igual de fácil dedicar el minuto que lleva crear el sitio manualmente.
De forma predeterminada, el proceso de implementación de artefactos está configurado de manera que solo los archivos que se modifican se transfieren al servidor de destino; esto incluye todo, desde archivos CSS, archivos JavaScript, páginas ASPX y ensamblados vinculados.
Sí, BuildMaster se encarga de todo esto por nosotros. La restauración es principalmente tan simple como volver a ejecutar una promoción de compilación anterior, pero a veces los cambios en la base de datos deben restaurarse manualmente y se pueden producir pérdidas de datos. El proceso de reversión básico se detalla aquí: http://inedo.com/support/tutorials/performing-a-deployment-rollback-with-buildmaster
fuente
proyectos de instalación / configuración web, para que pueda desinstalarlo fácilmente si algo sale mal
fuente
Unfold es una solución de implementación similar a capistrano que escribí para aplicaciones .net. Es lo que usamos en todos nuestros proyectos y es una solución muy flexible. Resuelve la mayoría de los problemas típicos de las aplicaciones .net, como se explica en esta publicación de blog de Rob Conery.
Aquí hay una introducción y algunas otras publicaciones de blog.
Entonces, para responder a las preguntas anteriores:
¿Cómo se empaqueta la aplicación (ZIP, MSI, ...)?
Git (u otro scm) es la forma predeterminada de obtener la aplicación en la máquina de destino. Alternativamente, puede realizar una compilación local y copiar el resultado a través de la conexión remota de Powereshell
Cuando se implementa una aplicación por primera vez, ¿cómo se configura el grupo de aplicaciones y el directorio virtual (los crea manualmente o con alguna herramienta)?
Unfold configura el grupo de aplicaciones y la aplicación del sitio web mediante el módulo de administración web de Powershell. Nos permite (y a usted) modificar cualquier aspecto del grupo de aplicaciones o del sitio web.
Cuando cambia un recurso estático (CSS, JS o archivo de imagen), ¿vuelve a implementar toda la aplicación o solo el recurso modificado? ¿Qué pasa cuando cambia una página ASPX / ensamblado?
Sí, desplegar hace esto, cualquier despliegue se instala junto a los demás. De esa manera, podemos revertir fácilmente cuando algo sale mal. También nos permite rastrear fácilmente una versión implementada a una revisión de control de fuente.
¿Realiza un seguimiento de todas las versiones implementadas para una aplicación determinada?
Sí, desplegar mantiene las versiones antiguas. No todas las versiones, pero sí varias. Hace que retroceder sea casi trivial.
fuente
Hemos estado mejorando nuestro proceso de lanzamiento durante el año pasado y ahora lo tenemos controlado. Estoy usando Jenkins para administrar todas nuestras compilaciones y lanzamientos automatizados, pero estoy seguro de que podrías usar TeamCity o CruiseControl.
Entonces, al registrarse, nuestra compilación "normal" hace lo siguiente:
<MvcBuildViews>true</MvcBuildViews>
ingresé en mis archivos .csproj para compilar las vistas, msbuild fallaba aleatoriamente, así que tuve que deshabilitarlo)Si alguien hace clic en "Implementar en UAT":
Cuando hacemos clic en "Implementar en producción":
Toda una construcción completa para la producción lleva unos 30 segundos, con lo que estoy muy, muy contento.
Ventajas de esta solución:
Las principales desventajas de esta solución son:
¡Me encantaría escuchar otras posibles mejoras!
fuente
En 2009, de donde proviene esta respuesta, usamos CruiseControl.net para nuestras compilaciones de Integración Continua, que también produjeron Release Media.
A partir de ahí, usamos el software Smart Sync para compararlo con un servidor de producción que estaba fuera del grupo de equilibrio de carga y movimos los cambios hacia arriba.
Finalmente, después de validar la versión, ejecutamos un script de DOS que usaba principalmente RoboCopy para sincronizar el código con los servidores en vivo, deteniendo / iniciando IIS a medida que avanzaba.
fuente
En la última empresa para la que trabajé, solíamos implementar utilizando un archivo por lotes rSync para cargar solo los cambios desde la última carga. La belleza de rSync es que puede agregar listas de exclusión para excluir archivos específicos o patrones de nombre de archivo. Por lo tanto, excluir todos nuestros archivos .cs, archivos de soluciones y proyectos es realmente fácil, por ejemplo.
Estábamos usando TortoiseSVN para el control de versiones, por lo que fue bueno poder escribir varios comandos SVN para lograr lo siguiente:
Además de esto, hay un segundo archivo por lotes que solo verifica las diferencias de archivo en el servidor en vivo. Esto puede resaltar el problema común en el que alguien cargaría pero no confirmaría sus cambios en SVN. Combinado con el registro de sincronización mencionado anteriormente, podríamos averiguar quién era el posible culpable y pedirles que comprometieran su trabajo.
Y, por último, rSync le permite realizar una copia de seguridad de los archivos que fueron reemplazados durante la carga. Hicimos que los moviera a una carpeta de respaldo. Entonces, si de repente se dio cuenta de que algunos de los archivos no deberían haberse sobrescrito, puede encontrar la última versión de respaldo de cada archivo en esa carpeta.
Si bien la solución se sintió un poco torpe en ese momento, desde entonces la aprecio mucho más cuando trabajo en entornos donde el método de carga es mucho menos elegante o fácil (escritorio remoto, copiar y pegar todo el sitio, por ejemplo) .
fuente
Recomendaría NO solo sobrescribir los archivos de la aplicación existente, sino crear un directorio por versión y volver a apuntar la aplicación IIS a la nueva ruta. Esto tiene varios beneficios:
El único problema que hemos tenido es que los recursos se almacenan en caché si no reinicia el grupo de aplicaciones y confía en el cambio automático del dominio de la aplicación.
fuente