Estoy seguro de que muchos de ustedes han experimentado este problema. Un sitio web o aplicación web se está ejecutando y está en vivo Desea cargar la próxima versión, pero no ha descubierto todo, como establecer un valor en falso en el archivo de configuración, insertar otro registro en la base de datos y hacer muchas cosas menores que a veces pueden contar hasta 20 o más parámetros.
Tan pronto como cargue la nueva versión, todo se rompe. Ahora, solucionar el problema solo puede llevar hasta 20 minutos, pero el estrés general que tolera y los daños financieros y de buena voluntad de la empresa a veces no son olvidables.
¿Cuáles son las formas de reducir este tipo de errores que surgen de la configuración inicial de la implementación de una nueva versión?
PD: No mencione las listas de verificación, porque ya las tenemos. El problema con las listas de verificación es que siempre deben actualizarse, pero no lo harán.
fuente
Respuestas:
Dos cosas:
Hay otras cosas que se pueden hacer.
Sugiero leer la serie de blogs de 5 partes sobre la implementación automatizada por Troy Hunt. Las herramientas que utiliza son específicas de MS stack, pero los conceptos son universales.
fuente
Me pregunto por qué nadie mencionó el Control de versiones , que es una de las formas más importantes para evitar problemas durante la actualización / actualización.
Primero, su despliegue debería ser solo un clon de la rama estable en su repositorio. Todo, incluidos los archivos de configuración, los archivos SQL, los scripts de instalación / actualización DEBEN ser controlados por la versión.
En segundo lugar, debe tener "algún tipo de" área de preparación, podría ser cualquier cosa: un servidor local, un servidor virtual en la nube temporal que acaba de generar, una configuración de host virtual muy simple o una aplicación personalizada completa que mantienes junto con la aplicación principal. La diferencia entre esta "área de preparación" y su "área de desarrollo" es que la primera modela más (o simula) su entorno de implementación real. Por ejemplo, puede desarrollar en PHP 5.3.x con el módulo Apache, pero como su host es PHP 5.2.x con FCGI, su área de preparación debe ser la misma.
Luego, primero escribe y prueba sus actualizaciones en su entorno de desarrollo. Combine esos cambios en el repositorio del área de ensayo y vuelva a probar. En este punto, puede hacer cualquier cambio en su configuración para adaptarse a su implementación, ya que está controlado por la versión, no se perderá nada y siempre puede volver en caso de problemas.
Finalmente, combine los cambios del área de preparación en su copia de implementación en vivo.
La complejidad de su área de preparación debe reflejar la complejidad y el alcance de su aplicación. Pero en cualquier caso, el control de versiones es indispensable.
Por supuesto, si no usa el Control de versiones, nada de esto aplica, pero es tan ingenuo como escribir una base de datos en Logo.
fuente
Como se sugiere, use un sistema de estadificación . Esto le brinda la oportunidad de probar sus cambios en un entorno en vivo.
Esto trae otro punto: tener probadores . Probar las cosas que escribí yo mismo no encuentra tantos errores como cuando alguien más prueba mi aplicación.
Otra cosa: automatice su proceso de implementación . Realice migraciones de db con ant migrate, implemente la versión más nueva automáticamente desde svn a través de capistrano, etc. Cuando implemente algo, no debería tener que hacer más que solo un clic y todo es automático. Especialmente para los sitios web que necesitan un poco de configuración, los pasos manuales necesarios para la implementación son una pesadilla y la posibilidad de que algo salga mal es enorme.
fuente
Para algo que absolutamente no debe romperse, considere tener un sistema A y B y use un equilibrador de carga para enrutar todas las solicitudes a A mientras actualiza y prueba B, y luego enrute todo a B mientras actualiza A.
Para obtener puntos de bonificación, agregue C y asegúrese de que sus sistemas estén separados geográficamente para que un terremoto no elimine 2 de ellos simultáneamente.
Para muchas aplicaciones, admito que esto es exagerado.
También complica cualquier gestión de transacciones que necesite hacer, pero los problemas no son insuperables.
fuente
Sí, necesita un entorno de prueba o de ensayo en el que siga todos los pasos, pero es obligatorio mantener archivos de configuración separados para entornos separados.
Básicamente, en mis scripts de compilación e implementación, tomo una propiedad de entorno que buscará los archivos de metadatos específicos del entorno, como los archivos XML, y los reemplazará en mi ubicación de compilación antes de empaquetarlos. Además, en mis scripts de implementación, buscaré cualquier archivo SQL en las actualizaciones de la base de datos y también los ejecutaré en la base de datos configurada para ese entorno.
Podría hacer esto con una tarea de compilación personalizada, pero en realidad solo uso algunas pruebas JUnit para hacer esto por mí. Si se produce alguna excepción de SQL, la prueba falla y, por lo tanto, la implementación falla. En términos generales, también los scripts SQL tienen inteligencia, si los datos necesarios ya existen en el entorno, se saltan la inserción o la actualización.
También tengo un directorio similar para scripts de lotes o shell que necesito ejecutar para un entorno específico.
Lo que dice todo en su pregunta es esto: siempre deben actualizarse, pero no lo harán.
Estas configuraciones impulsan sus compilaciones e implementaciones automatizadas, por lo que si NO las actualiza, sus compilaciones fallarán y su gerente recibirá un correo electrónico al respecto. Es tan importante para el equipo mantener las configuraciones de compilación y despliegue para una versión específica como lo es para ellos verificar el código que compila. Cualquiera de las infracciones rompe la construcción.
En resumen, una mayor adopción de los principios de integración continua (CI) ayudará a eliminar el dolor de los lanzamientos de producción.
fuente
1) Primero implemente en el sitio de prueba y pruebe sus cambios
2) Tener toda la configuración en un archivo de configuración (configuración web o similar). Esta configuración debería ser específica para la aplicación y nunca sobrescribirse. Cualquier cambio es luego deliberado en lugar de olvidar cambiar algo que debería ser diferente de la prueba.
fuente
Además de las excelentes sugerencias anteriores para tener un entorno de preproducción y usar pruebas automatizadas:
Reduce la complejidad de la base de código. Menos código, generalmente, significa menos errores y es más fácil encontrarlos. Esta es la filosofía detrás de la refactorización, separación de preocupaciones, etc.
Segmentar la base de código . Un enfoque común es separarlo en:
Esta comprensión de su base de código le permite centrar su desarrollo y pruebas en las partes centrales, ya que los errores allí tendrán el efecto más drástico.
fuente
Un lanzamiento bien ejecutado tiene que ver con la planificación y la comunicación. Entonces, antes de realizar un lanzamiento, considere estas preguntas:
¿Cuánto tiempo durará la versión, y existe algún riesgo de permitir que las personas continúen interactuando con mi producto mientras la versión está en marcha? Si existe un riesgo para el sistema, considere desconectar el sistema y colocar en su lugar un mensaje de "Sistema en mantenimiento actual".
¿Hay algún cliente que deba notificar sobre el lanzamiento con anticipación? ¿Debo informarles sobre una posible interrupción del servicio o una degradación del rendimiento mientras se realiza el lanzamiento? Personalmente, siempre me equivoco al comunicarme en exceso y decirles a todos los clientes sobre una próxima ventana de lanzamiento o mantenimiento en un blog público o un lugar similar.
¿Cuáles son mis planes de contingencia si el lanzamiento sale mal? Por ejemplo, si el lanzamiento es deficiente, ¿deberíamos retroceder y restaurar el sistema a la forma en que se minimizaría cada vez que estemos desconectados? Y si es así, ¿están bien documentados los pasos para deshacer una versión? ¿O debería tener a las personas adecuadas de guardia o disponibles para ayudar con la resolución de problemas en caso de que ocurran? Personalmente, creo que la mejor manera de abordar la planificación de cualquier lanzamiento es asumir que algo saldrá mal con el lanzamiento. De esa manera me obligué a pensar en algunos de estos temas con anticipación.
Luego, cuando se trata de ejecutar un lanzamiento, una de las mejores maneras de garantizar que funcione sin problemas es practicar, practicar, practicar y documentar todo lo que encuentre en el camino. Por lo tanto, mucho antes de implementar un nuevo código en producción, primero practique la implementación del código en un entorno de ensayo seguro y debidamente protegido. Haga que la persona que se encargará de la implementación en producción realice la implementación de prueba hasta la puesta en escena. Considera este tu ensayo general y compórtate como lo harías si fuera real. Documente todo lo que hace en cada paso del camino; documente cada comando que ejecute, cualquier código SQL que ejecute, cualquier archivo que modifique y cómo los modificó, y para cada paso del camino documente lo que espera ver si el procedimiento se ejecuta correctamente. Si encuentra algún problema de algún tipo, documente lo que hizo para resolverlo.
Luego se completa la implementación de la práctica, revise sus notas y vea si puede refinar el proceso para eliminar errores. Luego hazlo todo de nuevo . Siga practicando hasta que ejecutar una versión sea tan rutinario como seguir una hoja de instrucciones simple, como "iniciar sesión en esta máquina, ejecutar este comando; luego iniciar sesión en la base de datos y ejecutar este comando SQL; luego ..."
A continuación se enumeran las cosas que puede hacer un equipo de operaciones o de administración de versiones para ayudar a que una versión funcione sin problemas. Pero, ¿qué puede hacer la ingeniería para ayudar a minimizar los riesgos en una versión?
Mantenga los lanzamientos pequeños. En pocas palabras, cuanto más complejo sea el conjunto de cambios de código contenidos en un lanzamiento, más riesgoso será el lanzamiento. Haga un favor a su equipo de operaciones planeando tener un mayor número de lanzamientos pequeños, en lugar de un número menor de lanzamientos grandes durante el mismo período de tiempo.
Prueba, prueba, prueba. No solo pruebe su código en su entorno de control de calidad, utilice el entorno de ensayo para probar también su software. A menudo hay errores que tienen poco o nada que ver con el código en sí, sino que tienen una causa raíz que radica en la configuración del entorno (o alguna combinación de ambos). Para encontrar estos problemas, debe probar su código en un entorno que refleje de cerca la producción, también conocida como puesta en escena.
Como última palabra, a veces lo más importante no es lo que hacemos para evitar que las cosas salgan mal, sino cómo nos comportamos cuando sí salen mal. Por lo tanto, creo que es importante construir una cultura en su empresa en torno a la transparencia operativa. No intente ocultar problemas de los clientes, sea comunicativo. Use Twitter activamente para informar a los clientes si hay problemas de los que su equipo de operaciones está al tanto y está trabajando para resolverlos (¡ Lighthouse es increíble en esto!). Considere publicar una página de "estado" para su servicio que los clientes puedan consultar para ver si algo está mal ( TypePad ofrece un gran ejemplo de esto). En pocas palabras, siempre errar del lado de la sobrecomunicación. Tus clientes te lo agradecerán.
fuente
Muchas respuestas aquí ya le dicen cómo implementar su solución específica al problema, pero, por lo que puedo decir, el problema real no es migrar / actualizar un sitio web correctamente. Puede ser que el diseño / arquitectura detrás de esto sea frágil.
Si eso es cierto, tendrá que ajustar la arquitectura para su sistema de modo que sea lo suficientemente robusto como para continuar funcionando correctamente incluso si los ajustes de configuración cambian o no están configurados correctamente, y de modo que se degrade con gracia si ocurren. Idealmente, si ha agregado una nueva funcionalidad o ha cambiado la antigua funcionalidad de manera que requiera una nueva columna de base de datos, su sitio funcionará incluso si falta la columna (tal vez sin la nueva funcionalidad o con una forma degradada de la antigua funcionalidad) . Su cliente no debería estar perdiendo dinero; en el peor de los casos, podría no estar obteniendo dinero nuevo de las mejoras que ha introducido.
Si su sistema es lo suficientemente frágil como para que los ajustes de configuración puedan causar problemas tan graves, las actualizaciones del programa no serán las únicas fuentes de problemas, y descubrir cómo hacer las actualizaciones de manera segura solo aumentará el daño que experimentará cuando surja una falla. Una fuente diferente.
fuente