Compilaciones de Android con GitLab CI
Setting up CI/CD for Capacitor apps can be complex and time-consuming. Here’s what you need to know:
Requisitos previos
Antes de empezar, necesitarás configurar:
- Una cuenta de GitLab con acceso administrativo
- Su aplicación ya publicada en Google Play Store con firmado correctamente
- Clave de firma de Android y archivos de keystore
- Proyecto de Google Cloud Console con Play Store API habilitado
- Cuenta de servicio con permisos adecuados
- Conocimiento de flujos de trabajo de GitLab CI/CD
- Conocimiento de configuración de Fastlane
- Tiempo para mantener y depurar la pipeline
Configuración de CI/CD Profesional por Capgo
Saltarse la complejidad. Capgo configura su pipeline de CI/CD directamente en su plataforma preferida:
- Independencia de la plataforma: Funciona con GitHub Acciones, CI de GitLab o otros
- Integración Sin Problemas: No es necesario cambiar de plataforma, funciona con tu proceso actual
- Configuración Personalizada: Configuración personalizada que se adapta a las necesidades de tu proyecto
- Asesoramiento de Expertos: Ya hemos configurado CI/CD para +50 aplicaciones
Precios
- Tarifa de configuración única: $2,600
- Costos de ejecución actuales: ~$300/año
- Comparar con Otra solución propietaria: $6,000/año
- Ahorra $26,100 en 5 años
Guía de configuración manual
Si todavía quieres configurar todo tú mismo, aquí está lo que debes hacer:
Pasos a seguir en el post
- Copia archivos Fastlane
- Almacenar tus secretos en secretos cifrados de GitLab
- Crear y almacenar tu clave de servicio de Google Play
- Almacenar tu clave de firma de Android
- Configura tu archivo de flujo de trabajo de GitLab (.yml)
1. Copia archivos Fastlane
Fastlane es una biblioteca de Ruby creada para automatizar tareas comunes de desarrollo móvil. Al utilizar Fastlane, puedes configurar
Crear un carpeta Fastlane en la raíz de tu proyecto y copia los siguientes archivos: Fastlane
default_platform(:android)
KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]
platform :android do
desc "Deploy a beta version to the Google Play"
private_lane :verify_changelog_exists do |version_code: |
changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
UI.message("Changelog exists for version code #{version_code}")
end
private_lane :verify_upload_to_staging do |version_name: |
UI.message "Skipping staging verification step"
end
lane :beta do
keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
previous_build_number = google_play_track_version_codes(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
track: "internal",
json_key_data: json_key_data,
)[0]
current_build_number = previous_build_number + 1
sh("export NEW_BUILD_NUMBER=#{current_build_number}")
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
'versionCode' => current_build_number
})
upload_to_play_store(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
json_key_data: json_key_data,
track: 'internal',
release_status: 'completed',
skip_upload_metadata: true,
skip_upload_changelogs: true,
skip_upload_images: true,
skip_upload_screenshots: true,
)
end
lane :build do
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
})
end
lane :prod_release do
build_gradle = File.read("../android/app/build.gradle")
verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])
supply(
track_promote_to: 'beta',
skip_upload_apk: true,
skip_upload_aab: true,
skip_upload_metadata: false,
skip_upload_changelogs: false,
skip_upload_images: false,
skip_upload_screenshots: false
)
end
end
Almacenar tus secretos en variables de GitLab CI/CD
GitLab proporciona una forma de almacenar variables de CI/CD cifradas, similar a los secretos de repositorio de GitHub.
- Ve a la configuración de tu proyecto de GitLab.
- Navega a CI/CD > Variables
- Agrega las siguientes variables:
- ANDROID_KEYSTORE_FILE: el archivo base64 codificado
.jkso.keystoreel archivo utilizado para firmar tus compilaciones de Android. Este será el archivo de keystore asociado con tu clave de carga (si estás utilizando la firma de Play App Signing), o tu clave de firma de la aplicación. - KEYSTORE_KEY_PASSWORD: la contraseña asociada con el archivo de keystore
- KEYSTORE_KEY_ALIAS: el alias del almacén de claves
- KEYSTORE_STORE_PASSWORD: la contraseña de la clave privada
- DEVELOPER_PACKAGE_NAME: tu ID de aplicación de Android como com.example.app
- PLAY_CONFIG_JSON: La clave JSON de cuenta de servicio base64 codificada.
Crear una clave de servicio de Google Play
Para generar el PLAY_CONFIG_JSON segreto, sigue estos pasos:
- Ir a la Consola de Cloud de Google
- Crear un nuevo proyecto o seleccionar uno existente
- Habilitar el desarrollador de Android de Google Play API
- Crear una cuenta de servicio:
- Ir a “IAM & Administración” > “Cuentas de servicio”
- Hacer clic en “Crear cuenta de servicio”
- Darle un nombre y una descripción
- Haga clic en “Crear y Continuar”
- Pulse “Hecho” después de saltar la asignación de roles
- Genera una clave JSON:
- Encuentra tu cuenta de servicio en la lista
- Haz clic en el menú de tres puntos > “Administrar claves”
- Haz clic en “Agregar clave” > “Crear nueva clave”
- Elige formato JSON
- Haz clic en “Crear”
- Otorga acceso a la cuenta de servicio a tu aplicación en el Console de Play:
- Ve a Console de Play
- Navega a “Usuarios y permisos”
- Haga clic en “Invitar a nuevos usuarios”
- Ingrese el correo electrónico de la cuenta de servicio (termina con @*.iam.gserviceaccount.com)
- Otorgue la autorización “Lanzar a producción”
- Haga clic en “Invitar a usuario”
- Convirta la clave JSON a base64:
base64 -i path/to/your/service-account-key.json | pbcopy - Agregue la cadena base64 codificada como el
PLAY_CONFIG_JSONvariable en GitLab
Configuración de la Pipelina de CI/CD de GitLab
Crear un archivo .gitlab-ci.yml en la raíz de su proyecto para definir su pipelina de CI/CD. A continuación, se muestra un ejemplo de cómo estructurar su pipelina:
image: mingc/android-build-box:latest
stages:
- build
- upload_to_capgo
- build_and_upload_android
build:
stage: build
tags:
- saas-linux-xlarge-amd64
cache:
- key:
files:
- bun.lockb
paths:
- .node_modules/
script:
- npm install
- npm run build
artifacts:
paths:
- node_modules/
- dist/
only:
- master
upload_to_capgo:
stage: upload_to_capgo
tags:
- saas-linux-xlarge-amd64
script:
- npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
dependencies:
- build
when: manual
only:
- master
build_and_upload_android:
tags:
- saas-linux-xlarge-amd64
stage: build_and_upload_android
cache:
- key:
files:
- android/gradle/wrapper/gradle-wrapper.properties
paths:
- ~/.gradle/caches/
script:
- npx cap sync android
- npx cap copy android
- bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
dependencies:
- build
when: manual
only:
- master
Activar la Pipelina
Cada vez que envíe una nueva etiqueta a su repositorio de GitLab, la CI/CD de GitLab activará automáticamente la pipelina definida, que construirá y desplegará su aplicación de Android utilizando Fastlane.
Asegúrese de ajustar los caminos y dependencias según la estructura y requisitos de su proyecto. Esta configuración le ayudará a automatizar el despliegue de su aplicación de Android en la CI/CD de GitLab.
Conclusion
Al configurar GitLab CI/CD con la imagen de Docker mingc/android-build-box, puede automatizar el proceso de compilación de la aplicación Android, lo que hace que su flujo de trabajo de desarrollo sea más eficiente y confiable. Esta automatización libera su tiempo para centrarse en los aspectos clave del desarrollo de aplicaciones, lo que le ayuda a entregar aplicaciones Android de alta calidad de manera más eficiente.