Go, mucho más que una alternativa a Jenkins como servidor de integración continua

Una de las piezas claves (pero no la única) dentro del proceso de integración continua es el servidor de integración continua (Aprende a implantar integración continua desde cero (I): ¿Por qué integración continua?)
Cuando hablamos de estas cosas, Jenkins es la primera herramienta que se nos viene a la cabeza, sobre todo en el mundo Java (¿Qué es Jenkins? Explicado en menos de 10 min para quienes no lo conocen de nada), o incluso Hudson, pero existen otras herramientas similares, tanto gratuitas como de pago.
Hoy voy a hablaros de Go CD, otra herramienta que puede actuar como servidor de integración continua, open source, que me encanta, y que empieza escucharse como alternativa a Jenkins.

Thoughtworks y Go

Go es una herramienta creada por la empresa Thougtworks, que a muchos os sonará porque en ella trabaja Martin Fowler.
Esta herramienta hasta hace pocos meses era pago, pero en febrero de 2014, Go se abrió a la comunidad y pasó a ser open source.
Thoughtworks sigue colaborando en la comunidad de Go, y ofrece servicios de pago sobre la herramienta, tales como soporte personalizado, consultoría etc.
Puedes descargarte la herramienta desde esta página, donde además tienes mucha documentación y tutoriales para ponerla en marcha.

¿Cómo funciona Go?

Aunque llevo llamando a la herramienta Go todo el tiempo, y oirás hablar de ella como Go, realmente se llama Go CD (no la confundas con el lenguaje de programación Go).
CD viene de Continuous Delivery (Entrega Continua, ¿Sabes la diferencia entre integración, despliegues y entrega continua?). Y es que Go fue pensada desde sus inicios como una herramienta orientada hacia la entrega y el despliegue continuo, y no solo de integración continua.
Una de las muchas cosas que toman más importancia en la entrega y el despliegue continuo son los pipelines, que son el conjunto de distintas etapas por las que debe ir pasando el software desde que se sube al control de versiones hasta que se despliega en los distintos entornos (por ejemplo desarrollo, test, producción) y cómo son esas promociones entre entornos.
En mi opinión, eso se nota al entrar en la herramienta, ya que Go se organiza en torno al concepto de pipeline:
– La unidad de trabajo más pequeña en Go (al igual que en Jenkins) es la tarea. Una tarea puede ser descargar el código del repositorio, compilar el código, ejecutar pruebas, lanzar diferentes comandos etc.
– Go y Jenkins, siguen arquitecturas muy parecidas: maestro/esclavo – servidor/agente en Go.
En Go podemos tener un conjunto de agentes, de distintas máquinas, conectadas a nuestro servidor principal de Go.
El servidor indicará a los agentes las tareas que tienen que ejecutar. Así podremos paralelizar la ejecución de las tareas, y podremos hacer que nuestro pipeline tarde menos tiempo en ejecutarse.
– Las tareas se agrupan en etapas (stage). Una etapa es un conjunto de tareas que pueden ejecutarse en paralelo.
Por ejemplo podríamos aprovechar esto para ejecutar los test de una suite de test en paralelo, o lanzar dicha suite varias veces con distintos datos de prueba.
La ejecución de una etapa se considera exitosa cuando todas las ejecuciones de las tareas que contiene son un éxito.
– Las etapas se agrupan en un pipeline.
Si por ejemplo queremos configurar un pipeline que se descargue el código fuente del control de versiones, se compile, se ejecuten pruebas unitarias, se despliegue a test, se ejecuten pruebas funcionales automáticas y demos la aceptación manual para pasar a pre-producción, podríamos tener el siguiente pipeline en Go:
pipeline-go
Por otra parte Go es muy completo: permite ejecutar el pipeline con distintos parámetros, hacer que el paso de una etapa a otra sea automática o que tengamos que aprobarlo manualmente.
También podemos crear plantillas de pipelines para crear pipelines similares, restringir que ciertos agentes ejecuten ciertas tareas etc.

Go vs Jenkins

Llegados a este punto te preguntarás: ¿qué diferencias hay entre Go y Jenkins? ¿Cuál de las dos herramientas utilizo?
Por ello quiero dejarte una comparativa entre Go y Jenkins, basada en mi experiencia, totalmente criticable, que podemos comentar :).
En mi opinión, las principales diferencias entre ambas herramientas recaen en el motivo para el cuál se crearon:
1 – Jenkins está más enfocado en la integración continua, y tiene muchísimos plugins, con los que podemos llegar a configurar pipelines más complejos:
– Es sencillo entender la herramienta y empezar a trabajar con ella.
– Se integra maravillosamente con Maven, ya que Jenkins implementa ciertas funcionalidades que facilitan muchísimo el trabajo con esta herramienta.
– Se pueden crear y visualizar pipelines, pero cuando hablamos de crear pipelines complejos, lanzando tareas en paralelo, tenemos que combinar el uso de varios plugins y estrategias. No es una funcionalidad que venga en el núcleo de Jenkins.
– Tiene una comunidad open-source muy grande detrás, con muchos años de experiencia.
– Es utilizado por muchísimas empresas y proyectos open-source en todo el mundo.
2 – Go es un servidor de integración continua, con muchas funcionalidades orientadas al despliegue y entrega continua.
– Tiene pocos plugins. La funcionalidad que se espera de él está en el núcleo de la herramienta.
– Go hasta ahora había sido de pago, por lo que pocas empresas lo habían utilizado.
– Al convertirse en open-source poco a poco la comunidad y los usuarios de Go empiezan a aumentar.
– Go está más orientado hacia la entrega y el despliegue continuo.
– Creo que cuesta un poco más entender ciertos conceptos de Go, sobre todo las visualizaciones encadenadas de los pipelines, pero una vez te acostumbras te das cuenta de que es una herramienta muy muy potente.

 Terminando…

Para concluir, si que tengo que decir que desde hace unos meses hasta ahora, me llaman cada vez más “chica Jenkins”, o “Miss Jenkins” :P.
Y es que me gusta bastante Jenkins, porque puedo configurar las cosas hasta el extremo, cosa que para ciertos proyectos es muy útil.
Pero continúo probando otras herramientas, algunas comerciales, otras open source (que son las que tengo más al alcance), ya que dependiendo de las necesidades del proyecto una herramienta puede ser mejor que otra.
A lo mejor hay gente que no necesita invertir en un Ferrari, porque no va a sacar su máximo potencial, no lo necesita y le viene mejor algo más normalito.
Para concluir, Go es una muy buena herramienta, muy potente y útil y que recomendaría sobre todo si queremos lanzarnos hacia la entrega continua y si queremos crear pipelines muy complejos, que no se visualicen bien en Jenkins.

jgarzas

Ph.D. en informática, Postdoctorado en la Carnegie Mellon (EE.UU) e Ingeniero en Informática.

Primera vez que me tocó hacer una gestión Ágil en una empresa... año 2001. Desde entonces he trabajado en, o para, más de 90. Y he formado a más de 2000 alumnos.

También soy profe de la Universidad Rey Juan Carlos.

0 comentarios en “Go, mucho más que una alternativa a Jenkins como servidor de integración continua”

  1. Hola. Hablemos de facilidad de uso. Un criterio para nada despreciable en estos días. Go es mas fácil de usar? (ojo, no me refiero a los conceptos que hay q aprender con Go, que claramente son más complicados que los de CI). Gracias

  2. Evaluemos también una que poco a poco se va convirtiendo en una de mis preferidas: Teamcity. Es casi o más poderosa que Jenkins, y su facilidad de uso me agrada mucho.

  3. Buenas Ana, me gustaria que me dieras informacion y ejemplos sobre como trabajar sobre los permisos de uruarios (roles) contra distintas tareas, pero mediante REST API.. no he encontrado nada respecto a esto gracias por tu tiempo.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *