Neutron, nuestro motor de IA, obtuvo un 96.75% en el benchmark CyberGym de UC Berkeley. Más información

Producto

Producto

CI/CD móvil con Jenkins, GitHub Actions y Azure DevOps

Este artículo repasa los principales desafíos al implementar un pipeline de CI/CD para aplicaciones móviles. También ofrecemos ejemplos de cómo implementar un pipeline de CI/CD para aplicaciones Android e iOS en las herramientas de CI/CD móvil más utilizadas.

El 85% de los equipos que integraron el escaneo de seguridad en su pipeline de CI/CD cumplen su SLO de aplicación de parches, corrigen las vulnerabilidades más rápido, modifican el código con más frecuencia y expresan una mejor comprensión de su base de código.

Este artículo repasa los principales desafíos al implementar un pipeline de CI/CD para aplicaciones móviles. También ofrecemos ejemplos de cómo implementar pipelines de integración continua para aplicaciones Android e iOS en las herramientas de CI/CD móvil más utilizadas.

Antes de incorporar comprobaciones de seguridad a nuestros pipelines de CI/CD, debemos asegurarnos de que estén construidos correctamente y sean estables, y de que contemos con la observabilidad adecuada para corregirlos si algo falla.

Estos son algunos de los desafíos habituales que vemos al adoptar CI/CD para aplicaciones móviles:

  • Falta de experiencia en CI/CD:

    La mayoría de las soluciones de DevOps requieren una experiencia avanzada en CI/CD para configurar, personalizar y mantener correctamente los flujos de trabajo y procesos automatizados. La mayoría de los desarrolladores de aplicaciones necesitan tiempo y experiencia para adquirir este conjunto de habilidades.
  • Responsabilidades poco claras:

    Implementar CI/CD no es una tarea que se haga una sola vez. Como todo código escrito por personas, puede fallar, romperse o comportarse de forma inesperada. Por ello, una gestión o una implementación deficiente del pipeline de CI/CD suele complicar la identificación inmediata de las causas del fallo. Esto, a su vez, dificulta derivar el problema a los equipos responsables para que corrijan los errores de código.

  • Limitarse a los entornos de Dev y QA frente al de Prod:

    Una aplicación móvil suele constar de un binario cliente instalado en el dispositivo y de un backend con el que se comunica mediante una API. El pipeline de CI/CD puede tener distintas configuraciones y entornos para ejecutar las pruebas. Un error común es probar con los entornos de Dev y QA y pasar por alto las diferencias con el entorno de Prod. Así, el código en producción queda sin probar y puede contener errores, problemas de seguridad o fallos inesperados.

  • Descuidar el análisis dinámico:

    Muchas empresas implementan pipelines de CI con análisis estático únicamente. Esto se debe sobre todo a la dificultad de automatizar el análisis dinámico de la aplicación. El análisis estático busca analizar binarios o código fuente para encontrar patrones conocidos de vulnerabilidades. Sin embargo, es sabido que el análisis estático genera demasiadas alertas por fallos menores de software y defectos que no se explotan. Por eso el estándar OWASP recomienda implementar tanto análisis estático como dinámico. El análisis dinámico está diseñado para detectar vulnerabilidades de seguridad mientras la aplicación se ejecuta. Cubre únicamente el alcance utilizado en la aplicación y ofrece un alto grado de confianza sobre el problema identificado.

  • Dificultad para ejecutar la automatización de la interfaz de usuario:

    En un pipeline de CI/CD, automatizar las interacciones con la interfaz de usuario es un paso importante para aumentar la cobertura de las pruebas y garantizar su escalabilidad y calidad. El desafío habitual consiste en automatizar todas las interacciones con la interfaz y asegurarse de que sean estables en las distintas versiones de la aplicación, versiones del sistema operativo y múltiples dispositivos.

  • Limitaciones ocultas de los proveedores de CI/CD:

    Para tener un pipeline de CI/CD totalmente automatizado para una aplicación móvil, es necesario cumplir los rígidos requisitos del sistema operativo de la aplicación móvil, una firma de código rigurosa, SDK y herramientas que se actualizan con frecuencia, pruebas en dispositivos y el envío a la tienda de aplicaciones. Por ello, elegir el proveedor de CI/CD es fundamental para cubrir sus necesidades y facilitar la implementación y el mantenimiento.

Veamos ahora cómo podemos añadir la compilación de una aplicación móvil (Android e iOS) a algunas de las plataformas de CI/CD más utilizadas.

Integración continua para aplicaciones Android con Jenkins

Aprenderemos a generar un APK de Android a partir del código fuente en Jenkins. Supongo que ya tiene Jenkins instalado.

  • Paso 1: instalar el JDK de Java:
    En su terminal, ejecute:
sudo apt install default-jdk
  • Paso 2: instalar el SDK de Android:
    Vaya a la página de descargas de Android y obtenga el enlace que aparece en la tabla Command line tools only > Linux. No descargue nada; solo copie el enlace.
# here you paste the link you grabbed in the developer.android.com site
sudo -iu jenkins wget https://dl.google.com/android/repository/commandlinetools-linux-8512546_latest.zip
sudo -iu jenkins mkdir android-sdk
sudo -iu jenkins unzip commandlinetools-linux-8512546_latest.zip -d android-sdk

# this step is important to accept the Android SDK license
yes |sudo -iu jenkins android-sdk/tools/bin/sdkmanager --licenses
  • Paso 3: instalar el plugin de Gradle:

texto alternativo
Manage Jenkins

.1 Abra Jenkins: Manage Jenkins >> Manage Plugins >> Available

.2 Busque Gradle

texto alternativo
Buscar Gradle

.3 Haga clic en Install

texto alternativo
Gradle instalado

  • Paso 4: configurar Jenkins:

.1 Abra Jenkins: Manage Jenkins >> Configure System >> Global properties >> Environment variables

texto alternativo
Añadir variables

.2 Añada las variables:

  # depending on your local paths
  ANDROID_HOME : /var/lib/jenkins/android-sdk
  JAVA_HOME : /usr/lib/jvm/java-11-openjdk-amd64

texto alternativo
Añadir la variable Android Home

  • Paso 5: crear el job de compilación de Android:

.1 Abra Jenkins: New Item

.2 Introduzca el nombre del job

.3 Elija un proyecto Freestyle y pulse OK

.4 Vaya a Source Code Management -> marque Git y rellene:

  • Repository URL: la URL de Git de su repositorio. Tómela de GitHub. Debe tener el formato git@github.com:{username}/{repo}.git

  • Credentials: seleccione sus credenciales o cree unas nuevas en el menú de credenciales.

  • Branches to build: branch_name

.5 En la sección Build, seleccione Invoke Gradle script

texto alternativo
Configuración de Gradle

.8 Introduzca el nombre de sus tareas

.9 En Post-build Actions, rellene Archive artifacts: **/*.apk

.10 Pulse Save

  • Paso 6: iniciar la compilación:

    En el panel del job, haga clic en Build Now y verá cómo se ejecuta el job. Una vez completada la compilación con éxito, podrá ver la aplicación Android generada en la información del proyecto.

texto alternativo
Artefactos APK

Integración continua para aplicaciones iOS con Jenkins

  • Paso 1: instalación de Jenkins con el plugin de Xcode (requiere macOS):

.1 Abra Jenkins: Manage Jenkins >> Manage Plugins >> Available

.2 Busque Xcode integration

texto alternativo
Integración de Xcode con Jenkins

.3 Haga clic en Install

  • Paso 2: crear un equipo de desarrollo desde la configuración global de Jenkins:

.1 Abra Jenkins: Manage Jenkins >> Configure System

.2 Vaya a la sección Xcode builder

.3 Vaya a la sección Apple Development Teams y haga clic en el botón Add

.4 Rellene los dos campos Team Name y Development Team ID

texto alternativo
Equipo de desarrollo de Xcode en Jenkins

.5 Añada una sección Keychain

.6 Rellene los valores de Keychain Name y Keychain password (la ruta del keychain ya estará ahí)

texto alternativo
Keychain de Xcode en Jenkins

.7 Aplique y guarde

  • Paso 3: configurar el job de Jenkins para clonar el repositorio:

.1 Vaya a la ruta del proyecto en el workspace de Jenkins (/Users/Shared/Jenkins/Home/workspace)

.2 Abra el proyecto con Xcode

.3 En la pestaña General de Xcode, compruebe que el Provisioning profile y toda la información sean correctos

.4 Puede intentar compilar el proyecto con Xcode para asegurarse de que toda la información es correcta

.5 La casilla Automatically manage signing no debe estar marcada

.6 Anote el Team Name y el Bundle Identifier, ya que los usaremos en la configuración de Jenkins

  • Paso 5: configurar la compilación en Jenkins:

.1 Abra Jenkins, vaya a su proyecto y haga clic en configure

.2 En la sección Build, haga clic en el botón del paso build y seleccione la opción Xcode. Se añadirán los campos relacionados con Xcode.

.3 En General build settings, haga clic en el botón Settings

.4 Seleccione el Development Team que acaba de añadir a la configuración global de Jenkins

.5 Rellene Xcode Schema File:

.6 Seleccione la opción Pack application, build and sign .ipa?.

texto alternativo
Empaquetar y firmar el IPA en Jenkins

.7 El método de exportación del .app para generar el archivo .ipa. Debe ser uno de ‘development’, ‘ad-hoc’, ‘enterprise’ o ‘app-store'.

.8 .ipa filename pattern: un patrón para el nombre del archivo IPA. Puede usar ${VERSION} y ${BUILD_DATE} (yyyy.MM.dd) en esta cadena.

.9 Vaya a las opciones de Code signing & OS X keychain

.10 Seleccione Manual signing

.11 Rellene el Bundle ID y el Provisioning profile UUID (puede encontrarlo en el archivo .mobileprovision de su provisioning profile)

.12 Seleccione Unlock Keychain

.13 Seleccione en el menú desplegable el valor de Keychain que creó hace un momento

.14 Vaya a la sección de opciones Advanced Xcode build

.15 Rellene los campos Xcode Workspace File: y Xcode Project Directory: $WORKSPACE

.16 Pulse Apply y Save

  • Paso 6: iniciar la compilación:

En el panel del job, haga clic en Build Now y vea cómo se ejecuta el job.

Una vez completada la compilación con éxito, podrá ver la aplicación IPA generada en la información del proyecto.

Integración continua para aplicaciones Android con GitHub Actions

Los runners que ofrece GitHub Actions permiten ejecutar la compilación en Linux, Mac y Windows.

Todos los runners tienen Java y Android ya instalados y configurados (la lista de software preinstalado es bastante larga). Los workers pueden compilar la mayoría de los proyectos Android sin configuración adicional.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout the code
        uses: actions/checkout@v2
      - name: Build the app
        run: ./gradlew build

Integración continua para aplicaciones iOS con GitHub Actions

Para compilar el IPA, usaremos la tarea yukiarrr/ios-build-action. La acción compila el proyecto iOS y puede exportarlo a un archivo IPA. Puede consultar la documentación completa en el repositorio de GitHub

name: Build and sign Ipa file

on:
 push:
   branches: [ main ]
 pull_request:
   branches: [ main ]

jobs:
 build:
   runs-on: macos-latest

   steps:
   - uses: actions/checkout@v2
   - name: Build and export iOS
     uses: yukiarrr/ios-build-action@v1.5.0
     with:
       project-path:
       workspace-path: ".xcworkspace path"
       scheme: "project name"
       export-method: "Choose app-store, ad-hoc, package, enterprise, development"
       configuration: "Choose Debug or Release"
       output-path: artifacts/output.ipa
       p12-base64: ${{ secrets.P12_BASE64 }}
       certificate-password: ${{ secrets.P12_PASSWORD }}
       mobileprovision-base64: ${{ secrets.ADHOC_MOBILEPROVISION_BASE64 }}
       code-signing-identity: ${{ secrets.CODE_SIGNING_IDENTITY }}
       team-id: ${{ secrets.TEAM_ID }}

Integración continua para aplicaciones Android con Azure DevOps

  • Paso 1: preparar el pipeline:

texto alternativo
Azure DevOps

.1 Abra su proyecto y navegue a la sección Pipelines del panel izquierdo

.2 Haga clic en Create Pipeline

.3 Seleccione su repositorio de Git

Se genera un pipeline Yaml vacío. Ahora debemos compilar el archivo binario con Gradle.

  • Paso 2: compilar el archivo APK con una tarea de Gradle:

.1 Haga clic en show assistant

texto alternativo
Azure DevOps: mostrar el asistente

.2 Busque Gradle

texto alternativo
Azure DevOps Gradle

.3 Puede desactivar Publish to Azure Pipeline en la sección JUnit Test Results

.4 Establezca el nombre de su tarea para compilar el archivo

.5 Haga clic en el botón Add

.6 Haga clic en Save para guardar nuestro pipeline de CI

También puede añadir las tareas 'Copy files' y 'Publish build artifacts' para incorporar el archivo generado al pipeline si desea ejecutar otros jobs sobre él.

Integración continua para aplicaciones iOS con Azure DevOps

  • Paso 1: preparar el pipeline:

.1 Abra su proyecto y navegue a la sección Pipelines del panel izquierdo

.2 Haga clic en Create Pipeline

.3 Seleccione su repositorio de Git

Se genera un pipeline Yaml vacío. Ahora debemos compilar el archivo binario con Gradle.

  • Paso 2: compilar el archivo APK con una tarea de Gradle:

Necesitamos el provisioning profile y el certificado de iOS para firmar el archivo IPA.

Para subirlos a nuestro pipeline, usaremos la sección Secure files:

.1 Vaya a pipelines -> Library -> Secure files

texto alternativo
Azure DevOps: Secure files

.2 Suba su archivo de provisioning. En mi caso, lo llamaré my_provision_profile_ostorlab

.3 Exporte la certificate public key (.p12) y súbala. La llamaré my_certificate.p12

.4 Vuelva a su pipeline y añada tres variables:

p12FileName = my_certificate.p12
p12Password = my_certificate_password
provisioningProfile = my_provision_profile_ostorlab

texto alternativo
Variables de Azure DevOps

.5 Haga clic en show assistant

.6 Busque install apple provisioning

texto alternativo
Azure DevOps Gradle

.7 Rellene provProfileSecureFile con la variable $(provisioningProfile)

.8 Haga clic en Add

.9 Haga clic en show assistant

.10 Busque install apple certificate

texto alternativo
Azure DevOps Gradle

.11 Rellene el nombre del archivo y la contraseña con el contenido de las variables

.12 Haga clic en Add

  • Paso 3: compilar y firmar el archivo IPA:

Para compilar el archivo .ipa, necesitamos usar macOS como vmImage.

.1 Debemos añadir la build configuration como variable. Puede establecer el valor como Debug o Release.

.2 Debemos añadir la variable SDK. Desde la aplicación Terminal de macOS, ejecute xcodebuild -showsdks para mostrar la lista de SDK válidos.

.3 Haga clic en show assistant

.4 Busque Xcode

texto alternativo
Azure DevOps Xcode

.5 En Signing style, seleccione Manual signing

.6 Rellene Signing identity con el valor $(APPLE_CERTIFICATE_SIGNING_IDENTITY). Esta variable corresponde a ‘Install Apple Certificate’, que añadimos anteriormente

.7 Rellene Provisioning profile UUID con el valor $(APPLE_PROV_PROFILE_UUID) definido por la tarea Install Apple Provisioning Profile’.

.8 Haga clic en Add

.9 Haga clic en Save para guardar nuestro pipeline de CI.

Si ejecuta su compilación por primera vez, fallará y le pedirá que conceda acceso a las variables y a los secure files. Haga clic en Authorize resources y vuelva a ejecutar su compilación.

En este artículo repasamos algunos desafíos al implementar pipelines de CI/CD. También vimos cómo compilar aplicaciones móviles APK e IPA en las plataformas de CI más utilizadas. La implementación de CI debe completarse con un pipeline de CD que automatice el despliegue tras el proceso de revisión. Dado que el ámbito de las aplicaciones móviles cuenta con múltiples frameworks para desarrollar y compilar la aplicación, la implementación de CI puede variar según las herramientas del framework.

El siguiente artículo tratará el framework Flutter y cómo puede automatizar la compilación en esas plataformas de CI/CD.