Compilare, testare e distribuire app Xcode

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

Informazioni su come compilare e distribuire progetti Xcode con Azure Pipelines.

Prerequisiti

Creare la pipeline

  1. Accedere all'organizzazione di Azure DevOps e passare al progetto.

  2. Passare a Pipeline e quindi selezionare Nuova pipeline o Crea pipeline se si crea la prima pipeline.

  3. Eseguire i passaggi della procedura guidata selezionando prima di tutto GitHub come posizione del codice sorgente.

  4. Si potrebbe essere reindirizzati a GitHub per l'accesso. In questo caso, immettere le credenziali di GitHub.

  5. Quando si vede l’elenco dei repository, selezionarne uno.

  6. È possibile che si venga reindirizzati a GitHub per installare l'app Azure Pipelines. In tal caso, selezionare Approva e installa.

Quando viene visualizzata la scheda Configura , selezionare Xcode.

  1. Quando viene visualizzata la nuova pipeline, vedere YAML per vedere cosa fa. Quando si è pronti, selezionare Salva ed esegui.

    Pulsante Salva ed esegui in una nuova pipeline YAML

  2. Viene richiesto di eseguire il commit di un nuovo file azure-pipelines.yml nel repository. Dopo aver soddisfatto il messaggio, selezionare Salva ed esegui di nuovo.

    Se si vuole controllare la pipeline in azione, selezionare il processo di compilazione.

    È stata appena creata ed eseguita una pipeline creata automaticamente, perché il codice sembrava essere una corrispondenza valida per il modello Xcode .

    È ora disponibile una pipeline YAML funzionante (azure-pipelines.yml) nel repository che è pronta per la personalizzazione.

  3. Quando si è pronti per apportare modifiche alla pipeline, selezionarla nella pagina Pipeline e quindi Modificare il azure-pipelines.yml file.

Vedere le sezioni seguenti per informazioni su alcuni dei modi più comuni per personalizzare la pipeline.

Suggerimento

Per apportare modifiche al file YAML come descritto in questo argomento, selezionare la pipeline nella pagina Pipeline e quindi selezionare Modifica per aprire un editor per il azure-pipelines.yml file.

Ambiente di compilazione

È possibile usare Azure Pipelines per compilare le app con Xcode senza dover configurare un'infrastruttura personalizzata. Xcode è preinstallato negli agenti macOS ospitati da Microsoft in Azure Pipelines. È possibile usare gli agenti macOS per eseguire le compilazioni.

Per le versioni esatte di Xcode preinstallate, fare riferimento agli agenti ospitati da Microsoft.

Creare un file denominato azure-pipelines.yml nella radice del repository. Aggiungere quindi il frammento di codice seguente al azure-pipelines.yml file per selezionare il pool di agenti appropriato:

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

Creare un'app con Xcode

Per compilare un'app con Xcode, aggiungere il frammento di codice seguente al azure-pipelines.yml file. Si tratta di un frammento minimo per la compilazione di un progetto iOS usando lo schema predefinito, per il simulatore e senza creazione di pacchetti. Modificare i valori in modo che corrispondano alla configurazione del progetto. Per altre informazioni su queste opzioni, vedere l'attività Xcode .

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 e provisioning

È necessario firmare ed eseguire il provisioning di un'app Xcode per l'esecuzione in un dispositivo o essere pubblicata nell'App Store. Il processo di firma e provisioning deve accedere al certificato di firma P12 e a uno o più profili di provisioning. Le attività Installa certificato Apple e Installa profilo di provisioning Apple rendono disponibili per Xcode durante una compilazione.

Per altre informazioni, vedere Firmare l'app per dispositivi mobili.

Carthage

Se il progetto usa Carthage con un repository Carthage privato, è possibile configurare l'autenticazione impostando una variabile di ambiente denominata GITHUB_ACCESS_TOKEN con un valore di token che ha accesso al repository. Carthage rileverà e userà automaticamente questa variabile di ambiente.

Non aggiungere il token segreto direttamente alla pipeline YAML. Creare invece una nuova variabile della pipeline con il relativo blocco abilitato nel riquadro Variabili per crittografare questo valore. Vedere variabili segrete.

Di seguito è riportato un esempio che usa una variabile privata denominata myGitHubAccessToken per il valore della GITHUB_ACCESS_TOKEN variabile di ambiente.

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

Test nei dispositivi ospitati in Azure

Aggiungere l'attività Test di App Center per testare l'app in un lab ospitato di dispositivi iOS e Android. È necessaria una versione di valutazione gratuita di App Center che deve essere convertita in un secondo momento a pagamento.

Iscriversi prima con 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.

Mantenere gli artefatti con il record di compilazione

Aggiungere le attività Copia file e Pubblica artefatti di compilazione per archiviare l'IPA con il record di compilazione o il test e distribuirlo nelle pipeline successive. Vedere Artefatti.

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

Distribuzione

App Center

Aggiungere l'attività Distribuzione di App Center per distribuire un'app a un gruppo di tester o utenti beta oppure promuovere l'app in Intune o in Apple App Store. È necessario un account App Center gratuito (non è necessario alcun pagamento).

# 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 di Apple

Installare l'estensione Apple App Store e usare le attività seguenti per automatizzare l'interazione con l'App Store. Per impostazione predefinita, queste attività eseguono l'autenticazione ad Apple usando una connessione al servizio configurata.

Versione

Aggiungere l'attività Versione di App Store per automatizzare il rilascio degli aggiornamenti alle app beta iOS TestFlight esistenti o alle app di produzione nell'App Store.

Vedere le limitazioni dell'uso di questa attività con l'autenticazione a due fattori apple, poiché l'autenticazione Apple è specifica dell'area e i token di sessione fastlane scadono rapidamente e devono essere ricreati e riconfigurati.

- 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

Promozione

Aggiungere l'attività Promuovere l'App Store per automatizzare la promozione di un'app inviata in precedenza da iTunes Connessione all'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