Que es la integración continua y por que debrías usarla.

La integración continua es algo en lo que he estado siguiendo muy de la mano en los pasados 2 años. Desde que termine de comprender RxSwift me ha tome a la tarea de pasar mas tiempo en mi casa o con mi prometida que en el trabajo. Note que la mayoría del tiempo pasamos compilando y compilando proyectos una y otra vez, algunas para probar y otras para hacer deploy.

En la realidad los programadores hacemos muchas veces las tareas de deploy a mano. Hasta hace no mucho la manera mas común de hacer deploy de IOS por ejemplo era archivar desde XCode y después subir a la tienda. No es algo que sea 100% manual pero archivar un proyecto toma al menos unos 30 minutos (depende) sin contar los otros 20 de subir (depende) y otros 45 esperando el “pre-posesamiento” para después ahora si poder seleccionar el build y enviar a Apple. Esto quiere decir que al día quizá te tome de 1 a 2 horas hacer un deploy ya sea para testflight o para enviar a la tienda. Durante esta hora por lo regular no hay mucho que hacer. Afortunadamente existe reddit o XKCD que lo hacen mucho mas ameno. Obviamente hay compilaciones mas veloces que usan cache para que solo se compilen los cambios. Pero todos sabemos que aveces en el momento del archive si hay algo mal en una version de device o entorno distinto tenemos que probar en lo mas similar al target posible. Hace años me preguntaba como era que las empresas grandes desperdiciaban tanto tiempo en compilaciones. ¿Cuánto tardará Windows XP en compilar?.

La respuesta es que realmente los programadores no compilan su software que va a producción de hecho muchas veces sus computadoras ni lo compilan o no lo pueden compilar. Existen maquinas que se dedican a compilar y generar los builds necesarios.

Después de resolver estas preguntas pensé ¿Y cada cuando se mandan a build?. Y me tope con el termino de CI.

La integración continua (continuous integration en inglés) es un modelo informático propuesto inicialmente por Martin Fowler que consiste en hacer integraciones automáticas de un proyecto lo más a menudo posible para así poder detectar fallos cuanto antes. Entendemos por integración la compilación y ejecución de pruebas de todo un proyecto. (Wikipedia)

La respuesta es cada que sea necesario. Muchas veces, entre mas veces mejor. Es mas si cada cambio puedo hacer que una maquina remota pruebe y compile por mi estoy seguro que lo que hago no va a romper nada. Quitando el dolor de cabeza que es mover algo y que esto otro se rompa. Obviamente esto no es gratis cuesta recursos a tu empresa o servicio que uses y mandar absolutamente todo puede resultar muy costoso. Pero que tal si lo haces antes de mandar un pull request y te quitas la pena de que tu branch no compile. Por la pura sanidad mental de saber que el software que programaste hace años sigue compilando al día de hoy es importante mantener un mínimo setup. Por ejemplo si sale XCode 10 y tengo un script que compile cada semana con las ultimas versiones se que mi app sigue vigente y que cuando regrese a programar a ella al menos mi setup actualizado podia recompilarla. Cuantas veces no te ha pasado que ya no tienes los tools para compilar algo, pero si hubieras seguido la ruta natural del desarrollo hubieran sido saltos chiquitos.

Los sistemas de CI modernos son super sencillos de usar. Yo uso Bitrise. Para empezar uno paga 50 USD al mes por un server que corre mis apps cada push o pull request por un máximo de 45 minutos. A cada app le programo un set de pruebas de UI y Unitarias. No entrare en detalle pero las Unitarias me sirven para saber que mi código hace lo que tiene que hacer o que mis clientes siguen estando vigentes con la api. Las de UI me sirven para ver si mi UI no se ha roto por alguna razón y que el usuario puede usar la app de manera natural. He llegado a probar servicios como Amazon Device Farm y Firebase Test lab donde puedo probar directamente mi app en devices que no tengo para estar seguro que funciona. También puedes detallar condiciones como que el dispositivo no tenga internet o no este actualizado o simplemente tenga poca batería.

La mayor ventaja desde mi punto de vista es que puedo desde el día uno tener el setup de desarrollo hasta deploy. No tengo que esperar al ultimo día para saber como hacer un deploy o compilar mi app. Ademas puedo mandarle a mi cliente y superiores versiones diarias o rápido de ser necesario sabiendo que funcionan y que no le tronaran al abrir. Adicionalmente puedo subirlas cuando voy a salir del trabajo y al otro día ver mi evaluación del día anterior y así ser mejor en mi flujo. Esto me da mas tiempo de estar en mi casa y menos en el trabajo compilando.

Yo personalmente agrego algo para verificar lint, code coverage y obvio el set de pruebas. Según la herramienta que uses existen soluciones gratis que te ayudan con esto. Muchas veces tu misma herramienta ya lo hace. Recuerda que el hacer software se considera una ingeniería y debe ser tratada como tal. Tener proceso a todos los niveles para minimizar riesgos y resolver problemas de las personas. Aun cuando trabaje para un proyecto personal siempre uso CI.

Por cierto el simbolito que vez en Github que dice PASSED significa que paso por una herramienta que valido que el producto al menos compila :)

http://www.continuousintegrationtools.com/