¿Cómo se actualizan los sitios web en vivo con cambios de código?


21

Sé que esta es una pregunta muy básica. Si alguien pudiera hacerme caso y decirme cómo manejarían esto, estaría agradecido.

Decidí publicar esto porque estoy a punto de instalar SynchToy para solucionar el problema a continuación, y me siento un poco poco profesional usando un "Juguete", pero no puedo pensar en una mejor manera.

Muchas veces, cuando me encuentro en esta situación, me falta una forma dolorosamente obvia de hacer las cosas: esto es ser el único desarrollador de la empresa.

  • Aplicación web ASP.NET desarrollada en mi computadora en el trabajo
  • La solución tiene 2 proyectos:
    • Sitio web (archivos)
    • WebsiteLib (C # / dll)
  • Usando un repositorio Git
  • Implementado en un servidor web GoGrid 2008R2

Despliegue:

  1. Haz cambios en el código.
  2. Empuja a Git.
  3. Escritorio remoto al servidor.
  4. Tire de Git.
  5. Sobrescriba los archivos en vivo arrastrando / soltando con Windows Explorer.

En el Paso 5 elimino todos los archivos de la raíz del sitio web ... esto no puede ser algo bueno. Es por eso que estoy a punto de instalar SynchToy ...

ACTUALIZACIÓN: GRACIAS por todas las respuestas útiles. No puedo elegir cuál marcar la respuesta, entre usar una implementación web, parece que tengo varias sugerencias útiles:

  1. Proyecto web = sitio completo empaquetado en un solo archivo DLL - desventaja para mí no puedo enviar actualizaciones simples - siendo un desarrollador solitario en una compañía de 50, esto sigue siendo algo que es más simple a veces.
  2. Al pasar directamente de SCM a la raíz web del sitio, originalmente no hice esto por temor a que mi directorio oculto de SCM pudiera quedar expuesto, pero las respuestas aquí me ayudaron a superar eso (aunque todavía no me gusta tener uno más de lo que preocuparse por olvidar para asegurarse de que sigue siendo cierto con el tiempo)
  3. Usar una granja de servidores web e implementar sistemáticamente en nodos: esta es la solución ideal para el tiempo de inactividad cero, que en realidad es algo que me importa, ya que el sitio es esencialmente una fuente de ingresos en tiempo real para mi empresa; podría ser difícil convencerlos de que aunque el doble del costo de los servidores.

-> finalmente, la reafirmación del principio básico de que debe haber un despliegue de un solo clic para el sitio O, DE OTRA MANERA, ALGO MALO es probablemente lo más útil que obtuve de las respuestas.

ACTUALIZACIÓN 2: pensé en volver a esto y actualizar con la solución real que ha estado en funcionamiento durante muchos meses y que funciona perfectamente (para mi solución de servidor web único).

El proceso que uso es:

  1. Hacer cambios de código
  2. Empujar a Git
  3. Escritorio remoto al servidor
  4. Tire de Git
  5. Ejecute el siguiente script por lotes:

    cd C: \ Usuarios \ Administrador

    % systemroot% \ system32 \ inetsrv \ appcmd.exe detiene el sitio "/site.name:Sitio web predeterminado"

    robocopy Documents \ code \ da \ 1 \ work \ Tree \ LendingTreeWebSite1 c: \ inetpub \ wwwroot / E / XF connectionsconfig Web.config

    % systemroot% \ system32 \ inetsrv \ appcmd.exe sitio de inicio "/site.name:Sitio web predeterminado"

Como puede ver, esto hace que el sitio se caiga, utiliza robocopy para copiar de manera inteligente los archivos que han cambiado y luego vuelve a hacer que el sitio vuelva a funcionar. Por lo general, se ejecuta en menos de 2 segundos. Dado que el tráfico máximo en este sitio es de aproximadamente 2 solicitudes por segundo, es aceptable que falten 4 solicitudes por actualización del sitio.

Sin embargo, me he vuelto más competente con Git. He descubierto que los primeros cuatro pasos anteriores como un "proceso manual" también son aceptables, aunque estoy seguro de que podría hacerlo todo en un solo clic si quisiera.

La documentación para AppCmd.exe está aquí . La documentación para Robocopy está aquí .


66
Mejor ajuste para serverfault.
Karl Bielefeldt

Debería considerar SSHing en su servidor en lugar de usar un escritorio remoto, de esa manera puede hacer un script de implementación si lo desea.
Malfist

55
Creo que esta pregunta está bien para quedarse aquí. La implementación de un sitio web me parece una preocupación del desarrollador más que un trabajo de administrador de sistemas, aunque supongo que eso podría variar según la empresa. Aún así, todas las respuestas hasta ahora están centradas en el desarrollador.
Adam Lear

1
@Malfist: ¿cómo exactamente uno ssh en un servidor de Windows?
Wyatt Barnett

@Wyatt Al ejecutar un servidor SSH en la máquina remota, (casi lo mismo) que lo haría en una caja de Linux.
Adam Lear

Respuestas:


3

Debe consultar la implementación web de VS 2010. Si GoGrid lo admite, el paquete de implementación web es una buena solución.

http://weblogs.asp.net/scottgu/archive/2010/07/29/vs-2010-web-deployment.aspx


cuando usa la implementación web, pierde la opción de revisión, ¿no? Sé que hay muchas personas que no quieren hacer algo fuera del proceso formal, pero me gusta tener la opción de emergencias ...
Aaron Anodide

Lo haces, buen punto. Sé que en mi empresa no queremos que la gente haga eso, porque no podemos rastrear los cambios. Sin embargo, para sitios personales, realmente me gusta tener esa opción.
Nate

3

En mi empleador anterior, para implementar cambios en el código, configuraríamos el equilibrador de cargapara dejar de servir a un servidor web. Las sesiones en el primer servidor web pueden tardar 20 minutos en caducar. Actualizamos el código en ese servidor web descomprimiendo el archivo zip de implementación, luego verificamos que todo funcione bien presionando la dirección IP directa para ese primer servidor web. Cuando estamos convencidos de que funciona bien, configuramos el equilibrador de carga para que llegue al servidor web ahora actualizado y esperemos a que las sesiones expiren en otro servidor y luego lo actualizamos (y así sucesivamente hasta que se hayan actualizado todos). Después de que salieron bien, configuramos el equilibrador de carga para que vuelva a hacer su trabajo. Esto se complicó cuando tuvimos hasta 10 servidores web conectados al equilibrador de carga durante las cargas estacionales pico (por lo que actualizarlos uno por uno podría llevar horas porque no podíamos cerrar el sitio web en vivo; los clientes tenían que poder obtener al sitio).

En ASP.NET, si suelta cualquier archivo nombrado App_Offline.htmen el directorio raíz de un sitio web, se descarga ese webiten que le permitirá actualizar el DLLS (y lo que sea). IIS mostrará una página titulada "Aplicación sin conexión". Cuando se elimina el archivo, se le cambia el nombre o se elimina, la aplicación web se reiniciará e IIS mostrará páginas web en ese sitio web. Esto es lo que hace Visual Studio cuando publica un sitio web desde dentro de VS.


2

Por lo general, lo que hago es mantener todo en un repositorio SVN. Cuando termino con algunos cambios, me comprometo en el sitio de desarrollo y luego pago en producción. Mantiene todo sincronizado, es rápido y fácil. Si pagar es demasiado complicado, puede configurar Apache con WebDAV y lo hará por usted.


¿le preocupa que cosas como el directorio .svn estén presentes en su sitio en vivo?
Aaron Anodide

En realidad no, apache generalmente está configurado para denegar el acceso a esas carpetas.
Malfist

IIS también niega .svn (o .git o .hg) de manera predeterminada.
Wyatt Barnett

Si un usuario malintencionado obtiene acceso al directorio, él / ella tendrá acceso a todo el código en estado claro.
oleksii

55
Si un usuario malintencionado tiene acceso a su sistema de archivos, tiene más cosas de qué preocuparse.
Malfist

2

Para cada una de mis aplicaciones web tengo una configuración de repositorio git con tres ramas. Live, Beta, Características. Live es, por supuesto, el sitio en vivo. Beta es el sitio utilizado para corregir errores o para la prueba final de funciones justo antes de la implementación. Luego, como dijiste, hago un simple git push, git pull on live para extraer la información. Las características se utilizan para las mejoras de la "próxima versión".


Lo mismo funciona con casi todos los sistemas de control de fuente.
deadalnix

2

Estás tratando de resolver el problema de la entrega continua . Inicialmente comenzaría con pasos manuales, pero pronto se dará cuenta de los problemas. Estos son los más comunes:

  1. El código funciona en tu PC, no funciona en producción
  2. Nuevo cambio rompe el viejo código
  3. Los cambios incrementales harán que sea cada vez más difícil de implementar, obtendrá nuevas bibliotecas para adjuntar, parches para aplicar, etc.

Echa un vistazo a TeamCity (o cualquier herramienta similar).


2

Use una secuencia de comandos automatizada de construcción e implementación

La mejor manera de hacerlo es utilizar un script de compilación y despliegue automatizado como MsBuild o Nant.

La razón es que simplemente puede escribir 1 comando para desplegar un sitio web y luego simplemente escribir 1 comando para revertirlo. Y si es lo suficientemente exhaustivo, esto incluirá las migraciones de su esquema de base de datos. (Migrator.Net)

Una de las razones principales para no usar SVN o GIT para implementar es que el entorno puede cambiar entre producción y puesta en escena. En su script NANT puede hacer que cree sus archivos .config específicamente para el entorno al que se dirige. Esto ahorra el olvido de ingresar una configuración de configuración en producción.

También automatiza todo el proceso, por lo que se convierte en un asunto de un solo comando, y cualquier número de procesos manuales se convierte en un proceso simple.


1

En primer lugar, deberías estar usando un proyecto web. ¿Cuáles son las diferencias que preguntas?

Un proyecto web combinará todos los archivos de clase C # (código detrás incluido) en una sola DLL (mejor por seguridad, y el hecho de que es un archivo para mover)

En segundo lugar, debe publicar la aplicación y luego aún puede usar el escritorio remoto, arrastrar todos los archivos a su carpeta de publicación y simplemente configurarlo para sobrescribir (los archivos nuevos reemplazarán a los archivos antiguos).

La publicación colocará todos los archivos necesarios para la aplicación en una carpeta.


1

Mi empleador actual se despliega usando títeres . (Aquí hay más paquetes de software que abordan el mismo problema).

Mi empleador anterior usaba un sistema de control de trabajo personalizado para manejar la implementación de software, reiniciar, etc. Incluso si estaba disponible, era demasiado para sus necesidades.

El empleador que tenía antes tenía guiones personalizados para copiar datos de la subversión a los servidores y hacer un reinicio continuo.

Varios lugares que vi anteriormente tenían archivos para administrar la implementación. En general, utilizaron una estrategia como cortar la mitad de los servidores web del equilibrador de carga, esperar, detener esa mitad, extender el código, reiniciarlos, luego voltear el equilibrador de carga, esperar, detener la otra mitad, reiniciarlos y luego recuperar el equilibrador de carga arriba.

En todos los lugares en los que he trabajado, el despliegue del código era un solo comando, o la falta de ser un solo comando se reconoció como un problema a solucionar.


1

Por lo general, lo que usamos para resolver este problema con nuestros sitios web es una herramienta incluida en Systems Internals llamada junction.

Con esta herramienta, podemos crear enlaces de un directorio a otro. La raíz de la aplicación en el servidor contiene 3 carpetas. Rojo, Azul, Actual. IIS está configurado para mirar siempre Current para sus archivos.

Puede emitir un comando junction currentque le dirá a qué carpeta apunta actualmente. Digamos, por ejemplo, que actualmente apuntaba a Azul. Lo que haríamos sería poner en cola los archivos en rojo para la nueva implementación y asegurarnos de que toda la configuración estuviera lista para funcionar.

Una vez que estemos listos, podemos emitir el comando junction current redpara que se vuelva a señalar.

Hay dos cosas que hacen que esta solución sea tan genial

1) Tienes todo el tiempo del mundo para poner en cola tus cambios en la carpeta. Sin prisas y el único tiempo de inactividad es cuando el grupo de aplicaciones está girando. (También hay una manera de precompilar este paso).

2) Si algo falla con su implementación, todo lo que tiene que hacer para revertir es emitir un comando en lugar de intentar revertir los cambios. El comando en nuestro caso seríajunction current blue

Esperemos que nuestra forma de hacer las cosas pueda arrojar algo de luz sobre una nueva solución para usted.


0

Lo que he hecho y no estoy seguro si tiene el alcance para esto, pero aquí va. Un desarrollador verificaría el código en una rama de control de calidad y luego un ingeniero de sistemas lo cargaría en un entorno de control de calidad, una vez que haya pasado el control de calidad pasará a la rama de producción. Hubo al menos 2 de cada sitio conectado a un servidor en un equilibrio de carga, y en este caso, uno de los dos servidores se desconectaría, se detendría, el sitio se archivaría y el nuevo sitio se implementaría junto con cualquier cambio que se requiera, se reiniciará y luego pasará al siguiente servidor. Todo esto fue programado usando C # en nuestro caso, pero se hizo en el pasado usando el script vb. Espero que eso ayude. Aclamaciones

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.