¿Cuáles son los flujos de trabajo óptimos para implementar la aplicación web?

Diría que el mejor flujo de trabajo es el que aumenta la velocidad alrededor del ciclo de retroalimentación popularizado por Eric Ries: “Construir, medir, aprender”.

Por esa razón, puede diferir dependiendo de la experiencia de las personas con cosas como el control de versiones y las pruebas de unidad / aceptación o el desarrollo impulsado por pruebas y la implementación continua. Si no tiene experiencia con estas cosas y requieren aprendizaje, puede ser mejor aprender gradualmente y quizás evitar algunos aspectos al principio para acelerar las iteraciones en torno a ese ciclo.

En Buffer (empresa), utilizamos Git para el control de versiones, y en este momento soy el único desarrollador, por lo que nuestro flujo de trabajo es desarrollar localmente y luego poner las cosas en vivo sin un sitio de prueba o pruebas. Estamos enfocados en minimizar el tiempo para poner las cosas frente a los ojos de nuestros usuarios y clientes para una verdadera validación, por lo que a menudo las sacamos en lotes muy pequeños, que podrían ser pequeños fragmentos de nuevas características o mejoras de UX a la vez. A medida que avanzamos y contratamos desarrolladores, estoy ansioso por implementar algunas pruebas unitarias y muchas pruebas de aceptación, para que podamos continuar avanzando rápidamente en el ciclo “Construir, Medir, Aprender”.

El primer paso absoluto es automatizar sus implementaciones. Es absolutamente crucial que la implementación del sitio sea un solo comando. He descubierto que Fabric (una herramienta de automatización escrita en Python) funciona extremadamente bien para esto: Capistrano es una alternativa popular que utiliza Ruby en su lugar.

Una política simple que puede ayudar es esta: nunca ejecute un comando en su servidor remoto sin ponerlo primero en un archivo Fabric. De esta manera, su implementación y configuraciones siempre serán repetibles, sin casi ningún esfuerzo adicional de su parte.

En Lanyrd, nuestro proceso de implementación ha evolucionado significativamente en los últimos 18 meses: nuestra configuración más reciente, diseñada por nuestro ingeniero Tom Insam, es más o menos mi situación ideal. Así es (aproximadamente) cómo funciona.

Nuestros servidores se ejecutan en EC2 y están configurados con Puppet. Los roles de Puppet se asignan como etiquetas EC2, lo que significa que podemos iniciar una nueva instancia de EC2, asignarle etiquetas (por ejemplo, servidor de aplicaciones, redis, cron-runner) y Puppet hará el resto de la configuración.

Cuando implementamos, especificamos un entorno (por ejemplo, desarrollo, puesta en escena o en vivo) y una rama o etiqueta git (el valor predeterminado es maestro). La configuración de nuestro entorno de ensayo es trivial debido a nuestras configuraciones de servidor alimentadas por Puppet; esto también significa que es obvio apagarlo cuando no lo estamos usando (por ejemplo, durante el fin de semana) para ahorrar en costos de servidor EC2.

También tenemos a Jenkins configurado para ejecutar nuestro conjunto de pruebas cada vez que alguien se compromete con nuestro repositorio git. Finalmente, tenemos un conveniente botón “desplegar maestro para vivir” (tratamos de mantener el envío maestro en todo momento, desarrollando funciones potencialmente de ruptura del sitio en una rama de funciones).

Hay una apuesta justa más que la anterior: tenemos la capacidad de retroceder a una versión anterior cambiando un enlace simbólico en caso de que rompamos el sitio, y hay algunas cosas adicionales para manejar empujando activos estáticos a S3 y ejecutando migraciones de bases de datos. En general, es una mejora enorme en mis scripts de tela pirateados anteriores, que en sí mismos fueron una gran mejora con respecto a las implementaciones ad-hoc a través de mucking con SSH.