Compilación, prueba e implementación de aplicaciones Xcode

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2019

Aprenda a compilar e implementar proyectos de Xcode con Azure Pipelines.

Prerrequisitos

Creación de la canalización

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Ve a Canalizaciones y selecciona Nueva canalización o Crear canalización si vas a crear tu primera canalización.

  3. Siga los pasos del asistente y seleccione primero GitHub como ubicación del código fuente.

  4. Puede que se le redirija a GitHub para iniciar sesión. Si es así, escriba sus credenciales de GitHub.

  5. Cuando vea la lista de repositorios, seleccione el repositorio.

  6. Es posible que se le redirija a GitHub para instalar la aplicación Azure Pipelines. Si es así, seleccione Aprobar e instalar.

Cuando aparezca la pestaña Configurar, seleccione Xcode.

  1. Cuando aparezca la nueva canalización, eche un vistazo al archivo YAML para ver lo que hace. Cuando esté listo, seleccione Guardar y ejecutar.

    Botón Guardar y ejecutar en una canalización YAML nueva

  2. Se le pedirá que confirme un nuevo archivo azure-pipelines.yml en el repositorio. Cuando esté satisfecho con el mensaje, seleccione de nuevo Guardar y ejecute.

    Si quiere ver la canalización en acción, seleccione el trabajo de compilación.

    Acaba de crear y ejecutar una canalización que se creó automáticamente, ya que el código parecía encajar bien con la plantilla de Xcode.

    Ahora ya tiene una canalización YAML que funciona (azure-pipelines.yml) en el repositorio que está lista para que la personalice.

  3. Cuando esté listo para realizar cambios en la canalización, selecciónela en la página Canalizaciones y, luego, haga clic en Editar para modificar el archivo azure-pipelines.yml.

Consulte las secciones siguientes para saber más sobre algunas de las formas más comunes de personalizar la canalización.

Sugerencia

Para realizar cambios en el archivo YAML como se describe en este tema, seleccione la canalización en la página Canalizaciones y, luego, elija Editar para abrir un editor para el archivo azure-pipelines.yml.

Entorno de compilación

Puede usar Azure Pipelines para compilar las aplicaciones de Xcode sin tener que configurar ninguna infraestructura propia. Xcode está preinstalado en agentes macOS hospedados por Microsoft en Azure Pipelines. Puede usar los agentes de macOS para ejecutar las compilaciones.

Para conocer las versiones exactas de Xcode que están preinstaladas, consulte Agentes hospedados por Microsoft.

Cree un archivo llamado azure-pipelines.yml en la raíz del repositorio. A continuación, agregue el siguiente fragmento de código al archivo azure-pipelines.yml para seleccionar el grupo de agentes adecuado:

# https://learn.microsoft.com/azure/devops/pipelines/ecosystems/xcode
pool:
  vmImage: 'macOS-latest'

Compilación de una aplicación con Xcode

Para compilar una aplicación con Xcode, agregue el siguiente fragmento de código al archivo azure-pipelines.yml. Se trata de un fragmento de código mínimo para compilar un proyecto de iOS mediante su esquema predeterminado, para el simulador y sin empaquetar. Cambie los valores para que coincidan con la configuración de su proyecto. Consulte la tarea Xcode para más información sobre estas opciones.

pool:
  vmImage: 'macos-latest'

steps:
- task: Xcode@5
  inputs:
    actions: 'build'
    scheme: ''
    sdk: 'iphoneos'
    configuration: 'Release'
    xcWorkspacePath: '**/*.xcodeproj/project.xcworkspace'
    xcodeVersion: 'default' # Options: 10, 11, 12, 13, 14, default, specifyPath

Firma y aprovisionamiento

Una aplicación de Xcode debe estar firmada y aprovisionada para ejecutarse en un dispositivo o publicarse en App Store. El proceso de firma y aprovisionamiento necesita acceso al certificado de firma P12 y a uno o varios perfiles de aprovisionamiento. Las tareas Instalar certificado de Apple e Instalar perfil de aprovisionamiento de Apple permiten que estén disponibles para Xcode durante una compilación.

Consulte Firma de la aplicación móvil para más información.

Carthage

Si el proyecto usa Carthage con un repositorio privado de Carthage, puede configurar la autenticación estableciendo la variable de entorno GITHUB_ACCESS_TOKEN con un valor de un token que tenga acceso al repositorio. Carthage detectará y usará automáticamente esta variable de entorno.

No agregue el token de secreto directamente a la canalización YAML. En su lugar, cree una nueva variable de canalización con su bloqueo habilitado en el panel "Variables" para cifrar este valor. Consulte Variables de secreto.

Este es un ejemplo que usa la variable de secreto myGitHubAccessToken como valor de la variable de entorno GITHUB_ACCESS_TOKEN.

- script: carthage update --platform iOS
  env:
    GITHUB_ACCESS_TOKEN: $(myGitHubAccessToken)

Pruebas en dispositivos hospedados por Azure

Agregue la tarea Prueba de App Center para probar la aplicación en un laboratorio hospedado de dispositivos iOS y Android. Se requiere una evaluación gratuita de App Center que más adelante se debe pasar a la opción de pago.

Primero, regístrese en App Center.

# App Center test v1
# Test app packages with Visual Studio App Center.
- task: AppCenterTest@1
  inputs:
    appFile: # string. Alias: app. Required. Binary application file path. 
    artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest' # string. Alias: artifactsDir. Required. Artifacts directory. Default: $(Build.ArtifactStagingDirectory)/AppCenterTest.
  # Prepare Tests
    #prepareTests: true # boolean. Alias: enablePrepare. Prepare tests. Default: true.
    frameworkOption: 'appium' # 'appium' | 'espresso' | 'calabash' | 'uitest' | 'xcuitest'. Alias: framework. Required when enablePrepare = true. Test framework. Default: appium.
    #appiumBuildDirectory: # string. Alias: appiumBuildDir. Required when enablePrepare = true && framework = appium. Build directory. 
    #espressoBuildDirectory: # string. Alias: espressoBuildDir. Optional. Use when enablePrepare = true && framework = espresso. Build directory. 
    #espressoTestApkFile: # string. Alias: espressoTestApkPath. Optional. Use when enablePrepare = true && framework = espresso. Test APK path. 
    #calabashProjectDirectory: # string. Alias: calabashProjectDir. Required when enablePrepare = true && framework = calabash. Project directory. 
    #calabashConfigFile: # string. Optional. Use when enablePrepare = true && framework = calabash. Cucumber config file. 
    #calabashProfile: # string. Optional. Use when enablePrepare = true && framework = calabash. Profile to run. 
    #calabashSkipConfigCheck: false # boolean. Optional. Use when enablePrepare = true && framework = calabash. Skip Configuration Check. Default: false.
    #uiTestBuildDirectory: # string. Alias: uitestBuildDir. Required when enablePrepare = true && framework = uitest. Build directory. 
    #uitestStorePath: # string. Optional. Use when enablePrepare = true && framework = uitest. Store file. 
    #uiTestStorePassword: # string. Alias: uitestStorePass. Optional. Use when enablePrepare = true && framework = uitest. Store password. 
    #uitestKeyAlias: # string. Optional. Use when enablePrepare = true && framework = uitest. Key alias. 
    #uiTestKeyPassword: # string. Alias: uitestKeyPass. Optional. Use when enablePrepare = true && framework = uitest. Key password. 
    #uiTestToolsDirectory: # string. Alias: uitestToolsDir. Optional. Use when enablePrepare = true && framework = uitest. Test tools directory. 
    #signInfo: # string. Optional. Use when framework = calabash || framework = uitest. Signing information. 
    #xcUITestBuildDirectory: # string. Alias: xcuitestBuildDir. Optional. Use when enablePrepare = true && framework = xcuitest. Build directory. 
    #xcUITestIpaFile: # string. Alias: xcuitestTestIpaPath. Optional. Use when enablePrepare = true && framework = xcuitest. Test IPA path. 
    #prepareOptions: # string. Alias: prepareOpts. Optional. Use when enablePrepare = true. Additional options. 
  # Run Tests
    #runTests: true # boolean. Alias: enableRun. Run tests. Default: true.
    credentialsOption: 'serviceEndpoint' # 'serviceEndpoint' | 'inputs'. Alias: credsType. Required when enableRun = true. Authentication method. Default: serviceEndpoint.
    #serverEndpoint: # string. Required when enableRun = true && credsType = serviceEndpoint. App Center service connection. 
    #username: # string. Required when enableRun = true && credsType = inputs. App Center username. 
    #password: # string. Required when enableRun = true && credsType = inputs. App Center password. 
    appSlug: # string. Required when enableRun = true. App slug. 
    devices: # string. Required when enableRun = true. Devices. 
    #series: 'master' # string. Optional. Use when enableRun = true. Test series. Default: master.
    #dsymDirectory: # string. Alias: dsymDir. Optional. Use when enableRun = true. dSYM directory. 
    localeOption: 'en_US' # 'da_DK' | 'nl_NL' | 'en_GB' | 'en_US' | 'fr_FR' | 'de_DE' | 'ja_JP' | 'ru_RU' | 'es_MX' | 'es_ES' | 'user'. Alias: locale. Required when enableRun = true. System language. Default: en_US.
    #userDefinedLocale: # string. Optional. Use when enableRun = true && locale = user. Other locale. 
    #loginOptions: # string. Alias: loginOpts. Optional. Use when enableRun = true && credsType = inputs. Additional options for login. 
    #runOptions: # string. Alias: runOpts. Optional. Use when enableRun = true. Additional options for run. 
    #skipWaitingForResults: false # boolean. Alias: async. Optional. Use when enableRun = true. Do not wait for test result. Default: false.
  # Advanced
    #cliFile: # string. Alias: cliLocationOverride. App Center CLI location. 
    #showDebugOutput: false # boolean. Alias: debug. Enable debug output. Default: false.

Retención de artefactos con el registro de compilación

Agregue las tareas Copiar archivos y Publicar artefactos de compilación para almacenar el IPA con el registro de compilación o probarlo e implementarlo en canalizaciones subsiguientes. Consulte Artefactos.

- task: CopyFiles@2
  inputs:
    contents: '**/*.ipa'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)'
    ArtifactName: 'drop'
    publishLocation: 'Container'

Implementar

App Center

Agregue la tarea Distribución de App Center para distribuir una aplicación a un grupo de evaluadores o usuarios beta, o promover la aplicación a Intune o a App Store de Apple. Se requiere una cuenta gratuita de App Center (no es necesario ningún pago).

# App Center distribute v3
# Distribute app builds to testers and users via Visual Studio App Center.
- task: AppCenterDistribute@3
  inputs:
    serverEndpoint: # string. Required. App Center service connection. 
    appSlug: # string. Required. App slug. 
    appFile: # string. Alias: app. Required. Binary file path. 
    #buildVersion: # string. Build version. 
    releaseNotesOption: 'input' # 'input' | 'file'. Alias: releaseNotesSelection. Required. Create release notes. Default: input.
    releaseNotesInput: # string. Required when releaseNotesSelection = input. Release notes. 
    #releaseNotesFile: # string. Required when releaseNotesSelection = file. Release notes file. 
    #isMandatory: false # boolean. Require users to update to this release. Default: false.
    destinationType: 'groups' # 'groups' | 'store'. Required. Release destination. Default: groups.
    #distributionGroupId: # string. Alias: destinationGroupIds. Optional. Use when destinationType = groups. Destination IDs. 
    #destinationStoreId: # string. Required when destinationType = store. Destination ID. 
    #isSilent: # boolean. Optional. Use when destinationType = groups. Do not notify testers. Release will still be available to install. 
  # Symbols
    #symbolsOption: 'Apple' # 'Apple' | 'Android' | 'UWP'. Alias: symbolsType. Symbols type. Default: Apple.
    #symbolsPath: # string. Optional. Use when symbolsType == AndroidNative || symbolsType = Windows. Symbols path. 
    #appxsymPath: # string. Optional. Use when symbolsType = UWP. Symbols path (*.appxsym). 
    #symbolsDsymFiles: # string. Alias: dsymPath. Optional. Use when symbolsType = Apple. dSYM path. 
    #symbolsMappingTxtFile: # string. Alias: mappingTxtPath. Optional. Use when symbolsType = Android. Mapping file. 
    #nativeLibrariesPath: # string. Optional. Use when symbolsType == Android. Native Library File Path. 
    #symbolsIncludeParentDirectory: # boolean. Alias: packParentFolder. Optional. Use when symbolsType = Apple. Include all items in parent folder.

App Store de Apple

Instale la extensión App Store de Apple y use las siguientes tareas para automatizar la interacción con App Store. De forma predeterminada, estas tareas se autentican en Apple mediante una conexión de servicio que configure.

Release

Agregue la tarea Lanzamiento de App Store para automatizar el lanzamiento de actualizaciones para las aplicaciones beta TestFlight de iOS existentes o las aplicaciones de producción de App Store.

Consulte las limitaciones de uso de esta tarea con la autenticación en dos fases de Apple, ya que la autenticación de Apple es específica de la región y los tokens de sesión fastlane expiran rápidamente y se deben volver a crear y configurar.

- task: AppStoreRelease@1
  displayName: 'Publish to the App Store TestFlight track'
  inputs:
    serviceEndpoint: 'My Apple App Store service connection' # This service connection must be added by you
    appIdentifier: com.yourorganization.testapplication.etc
    ipaPath: '$(build.artifactstagingdirectory)/**/*.ipa'
    shouldSkipWaitingForProcessing: true
    shouldSkipSubmission: true

Promoción

Agregue la tarea Promoción de App Store para automatizar la promoción de una aplicación enviada previamente de iTunes Connect a App Store.

- task: AppStorePromote@1
  displayName: 'Submit to the App Store for review'
  inputs:
    serviceEndpoint: 'My Apple App Store service connection' # This service connection must be added by you
    appIdentifier: com.yourorganization.testapplication.etc
    shouldAutoRelease: false