¿Cómo crear CD/CI en Azure Pipelines para aplicaciones Xamarin?

Desde nuestro blog hemos escrito sobre DevOps, lo importante que es y los muchos beneficios que aporta tanto a nuestra empresa como a nuestros flujos de trabajo.

Es por eso que hoy veremos cómo crear una pipeline para una aplicación Xamarin.Forms para Android, y así alimentar la Integración Continua (CI) de nuestro proyecto con Azure DevOps.

El primer requisito será, por supuesto, tener una organización con un proyecto, en el que trataremos con la aplicación en Xamarin. Nuestro código bien podría estar en un repositorio de GitHub o de Azure DevOps, pero para este ejemplo lo tendremos en Azure DevOps.

Una vez tenemos nuestro repositorio preparado para ser analizado, empezamos a crear nuestra pipeline. Accederemos entonces a los servicios de Pipelines, en la sección de Builds. Aquí crearemos una nueva pipeline.

Where is your code?

Para nuestra aplicación, usaremos la última opción. Es decir, el editor clásico de pipelines, sin necesidad de escribir las especificaciones de la pipeline en un fichero YAML.

Es el momento de seleccionar el repositorio sobre el que vamos a realizar la integración continua. Tal como hemos comentado antes, utilizaremos el código que se encuentra en un repositorio de Azure DevOps. Por lo que lo seleccionamos como en la imagen, así como la rama sobre la que se va a ejecutar la pipeline, en nuestro caso, master.

Determinado esto, es el momento de elegir la plantilla de nuestra pipeline. Existen muchas plantillas para muchos tipos de proyectos. Y existe una específica para una aplicación Xamarin.Android, como vemos en la imagen. Podemos usar el buscador para encontrarla de forma más sencilla.

Una vez localizada, pulsaremos en ella y después, en el botón Apply.

Tras la aplicación de la plantilla, podemos ver lo que esta incluye, y todo lo que podemos personalizar en esta.

Como podemos observar, es posible cambiar el nombre de la pipeline, por si es necesario referirnos a ella de una forma específica.

En la Task de Build o compilación, encontramos también información interesante.

A fin de que la compilación tenga éxito, nuestra solución de Xamarin debe cumplir un requisito. En el fichero csproj del proyecto de Android en Xamarin, la propiedad AndroidUseAapt2 debe estar en false.

Otra de las Tasks que añade por defecto, es la firma de la APK que se genera de nuestro proyecto. La función que firma nuestro APK, Sign the APK, está desactivada por defecto. Pero al momento de marcar el checkbox, se hace patente que necesitaremos información adicional para que tenga éxito.

Concretamente, necesitaremos la keystore y tres valores adicionales: keystore password, su alias y key password.

Empezando por la keystore, podemos seleccionar el botón de configuración que tenemos a la derecha, para seleccionar la keystore de nuestro proyecto. Una vez añadida, la configuración de esta Task no tiene ningún requisito obligatorio, pero tendremos que añadir información indispensable para nuestra keystore.

Ya tenemos la keystore añadida a la pipeline, solo faltan los tres campos adicionales con los que realizar la firma de la APK. Estos campos, como es natural, contienen información sensible que no debe ser visible para cualquiera.

Por lo que, para evitar escribirlas en texto plano y en claro, las pipelines contienen una sección para crear variables donde almacenar información sensible de forma que sea secreta y gestionarla de forma muy sencilla.

Estas son las variables que se crean por defecto en una nueva pipeline

… y para añadir una nueva, solo tenemos que pulsar el botón de Add, proporcionarle un nombre descriptivo, añadir el valor que contiene… y marcar la columna de privacidad, de modo que el candado quede cerrado. Comprobaremos que entonces el valor de nuestra variable pasa a estar en asteriscos, ocultando su contenido, siendo privada hasta que la columna de privacidad cambie su valor.

Creamos tres variables para keystore password, alias y key password, todas ellas privadas por su contenido sensible. Es momento de referenciarlas en la pipeline, y el modo en que llamamos a una variable sigue una sintaxis muy específica: $(nombre-de-variable). En la imagen podemos ver el ejemplo de las tres variables utilizadas.

Una vez añadida esta información, podemos guardar y encolar la pipeline, ¡y esperar el resultado!

Tras la ejecución, tendremos los resultados

Entre las últimas Tasks de la pipeline, tenemos la que publica el Artifact generado. Y como vemos, en el resultado, tenemos el botón de Artifacts.

Si pulsamos en este botón, se abrirá un desplegable que ofrecerá el directorio en el cual se almacenan los ficheros generados. Haciendo click derecho sobre el directorio drop podemos descargar un fichero comprimido con todo su contenido, así como obtener una URL que compartir si necesitamos hacerlo.

¡Esto es todo!

Y así creamos una pipeline para una aplicación Xamarin.Android. Es realmente sencillo crearla, configurarla y añadir más Tasks para tareas específicas de necesitarlas.

Como hemos comprobado, Azure DevOps es una herramienta más que completa con funcionalidades increíbles a las que solo nos hemos asomado.

¡Confiamos haber sido buenos guías al dar un paso más hacia la cultura DevOps!

Deployment en AppCenter

Las pipelines que creamos a través de plantillas cuentan con dos pasos finales que, por defecto, aparecen deshabilitados. Estos dos últimos pasos son los que tratan con AppCenter, tanto para testing como para desployment en AppCenter.

El artifact que generamos a través de la pipeline es el fichero APK que entregaremos a AppCenter como release, así que vamos a sumergirnos en el proceso.

Lo primero será hacer click derecho en la última tarea de la pipeline, para habilitarla y hacer que se ejecute la próxima vez que se encole la pipeline.

Tenemos muchos datos para rellenar, así que iremos uno por uno.

El primero de todos es el nombre de la tasks, que podemos dejar intacto.

El segundo es el AppCenter Service Connection. Si es la primera vez, tendremos que añadir una nueva conexión al servicio. Al seleccionar una nueva conexión, se abre un panel lateral en el que añadimos la nueva conexión.

Los datos a añadir son:

API Token: un token que generamos

Escrito por: Elena Guzmán, parte del equipo DevOps en Bravent.