Integración continua con Go
Índice de contenidos.
¿Qué es Go?
Go es un servidor de integración y liberación continua de software.
- Integración Continua es la práctica de automatizar la construcción y pruebas del proyecto para detectar errores durante el desarrollo.
- Liberación Continua es la práctica de automatizar la liberación de software. Esto significa que el servidor puede generar automáticamente un entregable a partir de cada cambio en el código fuente. La liberación continua implica integración continua, y una serie de pruebas de aceptación del producto.
Go es código abierto. Su desarrollo está controlado por ThoughtWorks.
- ThoughtWorks es una empresa de desarrollo de software para terceros. Están relacionados con el movimiento ágil, y han hecho numerosas contribuciones de código abierto como CruiseControl, Selenium, y otros.
Funcionalidades
- Facilidad de modelado de pipelines, stages, jobs, and tasks.
- Visualización de pipelines en forma de grafo.
- Ejecución distribuida. Cualquier computador puede unirse como agente y ejecutar trabajos de un pipeline dentro de un sandbox local.
- Backup en un click.
- Fan-in. La construcción del proyecto se detiene si no se cumplen una serie de condiciones, por ejemplo, si los pipelines definidos no operan con la misma versión del código fuente.
Comparado con Jenkins
- Jenkins tiene 600 plugins, Go tiene uno o dos.
- Go tiene permisos de granularidad más fina.
- Jenkins tiene menos capacidades de visualización de pipelines.
- Jenkins tiene una comunidad más madura.
- Jenkins no tiene un fan-in apropiado.
Conceptos
Elementos con los que se trabaja en Go:
- Un material es código fuente tomado de un servidor de control de versiones (git, svn, etc) o un repositorio de paquetes de código (deb, jar, gem, etc.).
- Un trabajo (job) es un conjunto de tareas que pueden realizarse en un agente.
- Una fase (stage) es un conjunto de trabajos. Estos trabajos son paralelizables.
- Un pipeline (tubería) es un conjunto de fases. Generalmente las fases se organizan en secuencias, donde el completado de una fase inicia la siguiente.
La instalación mínima de Go consiste en un agente y un servidor.
- El agente tiene una serie de recursos (comandos, compiladores, entornos, librerías, etc.). Los trabajos se ejecutan en un agente dentro de un sandbox.
- El servidor asigna trabajos a los agentes con los recursos apropiados.
El pipeline modela el proceso de construcción y entrega de software, desde el código fuente a las manos de los usuarios.
Instalación
Go está disponible para OS X, Linux, Windows, y Solaris.
La instalación en OS X es como sigue:
- Descarga los DMGs para agente y servidor. Mueve los .app a /Applications.
- Arranca el agente y servidor.
- Apunta el agente al servidor (aparecerá un dialogo preguntando por la IP).
Cuando ejecutas el servidor se abre una página para administrarlo. Si pierdes la dirección puedes recuperarla desde un enlace en el about del ejecutable.
Si vas a ejecutar comandos del sistema, te convendrá saber el PATH. En OS X el PATH es /usr/bin:/bin:/usr/sbin:/sbin. Si quieres verlo por ti mismo ejecuta
$> ps -p `pgrep go-server` -wwwE
Los datos de servidor se guardan en ~/Library/Application Support/Go Server. Pero que yo sepa no hay motivos para tocar ahí. Si quieres ver la actividad en los sandbox de los agentes usa fseventer.app o fs_usage (o filemon en Windows).
Un pipeline para iOS
Primero debes instalar:
- xctool. Usa un release de https://github.com/facebook/xctool
- xsltproc. Instala libxslt con brew o macports.
Los pasos, en resumen, son estos:
- Crea un pipeline con dos fases.
- Crea una primera fase con un trabajo para compilar, probar, y generar un informe (abajo). Y un Test Artifact donde Source es test-reports y el campo Destination está vacío.
xctool -workspace cdl-ios-app.xcworkspace -scheme product -sdk iphonesimulator -reporter junit:test-reports/junit.xml
xsltproc -o test-reports/junit.html junit-frames.xsl test-reports/junit.xml
Ejecuta el pipeline. Si vas a la segunda fase, y pulsas en el tab JUnit deberías ver un informe JUnit en HTML. Si quieres llevarte este ejemplo contigo, ve a Admin > Config XML, y copia el fichero de configuración XML.
En mi equipo tiene este aspecto
Hay un pipeline “cdl-ios-app” con dos fases. La rueda dentada edita el pipeline, y el botón de play lo ejecuta. Las dos fases están en verde porque han tenido éxito, y si pulsas en ellas puedes ver los detalles de su ejecución.
Problemas que puedes encontrar
xctool no está en el path
Ejecuta esto (o similares, fijate en el path):
sudo ln -fs /Users/jano/tools/xctool/bin/xctool /usr/bin
El workspace no contiene el scheme
El mensaje es algo así como
xctool: error: The workspace 'cdl-ios-app' does not contain a scheme named 'product'.
La solución es
- Abre el workspace (si no lo tienes crea uno, por ejemplo con cocoapods).
- En Xcode ve a Product > Scheme > Manage Schemes…
- En el scheme que estás usando asegurate de marcar la casilla Shared, y de apuntar Container al workspace, y no al fichero del proyecto.
- Esto debería crear un fichero en cdl-ios-app.xcworkspace/ xcshareddata/xcschemes. Añade este fichero al repositorio con git add -f si lo tienes en .gitignore.
Siguiente paso
Si no conoces los beneficios de la integración continua lee Continuous Integration de Martin Fowler. Básicamente: automatizar la construcción de tu proyecto ahorra tiempo, dinero, y permite trabajar más eficientemente.
Go es una herramienta para implementar el proceso de liberación continua. Pero las estrategias a implementar requieren conocimiento de los retos y soluciones a problemas comunes en la implementación de pipelines. El libro a leer para ello es Continuous Delivery de Jez Humble, David Farley. He aquí un capítulo gratis: Continuous Delivery: Anatomy of the Deployment Pipeline.
La documentación del proyecto Go es muy completa. Visita el sitio http:// www.go.cd/ y lee la documentación, blog, y lista de correo.
Mi impresión es que Go tiene más potencial que Jenkins y acabará reemplazándolo. Pero por ahora hay Jenkins para rato porque es más maduro y tiene más plugins.