
[27/02/2019] La nube y la integración continua (CI, por sus siglas en inglés) son una combinación natural. Si bien la nube nos libera del trabajo de instalar y mantener servidores físicos, la integración continua automatiza gran parte del trabajo de construir, probar y desplegar nuestro código. Si ambos intentan quitarle trabajo de encima a los equipos de desarrollo, entonces tiene sentido combinarlos y eliminar aún más pesadez con un solo paso.
Hay muchos servicios de integración continua y todos hacen lo mismo, al menos en un sentido abstracto. Comienzan con una lista de tareas como la compilación o pruebas que se deben realizar antes de que el mundo pueda apreciar la genialidad de su nuevo software. Cuando confirma sus líneas de código, las herramientas comienzan a trabajar a través de la lista de verificación hasta que se topan con un obstáculo. Si no hay obstáculos, todos están contentos.
Cualquiera puede usar la integración continua para un proyecto de desarrollo de software, pero las ventajas más grandes las disfrutan los equipos, preferiblemente los equipos grandes que trabajan en los mismos bloques de código entrelazados. Las implementaciones más completas de integración continua construyen y reconstruyen el código antes de probarlo y volver a probarlo, en busca de nuevos errores e incompatibilidades que puedan haberse creado a medida que diferentes miembros del equipo verifican su código. Los servidores de integración continua sincronizan el trabajo de todos los programadores y ayudan al equipo a detectar cualquier problema.
Algunas listas de tareas para el servidor de CI terminan con las pruebas, pero últimamente cada vez más equipos extienden las listas para incluir la implementación del nuevo código, un proceso que a veces se denomina "implementación continua". La implementación completamente automatizada hace que algunas personas se pongan nerviosas y que, a menudo, agreguen algunas pausas manuales en el proceso. Agregar algo de responsabilidad y seguridad humana les permite relajarse un poco. Este enfoque híbrido es llamado "entrega continua" porque entrega el código a algún grupo de pruebas o de estadificación en el que espera a que un humano realice el impulso final hacia la producción.
Si la integración continua es excelente en la sala de servidores al final del pasillo, puede ser incluso mejor en la nube donde hay grandes oportunidades para una entrega más rápida y una mayor eficiencia. En el mejor de los casos, las nubes pueden dividir el trabajo y ejecutar las tareas en paralelo. Los servicios comienzan con un gran conjunto de hardware y luego lo comparten entre muchos equipos. Mientras no todos gestionen su código al mismo tiempo, las compilaciones y pruebas se ejecutarán mucho más rápido. Comprar el mismo gran rack de hardware para los momentos en que los desarrolladores quieren ejecutar todas las pruebas es prohibitivo, pero si los equipos comparten el rack, todos pueden disfrutar de las ráfagas de velocidad.
Sin embargo, existen peligros y preocupaciones, y el más grande puede ser la pérdida de control. Todos los servicios en la nube requieren la entrega de su código a un tercero, una opción que puede ser liberadora para algunos pero aterradora para otros. Todos los servicios en la nube se esfuerzan por enfatizar la seguridad, pero de alguna manera se siente diferente cuando el código está bajo su propio techo.
Además del amplio soporte para todos los lenguajes principales, estos servicios cubren un número sorprendente de los secundarios, y varios realmente extraños e inusuales. Esto se trata del resultado de buenas decisiones arquitectónicas antes que cualquier esfuerzo heroico de los desarrolladores. Las listas de tareas casi siempre están codificadas como comandos para algún shell o línea de comandos, por lo que las herramientas de integración continua siguen emitiendo comandos hasta que la lista se agota o aparece algún obstáculo insuperable. Algunos de los lenguajes como Java ofrecen opciones más sofisticadas, pero las herramientas pueden lograr casi cualquier cosa que se hace con una línea de comandos.
Aquí hay 10 opciones diferentes para llevar a cabo una integración continua en la nube.
CloudBees
CloudBees Core comenzó con Jenkins, el conocido proyecto de código abierto para una integración continua; luego agregó pruebas, soporte y cierta seguridad de que el código se ejecuta. La compañía eliminó todos los complementos experimentales, agregó algunos propios y luego pulió los correctos para que funcionen como se espera cuando se necesitan.
CloudBees aún emplea el 80% del equipo de desarrollo de Jenkins y con frecuencia contribuyen con código al proyecto de código abierto, por lo que puede estar seguro de que poseen una buena comprensión de esta plataforma dominante. Para acelerar las cosas, CloudBees también agregó una extensa paralelización e instrumentación para rastrear su proceso de desarrollo.
CloudBees ofrece una variedad de puntos de precio que van desde niveles gratuitos hasta "kits iniciales" por un año completo del servicio. La compañía también añadió el soporte para Jenkins para cualquier persona que necesite ayuda con la herramienta pero que no esté buscando cloud computing.
AWS CodePipeline
La herramienta de Amazon para la integración y el despliegue continuos, AWS CodePipeline, ha sido optimizada para entregar código a un servidor de AWS, mientras que también está abierta a vías más elaboradas para su código y datos. La herramienta básica ofrece una buena selección de entornos de compilación preconfigurados para los principales lenguajes (Java, Python, Node.js, Ruby, Go, Android, .Net Core para Linux) y luego descarga el resultado en un paquete S3 antes de enviarlo a un servidor para comenzar a funcionar.
Hay una cantidad sorprendente de capas con nombres ligeramente diferentes. CodeBuild toma lo último que creó de CodeCommit cuando es activado por CodePipeline y luego entrega el resultado a CodeDeploy. Si son demasiados elementos Code para configurar, puede ir directamente a CodeStar, que ofrece otra capa de automatización. Si solo hubiera un CodeBugEraserStar para borrar todos nuestros errores de forma automática. Vale la pena señalar que técnicamente no paga por ninguna de estas capas Code. Amazon factura solo por los recursos de cómputo y almacenamiento utilizados en el camino. No es exactamente gratis, aunque sí lo parezca.
Bitbucket Pipelines
Atlassian, los desarrolladores del popular tablero de seguimiento de trabajos, Jira, y el repositorio de códigos Bitbucket, decidieron aprovechar su influencia en nuestro flujo de trabajo al crear Bitbucket Pipelines, una herramienta de integración continua en la nube de Bitbucket. La salsa secreta es una mayor integración, en este caso en forma de conexiones entre el mecanismo de construcción y las otras herramientas de Atlassian. Al menos estéticamente, Pipelines no son una cosa separada; es solo otra opción del menú para cada proyecto en Bitbucket. Otra de las opciones del menú apunta a las implementaciones, lo que le permite seleccionar dónde terminan las compilaciones.
Las conexiones son una bendición y una limitación. Si elige una de las plantillas ya definidas para los principales lenguajes (Java, JavaScript, Python, PHP, .Net, etc.), puede crear y desplegar su código en unos pocos clics. Pero si se desvía de los estándares, comenzará a darse cuenta de que las opciones no están ahí. Atlassian fomenta un Marketplace de apps que parecen ser una mezcla de gráficos y webhooks en otros servicios. La mejor aplicación en la tabla conectará Bitbucket con Jenkins, probablemente para realizar algo que no se puede hacer rápidamente dentro de las paredes.
La principal ventaja de Pipelines es la velocidad. Atlassian ha diseñado previamente la mayoría de las rutas principales, desde el código hasta la ejecución de implementaciones, y puede seguir los pasos de la empresa por solo unos pocos dólares. Es difícil comparar el costo de usar Bitbucket porque las compilaciones se cobran por minutos, como la mayoría de los modelos sin servidor; pero los equipos a menudo dedican un conjunto de instancias para manejar las compilaciones de Jenkins. Incluso si los cierra por las noches y los fines de semana, las horas siguen sumando.
GitLab CI/CD
Uno de los mayores competidores de Atlassian es GitLab, otra compañía que desea manejar cada paso del proceso entre sus dedos y la implementación en ejecución. Los mecanismos de compilación, prueba y despliegue de GitLab también están conectados directamente a sus repositorios Git para que puedan activarse con el compromiso. El proceso se basa en gran medida en los contenedores de Docker, y este almacenamiento en caché puede simplificar en gran medida parte del trabajo de configuración que se debe realizar en las compilaciones de Jenkins.
Las tareas de compilación pueden dirigirse a cualquier lenguaje, pero deben ser activadas por GitLab Runner, una herramienta de autoscaling escrita en Go que está lista para la mayoría de las plataformas. Esta flexibilidad significa que puede dar lugar a cualquier trabajo aleatorio en otras máquinas, algo que podría ser útil con arquitecturas elaboradas que hacen más que solo ofrecer microservicios.
El precio está empaquetado en los distintos niveles para aproximarse a la necesidad. Los grupos de Gold tier, por ejemplo, obtienen las mejores características, como paneles de seguridad y 50 mil minutos de desarrollo en el grupo compartido de máquinas. No hay cobro por usar sus propias máquinas como parte del proceso o instancias separadas en otra nube.
CircleCI
Muchas de las herramientas de integración continua se centran en el código que se puede construir en el entorno Linux. CircleCI crea y entrega en el mundo de Linux, pero también ofrece un producto que construirá apps de Android y cualquier cosa que salga del Xcode de Apple (para iOS, MacOS, tvOS o watchOS). Si trabaja en un equipo que está produciendo aplicaciones para estas plataformas, puede comprometer su código y dejar que CircleCI aplique cierta disciplina de prueba en todo el talento divergente de su equipo.
Las listas de tareas se detallan en archivos YAML. CircleCI usa Docker para configurar los entornos de prueba para el código. Las compilaciones comienzan con contenedores nuevos, así como todas las pruebas. El trabajo de Mac se ejecuta en máquinas virtuales que tienen una vida útil igualmente corta. Esto evita algunos de los problemas con la configuración porque los entornos limpios no tienen ningún bit de sobra. (Entonces, si sus problemas son causados por fallas digitales persistentes, bueno, eso es culpa suya).
El precio se enfoca en la cantidad de CPU que absorben las compilaciones. El límite de número de usuarios y cantidad de repositorios es infinito. Sin embargo, la cantidad de minutos de creación y los contenedores que realizan la acción, son medidos. El primer contenedor es gratis y se puede ejecutar una compilación en él. Si desea más paralelismo o rendimiento, CircleCI gana algo de dinero. Los usuarios de Mac no obtienen la misma oferta gratuita, pero hay planes introductorios para cualquiera que pruebe el servicio.
Travis CI
Si sus compilaciones producen un código que necesita ser probado en Windows, entonces Travis CI le ofrece una sola parada. La compañía ha ofrecido opciones de MacOS y Linux por un tiempo, pero acaba de lanzar la opción de Windows, simplificando la producción de código que se ejecuta en más lugares.
Las listas de tareas también se detallan en YAML, y los trabajos se ejecutan en máquinas virtuales limpias con una configuración bastante estándar. El código de Linux obtiene algunas versiones básicas de Ubuntu, el código de Mac se ejecuta en una de doce combinaciones de OS X, Xcode y JDK. El código de Windows solo puede terminar en una versión de Windows Server (1803) por ahora. Travis CI ofrece una larga lista de 30 lenguajes y reglas de compilación preconfiguradas y prácticamente listas para ser ejecutadas.
El precio se basa en la cantidad de trabajos simultáneos que se pueden ejecutar a la vez, pero no hay límites formales en el número de minutos que estas compilaciones pueden tomar. Es como si recibiera un número fijo de instancias dedicadas para su trabajo y están listas todo el tiempo. No hay opciones gratuitas para trabajos de propiedad, pero los proyectos de código abierto son "siempre gratuitos", así que esa es la forma más sencilla de probar Travis CI.
Azure Pipelines
Si se pregunta si el Microsoft moderno tiene la actitud de "No se ha inventado aquí", no busque más con Azure Pipelines. La literatura de ventas dice: "Cualquier lenguaje, cualquier plataforma”. Si bien esto es un poco exagerado y es probable que Azure no tenga mucho que ofrecerle a los programadores de ENIAC, sí ofrece rutas de Microsoft, Linux y MacOS para su código. La esquina de Apple está dirigida solo a compilaciones de MacOS, no a iOS, tvOS ni watchOS; pero no nos pongamos delicados. Esto definitivamente es más que un vaso medio lleno.
De manera abstracta, el sistema es similar a los otros. Hay agentes que ejecutan compilaciones para producir artefactos. Algunos de estos pueden ser auto alojados si esa opción ayuda. La pila adopta completamente los contenedores Docker, y el hardware de Azure está listo para ejecutarlos. Se pueden elegir todos estos detalles junto con un diseñador visual integrado en una página web, o con YAML si prefiere vivir en el mundo de la línea de comandos.
El precio incluye un "trabajo paralelo" gratuito con 1.800 minutos de tiempo de creación. Si desea más paralelismo o más tiempo de creación, debe empezar a pagar. El plan cuenta con un generoso nivel gratuito para proyectos de código abierto, enfatizando nuevamente el deseo de Microsoft de participar en la comunidad de código abierto. Pero si Microsoft va a gastar 7,5 mil millones de dólares para comprar un asiento en la mesa al adquirir GitHub, bueno, tiene mucho sentido. ¿Dónde se ejecutará todo este código? Azure Pipelines estará encantado de moverlo sin problemas al hardware de Azure.
CodeShip
La configuración de su lista de tareas suele ser el mayor desafío cuando se utiliza una herramienta de integración continua. CodeShip toma dos enfoques diferentes en dos niveles de servicio. El plan "Básico" incluye mucha automatización y preconfiguración, junto con una interfaz gráfica de usuario para configurar un resumen de las tareas. Todo lo demás está prácticamente hecho sin que usted deba intervenir. La versión "Pro" le permite alcanzar muchas más opciones y jugar con la configuración y los contenedores Docker utilizados para definir los entornos de compilación. Puede elegir cuántas máquinas de compilación se dedicarán a sus tareas, así como qué tan bien aprovisionadas pueden estar.
De alguna manera, esto es lo contrario de cómo el mundo suele funcionar. Paga más y consigue hacer más trabajo. El llamado usuario básico obtiene todo automatizado. No parece justo, hasta que quiere hacer algo que no es exactamente estándar, y es ahí donde encuentra la necesidad de actualizar de Básico a Pro.
El plan Básico ofrece un nivel gratuito con una máquina de compilación, proyectos y personas ilimitadas, pero solo 100 compilaciones al mes. Por lo tanto, si tiene más de 100 proyectos, tendrá que pagar si desea elaborarlos todos en un mes. Una vez que comienza a pagar, no hay límite en la cantidad de compilaciones ni de minutos. Simplemente debe elegir cuántas máquinas de compilación y máquinas de prueba manejarán sus tareas. El plan Pro también comienza con una opción gratuita, pero una vez que comienza a pagar, el monto se determina por el tamaño y la cantidad de instancias en la nube dedicadas a su trabajo.
Sauce Labs
La mayoría de las herramientas enumeradas aquí se especializan en organizar el flujo del código desde el repositorio hasta la implementación. Sauce Labs se enfoca en las pruebas. El servicio basado en la nube ofrece una variedad increíblemente amplia de combinaciones para que se asegure de que todo funcione. ¿Quiere probarlo en Firefox 58 ejecutado en Windows 10? ¿Qué pasa con Firefox 56 en MacOS? Están listos para usted. La combinatoria genera rápidamente una gran variedad de opciones de plataforma para los probadores más obsesivos.
Los scripts de prueba se pueden escribir en el lenguaje que usted elija, siempre que elija uno de los estándares como Java, Node, Ruby o PHP. La nube de procesadores se dirigirá a cada uno en paralelo. Sauce Labs también se especializa en integrar las pruebas con otras herramientas o tuberías de CI. Así que puede ejecutar Jenkins localmente y luego delegar las pruebas a Sauce Labs.
El precio comienza con una tasa baja para las pruebas "en vivo", es decir, las pruebas que inicia y evalúa usted mismo. Pagará más por pruebas automatizadas, medidas en minutos y por el número de rutas paralelas. Además, Sauce Labs tiene una opción para probar software en cualquiera de los cientos de dispositivos reales en la nube de la compañía.
Jenkins y Hudson
A veces uno quiero hacerlo por sí mismo. Una de las formas más sencillas de iniciar una tubería de integración continua en la nube es alquilar una instancia de servidor y utilizar Jenkins o Hudson. En muchos casos, ya existe una imagen preconstruida de uno de los proveedores, como Bitnami, a la espera de que presione el botón de empezar.
Jenkins y Hudson comenzaron siendo el mismo programa para probar errores en el código de Java hace mucho tiempo, pero se dividió en dos bandos tras surgir una disputa entre algunos de los desarrolladores y Oracle. Los detalles no son tan importantes, pero la división muestra cómo las licencias de código abierto permiten a los desarrolladores tomar decisiones sobre el código al limitar el control de los propietarios nominales.
Y mientras que Jenkins y Hudson pueden haber comenzado como una herramienta para crear proyectos Java, hace mucho que han superado ese nicho. Ahora, los equipos los usan para manejar casi todos los lenguajes y existen miles de plugins para manejar la creación, el empaquetado, las pruebas y la implementación. Es código es código abierto, por lo que no hay cargos adicionales por usarlo. Solo paga por el servidor y el tiempo de configuración.
Peter Wayner, InfoWorld (EE.UU.)