La siguiente es una publicación invitada de Florian Motlik. Florian es CTO de Codeship, una plataforma de implementación continua e integración continua alojada. ¿Qué diablos es eso, podrías preguntar? Es una especie de filosofía y conjunto de herramientas para trabajar en sitios web. Quizás sea un poco demasiado simplificado, así que dejaré que Florian se lo explique.
Un gran flujo de trabajo de desarrollo hará que sus buenos desarrolladores sean excelentes y que sus excelentes desarrolladores sean excepcionales. Un mal flujo de trabajo reducirá la productividad de sus mejores ingenieros a un nivel junior y hará que desearía que trabajara en otro lugar.
Es de vital importancia para cada equipo y especialmente para los líderes de esos equipos poner en orden su flujo de trabajo de desarrollo. Dos mejores prácticas que han ganado mucha tracción en los últimos años son la integración continua y la implementación continua. Aquí hay algunas definiciones rápidas.
Integración continua es la práctica de probar cada cambio realizado en su base de código de forma automática y lo antes posible.
Despliegue continuo sigue las pruebas que ocurren durante la Integración Continua e impulsa los cambios a un sistema de producción o puesta en escena. Esto asegura que se pueda acceder a una versión de su código en todo momento.
Primero, analizaremos de cerca la Integración Continua y le mostraremos cómo comenzar con las pruebas. Luego, pasaremos a la implementación continua, que es el siguiente paso lógico.
Con ambos en su lugar, su equipo de desarrollo será mucho más eficiente.
Integración continua
La automatización es la piedra angular de un gran flujo de trabajo de desarrollo. Todas las tareas que puede realizar una máquina deberían serlo. La automatización le da tiempo para concentrarse. Las pruebas son una de esas tareas.
A través de las pruebas, puede estar seguro de que los pasos más importantes que darán sus clientes a través de su sistema están funcionando, independientemente de los cambios que realice. Esto le da la confianza para experimentar, implementar nuevas funciones y enviar actualizaciones rápidamente.
Empiece a probar en la parte superior
Las buenas pruebas comienzan con ver la aplicación desde la perspectiva del usuario. ¿Cuáles son los flujos de trabajo típicos? ¿Qué funciones y pasos siguen los usuarios con frecuencia?
Entonces comience a probar con eso en mente. Utilice herramientas como Selenium o PhantomJS para asegurarse de que funcionen esos importantes flujos de trabajo.
Una excelente manera de determinar los flujos de trabajo más críticos es hacer que todos los miembros de su equipo escriban una lista de ellos y luego combinen esas listas. Puede leer una guía detallada de esta técnica en una de las publicaciones de nuestro blog.
Aquí hay una lista de herramientas que puede usar para comenzar a probar la IU:
- Jazmín (JavaScript)
- Selenio (pruebas frontend)
- CasperJS (pruebas de frontend)
- Pepino o lechuga (pruebas basadas en el comportamiento para Ruby y Python)
A partir de esta sólida base de pruebas que garantizan que los flujos de trabajo estén funcionando, puede profundizar y comenzar a realizar pruebas unitarias en diferentes partes de su sitio. Pero tenga cuidado: sus clientes quieren que su interfaz de usuario funcione, ¡así que asegúrese de que funcione con cada cambio!
Con todas esas herramientas en la mano, el paso más importante que puede tomar para realizar las pruebas es comenzar. Vale la pena de inmediato, y no solo desde una perspectiva tecnológica. Puede leer sobre las ventajas comerciales de la integración continua en esta publicación de blog de Joe Green.
Ejecute sus pruebas continuamente
Los humanos cometemos errores. A veces, las personas consideran que un cambio es tan pequeño que no es posible que rompa la aplicación, por lo que no ejecutan pruebas. Entonces su producto cae y nadie sabe por qué.
Las pruebas automatizadas solo pueden mostrar su verdadero poder cuando las ejecuta continuamente y para cada cambio. Deben ejecutarse en un sistema automatizado e independiente para evitar el síndrome “Funciona en mi máquina”. Solo si la infraestructura de integración continua le indica que las pruebas pasan, las pruebas pasan.
La ventaja de ejecutar todas las pruebas de inmediato para cada cambio es que sabe de inmediato si algo se rompió. Considere trabajar en un sprint de 2 semanas. En el segundo día del sprint, uno de sus desarrolladores cambia algo que rompe una prueba. Si no ejecuta continuamente todas las pruebas, existe la posibilidad de que nadie detecte el problema. La gente sigue trabajando y, al final del sprint, vuelve a ejecutar todo el conjunto de pruebas. La prueba falla. Han pasado 2 semanas desde que se comprometió el cambio radical. Encontrar el cambio que rompió las pruebas es increíblemente difícil, ya que ha habido muchas confirmaciones desde entonces.
Muchos equipos tienen ciclos más largos que 2 semanas. Esto es increíblemente derrochador y se puede prevenir fácilmente ejecutando todas sus pruebas cada vez que uno de sus desarrolladores inserta código en el repositorio. Cualquier falla se puede solucionar de inmediato.
La integración continua es el primer paso, pero muy importante, de la implementación continua.
Si desea obtener más información al respecto, Martin Fowler ha publicado un artículo excelente y muy detallado sobre Integración continua en su blog.
Despliegue continuo
El código se pudre si no se ejecuta en alguna parte. Se actualizan las dependencias externas, se instalan los paquetes del servidor, se cambian las API o se reemplazan los sistemas operativos. A menudo, no tenemos la capacidad de controlar cada parte de nuestra infraestructura. Dependemos de otros productos y empresas para mantener partes de nuestra pila. Todos estos cambios pueden dañar tu aplicación sin que te des cuenta.
Es por eso que la implementación continua es increíblemente importante. Siempre que la rama de desarrollo principal de su repositorio pase todas las pruebas, debe enviar su código al menos a un entorno de prueba o, en el mejor de los casos, a producción. Su equipo de desarrollo o de control de calidad puede revisar la última versión de su aplicación y enviar comentarios. Además, puede ejecutar pruebas contra ese sistema de ensayo para asegurarse de que funciona en un entorno similar a la producción.
Esto le ayuda a encontrar problemas temprano y solucionarlos mientras aún es barato. Un concepto importante que hay que comprender al comenzar con la implementación continua son las canalizaciones de implementación.
Canalizaciones de implementación
Una canalización de implementación define todos los pasos necesarios para pasar de su base de código al sitio web de producción. Automatizar estos pasos es crucial para tener implementaciones rápidas. Pero a menudo, las canalizaciones de implementación también incluyen pasos manuales, como un gerente de producto que firma una nueva versión.
Las canalizaciones de implementación deben ser fáciles de seguir y replicar. Esto le permite impulsar nuevos cambios con regularidad. Especialmente cuando necesita enviar una solución, los pasos predefinidos pueden evitar que cause más daño a su sitio.
Una vez que configure una canalización de implementación y automatice los pasos, estará en condiciones de enviar pequeños cambios rápidamente, obtener comentarios de sus clientes e iterar sobre su producto. Esta es una ventaja competitiva importante para otras empresas que necesitan mucho tiempo para reaccionar a los comentarios de los clientes. Intercom hizo una excelente publicación de blog sobre esto.
Es sorprendente lo mucho que se ha reducido el costo de llevar un nuevo producto de software al mercado en los últimos años. Nunca ha sido más fácil o más barato crear un software excelente. Esto nivela el campo de juego entre usted y su competencia. Necesita enviar nuevas funciones más rápido que su competencia mientras brinda una calidad mejor y estable a largo plazo. La implementación continua es una de las técnicas que lo ayudarán a lograrlo.
¿Cómo puedo empezar?
Después de entrevistas con docenas de empresas y los comentarios de miles de desarrolladores que utilizan nuestro producto, hemos identificado varios pasos que puede seguir para comenzar con la implementación continua.
Prueba prueba prueba, pero sé inteligente al respecto
La prueba es el primer paso que debe tomarse. Debe llegar a un punto en el que pueda cambiar casi cualquier parte de su sistema y asegurarse de no haber roto ninguna otra función porque sus pruebas detectarán esos errores. Una vez que estás en este punto, te liberas de tener que pensar en los impactos que este cambio podría tener. Ahora puede experimentar con su producto e iterar para crear exactamente lo que sus clientes quieren y pagan.
Las pruebas no están ahí para hacer felices a sus desarrolladores. Están ahí para construir un producto estable y de alta calidad para sus usuarios. Son una herramienta para mantener contentos a sus usuarios e introducir cambios sin destruir su experiencia. Construir un producto sin probarlo de manera adecuada y automática (como lo usarían sus usuarios) significa trabajar con las manos atadas a la espalda. Es posible que obtenga nuevas funciones, pero nunca será tan rápido y bueno como podría ser.
Las pruebas son la base sobre la que se construye la implementación continua. Las pruebas crean software como Clemens, uno de nuestros desarrolladores, explicó en su publicación de blog.
Ejemplo
Esta secuencia de comandos prueba el Traductor de Google para asegurarse de que se traduce “Buenos días” del alemán al inglés:
#Run with casperjs test translate.coffee
casper.start 'http://translate.google.com/', ->
@.sendKeys('#source', 'Guten Tag');
@.then ->
@.click '#gt-submit'
@.waitForText('Good day')
@.then ->
@.test.assertSelectorHasText '#result_box', 'Good day'
@.then ->
@.capture 'output.png'
casper.run ->
@.test.done(1)
CasperJS lo ayuda a comenzar a probar su aplicación rápidamente y se ampliará para probar escenarios más complejos según lo necesite.
Automatizar la implementación
Cada paso de su implementación debe automatizarse. Una vez configurado, nunca debería tener que pensar en qué pasos deben tomarse. Cada elección y cada tarea manual conduce a posibles errores, por lo que simplemente lo hace con menos frecuencia. Al automatizar cada parte de su implementación, puede impulsar nuevas funciones, pero lo que es más importante, implementar correcciones muy rápidamente. La implementación continua funciona gracias a la automatización, así que no omita este paso.
Automatizar la reversión
Al presionar rápidamente, también desea poder volver fácilmente a un estado anterior. De lo contrario, no se sentirá lo suficientemente seguro como para hacerlo con tanta regularidad como debería.
La reversión automática incluye su base de código y su base de datos. Asegúrese de hacer una copia de seguridad de su base de datos con regularidad y utilizar esas copias de seguridad para recrear su sistema en las máquinas de prueba. Si no restaura regularmente sus copias de seguridad, no puede estar seguro de que funcionarán cuando las necesite desesperadamente.
Implementar en ensayo
Cree un entorno de ensayo e inserte su rama maestra o línea principal de desarrollo en esa aplicación de ensayo cada vez que se realicen cambios. Esta aplicación de Staging es su primera línea de defensa y ayuda a revisar todos los cambios antes de entrar en producción. Incluso puede ejecutar pruebas automatizadas contra Staging para asegurarse de que funcione como se espera.
Utilice su entorno de puesta en escena
Si usa su producto en su trabajo diario, use su Staging y no su servidor de Producción. A medida que empuja los cambios continuamente a Staging, verá de primera mano cuando algo se rompe, ya que impacta inmediatamente a su equipo. “Comer su propia comida para perros” hace que todos sus desarrolladores se den cuenta cuando baja la calidad.
Implementar automáticamente en producción
Como paso final, implemente continuamente en su entorno de producción. Esto realmente cambiará la forma en que funciona su organización. No habrá más miedo en cambiar su sitio. Esto significa que puede iterar rápidamente en nuevas funciones, pero si envía un error, también puede enviar una solución rápidamente. No estás atado a ciclos arbitrarios que ralentizan a tu equipo.
Conclusiones
Pasar a la implementación continua cambiará drásticamente su desarrollo. Lo hará más productivo y lo llevará a un producto mejor y más estable. Hay pasos como las pruebas automatizadas con los que debe comenzar primero. Las pruebas automatizadas no son una herramienta para crear un mejor software, sino un proceso para crear un mejor producto para sus usuarios. Una vez configurado, puede aprovechar los beneficios de implementar nuevas versiones varias veces al día.
Háganos saber si surge alguna pregunta o si hay algo más en lo que podamos ayudar, ya sea aquí en los comentarios o envíenos un tweet a @codeship . Recientemente, también lanzamos un libro electrónico gratuito que lo guía a través de nuestros flujos de trabajo de desarrollo y profundiza en la implementación continua. Puedes agarrar el libro aquí.
¡Envíe largo y prospere!
Más información
- Introducción a la integración continua por Martin Fowler
- Por qué la implementación continua de Eric Ries
- Entrega continua de Jez Humble
- Un caso empresarial para la integración continua
- Cómo comenzar con las pruebas de arriba hacia abajo
- Comience a probar su sitio web con CasperJS