Como ya comenté en el artículo Agilidad y calidad en el desarrollo de software, la importancia de un buen sistema de integración continua, la integración continua es una metodología de desarrollo software cuya máxima consiste en probar sistemáticamente la aplicación que se está programando para detectar errores de manera temprana y monitorizar el estado y cobertura de tus fuentes en todo momento. La clave en este tipo de entornos es, sin duda, la automatización de tareas, procesos, compilaciones y pruebas para así minimizar la intervención humana.
Adoptar una metodología de desarrollo que nos permita poner en marcha los principios de la integración continua para desplegar todo su potencial, requiere de una organización con un nivel de madurez adecuado en cuanto a sistematización y organización del trabajo, así como una firme convicción de apostar por la calidad y capacidad de reacción en los desarrollos software.
Es común la aplicación de metodologías ágiles como Scrum o Kanban de la mano de la integración contínua, ya que desde un punto de vista “filosófico” tienen muchos puntos en común.
No cabe duda que es importante contar con un equipo de trabajo formado en la utilización de ciertas herramientas, así como estar convencido para realizar lo que será una importante inversión en software, hardware y tiempo para llevar a cabo su implantación con éxito. Por ello, la visión de que estos sistemas harán a la organización más ágil, flexible y fiable tiene que ser una decisión (e inversión) estratégica.
Si bien existe bastante documentación y experiencias al respecto de cómo poner en marcha estos entornos para desarrollos con tecnologías web, en el campo del desarrollo móvil y concretamente el desarrollo móvil multiplataforma, se encuentran más preguntas que respuestas si se le pregunta a nuestro “amigo Google”.
Dada nuestra experiencia en el tema en cuestión, creemos fundamental contar con las siguientes 11 herramientas para desplegar una metodología de integración continua para el desarrollo de aplicaciones multiplataforma:
1. Entorno de desarrollo
Existen muchas opciones al respecto, algunas de las más conocidas son Eclipse, IntelliJ Idea, Visual Studio o NetBeans. A este respecto cada desarrollador tiene sus gustos y “manías”, pero es conveniente que lleguemos a un consenso entre los miembros del equipo de desarrollo para utilizar el mismo IDE y así evitar posibles conflictos o trabajos de adaptación para cada uno.
El entorno de desarrollo es la herramienta con la que nuestros desarrolladores pasarán la mayor parte de su tiempo y que afectará en gran medida a su rendimiento; es fundamental que se sientan cómodos.
2. Control de versiones
Hoy en día a ninguna empresa que desarrolle se le pasa por la cabeza no disponer de un sistema de control de versiones del código fuente. En este sentido GIT (de Linus Torvalds), TFS (de Microsoft), SVN y Mercurial son los grandes dominadores del mercado. Nosotros utilizamos GIT para nuestras APPs multiplataforma.
3. Herramienta gestión tareas
Para la gestión y planificación de tareas disponemos en el mercado de multitud de herramientas. La clave para que podamos trabajar de una manera ágil a la vez que rigurosa, es que esta herramienta esté enfocada a la casuística propia de la gestión de proyectos software para evitar que desgaste a los usuarios con más overhead. En este sentido, dentro de la suite de soluciones de Atlassian la herramienta JIRA y todo el conjunto de herramientas complementarias nos permiten gestionar el desarrollo a todos los niveles, teniendo desde una trazabilidad de las incidencias a nivel de línea de código, hasta épicas o proyectos con el plugin JIRA Agile. Si todo esto además lo integramos con nuestro ERP de trabajo, cerramos el círculo de la gestión de manera óptima.
En nuestro caso tenemos desarrollada la conexión entre JIRA y ClaveiGes, disponiendo así de una integración absoluta con el resto de unidades de negocio y la parte que más cojea de JIRA, la facturación y contabilidad que ClaveiCON resuelve perfectamente.
4. Compilación y construcción
Normalmente será necesario realizar algún tipo de empaquetado y procesamiento de nuestros fuentes previo a la publicación. Para ello nos valemos de herramientas como ANT, Maven o Gradle que nos proporcionan un lenguaje para la definición de tareas repetitivas sobre nuestro código que lanzará posteriormente nuestro servidor de integración contínua.
5. Servidor Integración Contínua
Opciones destacables serían Hudson / Jenkins o Bamboo. En nuestro caso por ventajas con la integración y trazabilidad con herramientas de Atlassian nos decidimos por Bamboo. Es importante hacer una buena reflexión y análisis de esta herramienta, ya que es el verdadero motor de la automatización de tareas. Nos permitirá la ejecución de scripts para descarga de fuentes de los repositorios, compilación, construcción, ejecución de tests, generación de reportes y avisos, despliegue y ejecuciones locales y remotas, etc.
La filosofía de la integración continua se basa en que este proceso debe ejecutarse de manera autónoma cada vez que un usuario hace un commit contra la rama central de desarrollo, pero debemos ser capaces de adaptar la integración a nuestras necesidades. Por ejemplo, lo lógico sería si contamos con una batería de tests importante, que con cada commit lancemos una batería de tests de manera aleatoria y con una frecuencia programada adaptada a nuestro volumen de líneas de código, programemos una compilación diaria con todos los tests.
6. Phonegap / Cordova
Aunque existen otras alternativas para el desarrollo multiplataforma, esta es nuestra elección. Phonegap / Cordova permite desarrollar APPs en Javascript ofreciendo una API de acceso al dispositivo también en JS. Además, existe la posibilidad de acceso a recursos nativos específicos del dispositivo a través del desarrollo de plugins o utilización de los que va generando la comunidad. Una ventaja muy importante de esta elección es que un desarrollador web tiene una curva de aprendizaje muy baja para empezar a ser productivo haciendo APPs.
7. Framework de desarrollo
Lógicamente partiendo del punto anterior, debemos plantearnos la arquitectura de nuestra aplicación, que estará desarrollada en Javascript. Para ello lo adecuado será utilizar algún framework javascript que nos haga la vida más fácil y nos permita tener un código más limpio, pero eso sí, es importante la elección de alguno que esté consolidado en el mercado.
Existen alternativas full stack como jQueryMobile o Sencha Touch, que nos dan una solución completa a la gestión de Arquitectura, UI y DOM. Otra alternativa es utilizar soluciones diferentes para Arquitectura (AngularJS, BackbouneJS, etc.), DOM (Jquery,ZeptoJS, etc.) o UI (Ionic, Bootstrap, etc.). La elección de una u otra opción dependerá también del tipo de aplicación que queramos desarrollar y el resultado final que queramos obtener.
8. Framework de testing
Para automatizar la ejecución de tests nos van a ser de utilidad herramientas como Jasmine, Mocha, Protractor (AngularJS), Selenium, Karma y Siesta (Sencha Touch), que nos permitirán desarrollar test unitarios, test de integración, test funcionales, etc. Un framework interesante que conviene probar es Appium, que permite la automatización de ejecuciones sobre dispositivos iOS y Android a través de Selenium WebDriver API.
9. Phonegap Build
Construir los ejecutables de las aplicaciones que se deben instalar en los dispositivos es un proceso bastante repetitivo para todas las plataformas a las que queramos llegar. Una opción muy interesante a evaluar por su razonable coste es Phonegap Build de Adobe. Este entorno, que dispone de una API para conectar con nuestro servidor de integración continua, se encarga de generar el ejecutable final de nuestra aplicación en Phonegap / Cordova sin necesidad de preocuparnos demasiado o tener que disponer de un servidor MAC que realice estas tareas si queremos llegar a dispositivos Apple con nuestra APP. Además Phonegap Build también nos ofrece la posibilidad de que nuestros clientes puedan descargarse directamente la APP de su sistema mediante una URL que nos facilitan junto a un código QR.
10. Documentación
Debemos contar con un espacio abierto para almacenar la documentación. En este punto distinguiría dos maneras en las que debemos documentar:
A bajo nivel, a través de herramientas como jsduck o JSDoc podemos generar una documentación navegable en HTML a partir ciertas variables que insertemos en nuestro código fuente y que nos ayudarán a hacerlo más comprensible.
- A alto nivel, a través de una wiki correctamente organizada dónde registraremos documentación tipo “howto”, retrospectivas, casos de uso, historias de usuario, solución de problemas, etc.
- osotros optamos por Confluence, también de Atlassian, no solo por la integración con el resto de herramientas ya comentadas y su potencia a la hora de generar documentos de tareas de JIRA o reportes de Bamboo, sino también por su potencia a la hora de facilitar el trabajo colaborativo de los equipos prescindiendo en gran medida del antiproductivo E-Mail.
11. Plugins para el entorno de desarrollo
Del mismo modo que hablábamos de los plugins de JIRA para extender su funcionalidad, es importante que los desarrolladores puedan realizar todo su trabajo en el mismo entorno para no distraer su atención y optimizar su tiempo. Para ello es importante que el IDE resuelva correctamente a través de plugins, la conexión con:
- Control de versiones, simplificando la tarea de subir y bajar código y resolver conflictos de publicación (en nuestro caso en GIT).
- Conexión con el gestor de tareas, para poder generar listados de modificaciones en ficheros en función de una tarea y que queden registradas las líneas de código que se modificaron para la misma, etc.
- Ejecución de scripts de ANT / Maven / Gradle para hacer pruebas durante el desarrollo de manera rápida y sencilla.