¿Cuáles son las mejores prácticas en la implementación continua?

He escrito sobre esto en un blog antiguo (Siete pasos para la implementación continua). Todos esos 7 pasos siguen siendo válidos, pero adicionalmente hemos encontrado que el monitoreo es un paso extremadamente importante, por lo que ahora hay 8 de ellos.

  1. Prueba, pero sé inteligente al respecto
    Las pruebas automatizadas y la integración continua son la base de la implementación continua. Sin las pruebas automáticas adecuadas en su lugar, no podrá implementar todo el tiempo, ya que teme romper su aplicación. Probar primero sus flujos de trabajo más importantes y luego extender lentamente su conjunto de pruebas es un buen enfoque (consulte Comenzar con las pruebas de arriba a abajo).
  2. Construye pequeños servicios
    Las aplicaciones monolíticas son difíciles de mantener ya que la complejidad de la aplicación y el conjunto de pruebas crece exponencialmente. Dividir su aplicación en varios servicios más pequeños con interfaces bien definidas hace que sea mucho más fácil implementarlos de forma continua de forma independiente (consulte Microservicios)
  3. Facilite la recopilación de métricas
    Recopilar métricas técnicas y comerciales es cómo obtener información sobre su infraestructura. Necesita un sistema métrico robusto y fácilmente extensible. Intente no sentirse abrumado por demasiadas métricas al principio, sino más bien extienda sus métricas lentamente a medida que las necesite.
  4. Automatizar el despliegue
    Creemos en la infraestructura impulsada por el repositorio, por lo que despliega una nueva versión fusionando el código entre las sucursales en su repositorio y la automatización se hace cargo después de eso. Ejecuta sus pruebas y se implementa en su infraestructura sin ninguna interacción manual. Esto asegura que cada paso esté automatizado y crea confianza en el proceso a medida que se vuelve fácilmente repetible. Cuando confía en el proceso, lo implementará con más frecuencia.
  5. Automatizar Rollback
    Hemos encontrado que corregir un error al impulsar una nueva versión en lugar de retroceder es una opción mucho más fácil. Necesita copias de seguridad de datos, por supuesto. En el mejor de los casos, construya su infraestructura de manera que esté completamente automatizada y la reversión funcione exactamente igual que una nueva implementación.
  6. Implementar en la puesta en escena
    El código que no se está ejecutando en algún lugar ya está roto, así que impleméntelo en cada etapa de su proceso y ejecute al menos algunas pequeñas comprobaciones para que sepa que funciona en producción como infraestructura.
  7. Usa tu entorno de ensayo
    Siempre use la última versión de su propio software para que primero se vea afectado por cualquier pérdida de calidad y trabaje duro para resolver esos problemas.
  8. Implementar automáticamente en producción
    Ahora tiene experiencia con el proceso y cuenta con una red de seguridad, por lo que la implementación en producción debería ser fácil.

Esos principios nos han servido a nosotros y a muchos de nuestros clientes muy bien aquí en Codeship

Yo sugeriría:

  • Instalar con un botón
  • Buenas pruebas automatizadas, para cada confirmación, cada candidato y después de la implementación
  • Buenas pruebas de rendimiento de los candidatos y monitoreo del sistema implementado.
  • Buena supervisión del comportamiento, por lo que puede decir (por ejemplo) que el registro de nuevos usuarios se abandonó después de una implementación

blekko no implementa continuamente nuestra base de datos interna, solo nuestro front-end. Para esto, necesitamos

  • Cada demonio en el sistema debe reiniciarse independientemente y tener su propia versión de todas las bibliotecas de código +

Finalmente, debe mantener los ojos abiertos para las cosas que cambian para peor en el proceso general: ¿Las fallas intermitentes de las pruebas están causando problemas? ¿Tiene demasiados escapes de errores que causan demasiado impacto en los usuarios? ¿Sus codificadores son demasiado valientes o temerosos? Estos problemas pueden aparecer en una escala de tiempo de semana a mes, y debes estar atento para detectarlos antes de que te lastimen.

La implementación continua se trata de implementar pequeños cambios con frecuencia y configurar un ciclo de retroalimentación de los clientes a la ingeniería.

Todos los aspectos de implementación de un proceso de implementación continuo exitoso provienen de la identificación de errores y fallas que experimentan los clientes y luego de establecer mecanismos para evitar que las fallas vuelvan a ocurrir, al tiempo que se garantiza que los mecanismos no aumenten el tamaño de cada cambio implementado.

A finales de 2005, el proceso de IMVU podría definirse como código de verificación con frecuencia, empujar a producción, hacer clic en el sitio para asegurarse de que no haya nada roto. No es un proceso inusual para un equipo de ~ 4 ingenieros que trabajan en una aplicación web, pero aún contenía los elementos esenciales del “despliegue continuo”.

A medida que el uso del sitio y el equipo de ingeniería crecieron, agregamos procesos e infraestructura adicionales. Lo primero que agregamos fue un conjunto de pruebas. Escribimos la primera prueba porque nuestra aplicación cliente tenía un error que hacía que se bloqueara si el servidor devolvía un documento XML con formato incorrecto, y la primera prueba simplemente verificó que estaba bien formado. Una cosa simple, pero evitó 1-2 interrupciones del sitio por mes.

Este es un excelente ejemplo de cómo algo que será complicado para un equipo grande (múltiples tipos de pruebas para detectar diferentes clases de errores, corredores de prueba paralelos para mantener los tiempos de implementación en 5-10 minutos, protocolos para manejar fallas de prueba intermitentes, etc.) Puede comenzar como algo simple.

Otra área importante para la implementación continua es el monitoreo de la experiencia del cliente. Una vez más, comenzar de manera simple y agregar complejidad en respuesta a fallas reales es el camino a seguir. En IMVU comenzamos con un conjunto de gráficos que monitorean la métrica de la máquina (CPU y carga) y un sistema de alerta que verifica los tiempos de respuesta del servidor, entre otras cosas. Ambos son proxys imperfectos para la experiencia del usuario final, pero un lugar fácil para comenzar. Con el tiempo, agregamos gráficos y alertas adicionales sobre las métricas comerciales (por ejemplo, ingresos por minuto por método de pago, registros por minuto por canal) con una lógica de alerta cada vez más complicada ( http://www.evanmiller.org/poisso …).

Una tercera área importante para la implementación continua que reduce el riesgo de las implementaciones. La forma más sencilla de reducir el riesgo es asegurarse de que todos cometan código con frecuencia (también conocido como trabajo en pequeños lotes http: //www.startuplessonslearned …). Un pequeño cambio de código será mucho más fácil de revertir y depurar, que una gran característica desarrollada en el transcurso de semanas. Una segunda forma de reducir el riesgo es garantizar que tanto las implementaciones como las reversiones sean rápidas y confiables. Esto se vuelve más difícil a medida que aumenta el número de máquinas que se implementan: en IMVU creamos software para mantener múltiples versiones de la aplicación en todas las máquinas y cambiar entre ellas en cuestión de segundos.

More Interesting

¿Cuáles son algunos de los principales desafíos al diseñar sistemas distribuidos y cuáles son las soluciones más populares?

¿Qué es mejor invertir tiempo en: programación competitiva (programación algorítmica en sitios web como CodeChef o TopCoder) vs. desarrollo de software (desarrollo de aplicaciones, desarrollo web, etc.)? ¿Por qué?

¿Cuál es la diferencia práctica entre QA, QC y Tester?

¿Cuál es su día promedio en el trabajo como ingeniero de software / programador?

¿Qué separa a SaaS de los sitios web interactivos?

¿Hay situaciones o proyectos en los que el desarrollo de software ágil fallará o ha fallado?

Soy un estudiante de ingeniería. Estoy harto de la ingeniería a pesar de que estoy haciendo software. También estoy bastante harto de la vida en India. Quiero establecerme en Estados Unidos, principalmente en Nueva York. ¿Qué tipo de trabajos puedo obtener y cómo puedo conseguirlos para que me ayuden a vivir allí?

¿Cuál es la razón detrás de decir que el sánscrito es el lenguaje más adecuado para la programación?

¿Cuáles son las causas más comunes de falla del proyecto de software?

¿Quién tiene una gran idea de desarrollo de software que necesita implementación?

¿Cuál es un buen ejemplo de un servicio web eng design doc?

¿Cuál es alguna jerga utilizada por los ingenieros de software?

¿Es una buena idea usar desarrolladores de Java como probadores para la prueba de caja negra de errores / tareas?

¿Por qué no hay una plataforma de código abierto para desarrollar productos de software?

¿Para qué sirven los decoradores y los métodos de clase en Python? ¿Por qué y cuándo usarlos?