in Continuous Deployment

Compila y despliega tu aplicaci贸n iOS con Azure DevOps 馃殌

Lleg贸 el momento de subir tu app al App Store o enviarla para pruebas a TestFlight. 

Si lo haces manualmente probablemente sigas los siguientes pasos: 

  • Limpiar el proyecto, compilar tus dependencias
  • Elegir el Schema correcto
  • Aumentar el Build Number
  • Firmar tu app usando los certificados de Distribuci贸n, as铆 como los Perfiles de Aprovisionamiento.
  • Subirla al App Store

Hacerlo muchas veces puede llegar a ser repetitivo, consume mucho tiempo, y es propenso error. ( Cu谩ntas veces te olvidaste de aumentar el build number).

Adem谩s si trabajar en un entorno 谩gil las iteraciones hacia el 谩rea de Testing deber铆an ser lo m谩s r谩pido posible.

Si bien existen distintas soluciones cloud en el mercado (CircleCI, Bitrise, TravisCI). En esta entrada te mostrar茅 c贸mo automatizar la compilaci贸n y despliegue de tu aplicaci贸n iOS usando Azure DevOps.

Al inicio puede que te lleve un poco de tiempo configurarlo, pero el tiempo que ahorrar谩s a futuro valdr谩 la pena.

Requisitos:

  • Acceso al portal de Desarrolladores de Apple (Para configurar y descargar tus certificados)

Lo primero que necesitar谩s es tu certificados de Distribuci贸n:

  1. En el KeyChain de tu Mac, buscas el certificado de Distribuci贸n y le das exportar, te pedir谩 una contrase帽a de exportaci贸n, es importante recordarla, ya que la tendr谩s que configurar en Azure. Como resultado tendr谩s un archivo con extensi贸n .p12
  1. Ingresar al portal de Desarrolladores de Apple. Ingresar a la zona de “Profiles” y descargan su certificado. Este tendr谩 una extensi贸n .mobileprovision

Listo ahora tenemos 2 archivos:

  1. Iremos al portal de Azure DevOps (https://dev.azure.com/)

En la parte izquierda ingresamos a Pipelines -> Library -> Secure Files

Aqu铆 subiremos los archivos que generamos en los pasos 1 y 2

  1. En la parte de Variable Groups, creamos una nueva variable en “+ Variable Group”

Esto es con el objetivo de no usar los nombres de los archivos directo desde nuestro script si no a trav茅s de variables.

  1. Lo siguiente que necesitar谩n ser谩 un archivo de exportaci贸n (Que fu茅 incluido a partir de xCode 9.

Este paso solo lo tendr谩n que hace por 煤nica vez, para obtenerlo, sigan los pasos manuales para subir manualmente desde xCode, pero en vez de subirlo, le dan a exportar, esto les generar谩 un archivo .plist, parecido al siguiente: 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>destination</key>
	<string>export</string>
	<key>method</key>
	<string>app-store</string>
	<key>provisioningProfiles</key>
	<dict>
		<key>com.rcaos.company</key>
		<string>MyApp-Distribution</string>
	</dict>
	<key>signingCertificate</key>
	<string>Apple Distribution</string>
	<key>signingStyle</key>
	<string>manual</string>
	<key>stripSwiftSymbols</key>
	<true/>
	<key>teamID</key>
	<string>XAKAAKA0</string>
	<key>uploadBitcode</key>
	<true/>
	<key>uploadSymbols</key>
	<true/>
</dict>
</plist>

Listo, ese archivo lo incluyen como parte de su repositorio. Por ejemplo, en la ra铆z lo ubican como “EXPORT_OPTIONS.plist”

  1. Generar una nueva conexi贸n entre Azure y el Portal de Apple

Esto es para poder conectarse al AppleDeveloper Portal y subir nuestro archivo .ipa

En la parte inferior Project Settings -> Service Connections -> New Service Connection

Aqu铆 ingresan las credenciales de acceso a TestFlight

Es importante que el usuario con el que accedas tenga deshabilitado la autenticaci贸n en 2 pasos. Se recomienda crear un usuario solo para este fin (distinto de un usuario con Perfil developer)

  1. En el portal de Azure, ingresan a Pipelines -> New Pipeline

Al elegir su repositorio, Azure crear谩 un archivo azure-pipelines.yml, en este archivo definiremos las tareas que tiene ejecutar Azure Devops.

Recuerdan los pasos que hacemos manualmente desde xCode, pues son los mismos pero en forma de script.

Estructura del azure-pipelines-deployment.yml

Aqu铆 hacemos referencia a las variables que creamos en paso 4, as铆 como los datos de nuestra aplicaci贸n (Schema, Path, Bundle Id)

pool:
  vmImage: 'macos-latest'

variables:
- group: 'MYAPP_VARIABLE_GROUP'
- name: BUILD_CONFIGURATION
  value: 'appTestQA'
- name: 'WORKSPACE_PATH'
  value: './appTest.xcworkspace'
- name: SCHEME
  value: 'appTestQA'
- name: IPA_EXPORT_PATH
  value: 'build'
- name: EXPORT_OPTIONS_PLIST_NAME
  value: 'EXPORT_OPTIONS.plist'
- name: BUNDLE_IDENTIFIER
  value: 'com.rcaos.appTest'

Con esta tarea descargamos las dependencias de nuestro proyecto:

- task: CocoaPods@0
  displayName: 'Downloading dependencies using CocoaPods with a forced repo update'
  inputs:
    workingDirectory: './'
    forceRepoUpdate: true

Instalamos el Certificado de Distribuci贸n de Apple

- task: InstallAppleCertificate@2
  inputs:
    certSecureFile: $(CERTIFICATE_FILE_NAME)
    certPwd: '$(CERTIFICATE_PASSWORD)'
    keychain: 'temp'

Instalamos el Provisional Profile

- task: InstallAppleProvisioningProfile@1
  displayName: 'Installing Apple Provisioning Profile from Secure Files'
  inputs:
    provisioningProfileLocation: 'secureFiles'
    provProfileSecureFile: $(PROVISIONING_FILE_NAME)

Compilando y Firmando nuestra app:

- task: Xcode@5
  inputs:
    actions: 'build'
    configuration: $(BUILD_CONFIGURATION)
    scheme: $(SCHEME)
    sdk: 'iphoneos'
    packageApp: true 
    archivePath: $(IPA_EXPORT_PATH)
    exportPath: $(IPA_EXPORT_PATH)
    exportOptions: plist
    exportOptionsPlist: './$(EXPORT_OPTIONS_PLIST_NAME)'
    xcWorkspacePath: $(WORKSPACE_PATH)

Subiendo hacia el AppStore

- task: AppStoreRelease@1
  displayName: 'Releasing build to TestFlight'
  inputs:
    serviceEndpoint: 'App Store Connect - MyApp'
    appIdentifier: '$(BUNDLE_IDENTIFIER)'
    appType: 'iOS'
    ipaPath: '$(Build.artifactStagingDirectory)/**/*.ipa'
    releaseTrack: 'TestFlight'
    releaseNotes: 'Azure Pipelines'
    shouldSkipWaitingForProcessing: true
    teamName: '$(TEAM_NAME)'

Dependiendo de la magnitud de tu proyecto, por ejemplo para este proyecto tom贸 aproximadamente 22 minutos entre descargar las dependencias, compilar, firmar y subir al App Store.

Puedes encontrar el archivo YAML completo aqu铆:

https://gist.github.com/rcaos/ae24abba10a5a7df679279db76f37438

Fuentes:

Write a Comment

Comment