Xcode-apps bouwen, testen en implementeren

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

Meer informatie over het bouwen en implementeren van Xcode-projecten met Azure Pipelines.

Vereisten

Maak de pijplijn

  1. Meld u aan bij uw Azure DevOps-organisatie en ga naar uw project.

  2. Ga naar Pijplijnen en selecteer vervolgens Nieuwe pijplijn of Pijplijn maken als u uw eerste pijplijn maakt.

  3. Voer de stappen van de wizard uit door eerst GitHub te selecteren als de locatie van uw broncode.

  4. U wordt mogelijk omgeleid naar GitHub om u aan te melden. Voer in dat geval uw GitHub-referenties in.

  5. Wanneer u de lijst met opslagplaatsen ziet, selecteert u de opslagplaats.

  6. U wordt mogelijk omgeleid naar GitHub om de Azure Pipelines-app te installeren. Als dat het zo is, selecteert u Goedkeuren en installeren.

Wanneer het tabblad Configureren wordt weergegeven, selecteert u Xcode.

  1. Wanneer uw nieuwe pijplijn wordt weergegeven, bekijkt u de YAML om te zien wat deze doet. Wanneer u klaar bent, selecteert u Opslaan en uitvoeren.

    Knop Opslaan en uitvoeren in een nieuwe YAML-pijplijn

  2. U wordt gevraagd een nieuw azure-pipelines.yml-bestand door te voeren naar uw opslagplaats. Nadat u tevreden bent met het bericht, selecteert u Opslaan en opnieuw uitvoeren .

    Als u de pijplijn in actie wilt bekijken, selecteert u de buildtaak.

    U hebt zojuist een pijplijn gemaakt en uitgevoerd die automatisch voor u is gemaakt, omdat uw code een goede overeenkomst leek voor de Xcode-sjabloon .

    U hebt nu een werkende YAML-pijplijn (azure-pipelines.yml) in uw opslagplaats die u kunt aanpassen.

  3. Wanneer u klaar bent om wijzigingen aan te brengen in uw pijplijn, selecteert u deze op de pagina Pijplijnen en bewerkt u het azure-pipelines.yml bestand.

Zie de onderstaande secties voor meer informatie over de meest voorkomende manieren om uw pijplijn aan te passen.

Tip

Als u wijzigingen wilt aanbrengen in het YAML-bestand zoals beschreven in dit onderwerp, selecteert u de pijplijn op de pagina Pijplijnen en selecteert u Bewerken om een editor voor het azure-pipelines.yml bestand te openen.

Omgeving bouwen

U kunt Azure Pipelines gebruiken om uw apps te bouwen met Xcode zonder dat u een eigen infrastructuur hoeft in te stellen. Xcode is vooraf geïnstalleerd op door Microsoft gehoste macOS-agents in Azure Pipelines. U kunt de macOS-agents gebruiken om uw builds uit te voeren.

Raadpleeg voor de exacte versies van Xcode die vooraf zijn geïnstalleerd, naar door Microsoft gehoste agents.

Maak een bestand met de naam azure-pipelines.yml in de hoofdmap van uw opslagplaats. Voeg vervolgens het volgende fragment toe aan uw azure-pipelines.yml bestand om de juiste agentgroep te selecteren:

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

Een app bouwen met Xcode

Als u een app met Xcode wilt bouwen, voegt u het volgende codefragment toe aan uw azure-pipelines.yml bestand. Dit is een minimaal fragment voor het bouwen van een iOS-project met behulp van het standaardschema, voor de simulator en zonder verpakking. Wijzig de waarden zodat deze overeenkomen met uw projectconfiguratie. Zie de Xcode-taak voor meer informatie over deze opties.

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

Ondertekening en inrichting

Een Xcode-app moet zijn ondertekend en ingericht om op een apparaat uit te voeren of te worden gepubliceerd in de App Store. Het ondertekenings- en inrichtingsproces heeft toegang nodig tot uw P12-handtekeningcertificaat en een of meer inrichtingsprofielen. De taken Apple-certificaat installeren en Apple Provisioning Profile installeren maken deze beschikbaar voor Xcode tijdens een build.

Zie Uw mobiele app ondertekenen voor meer informatie.

Carthage

Als uw project Gebruikmaakt van Carthage met een privéopslagplaats in Windows, kunt u verificatie instellen door een omgevingsvariabele GITHUB_ACCESS_TOKEN in te stellen met de naam een waarde van een token dat toegang heeft tot de opslagplaats. De omgevingsvariabele zal deze omgevingsvariabele automatisch detecteren en gebruiken.

Voeg het geheime token niet rechtstreeks toe aan uw pijplijn YAML. Maak in plaats daarvan een nieuwe pijplijnvariabele met de vergrendeling ingeschakeld in het deelvenster Variabelen om deze waarde te versleutelen. Zie geheime variabelen.

Hier volgt een voorbeeld waarin een geheime variabele wordt gebruikt die is benoemd myGitHubAccessToken voor de waarde van de GITHUB_ACCESS_TOKEN omgevingsvariabele.

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

Testen op door Azure gehoste apparaten

Voeg de App Center-testtaak toe om de app te testen in een gehost lab met iOS- en Android-apparaten. Er is een gratis proefversie van App Center vereist die later moet worden geconverteerd naar betaald.

Meld u eerst aan bij 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.

Artefacten behouden met de buildrecord

Voeg de taken Voor het kopiëren van bestanden en het publiceren van buildartefacten toe om uw IPA op te slaan met de buildrecord of test en implementeer deze in volgende pijplijnen. Zie artefacten.

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

Implementeren

App Center

Voeg de taak App Center Distribueren toe om een app te distribueren naar een groep testers of bètagebruikers, of de app te promoveren naar Intune of de Apple App Store. Er is een gratis App Center-account vereist (er is geen betaling nodig).

# 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.

Apple App Store

Installeer de Apple App Store-extensie en gebruik de volgende taken om de interactie met de App Store te automatiseren. Deze taken worden standaard geverifieerd bij Apple met behulp van een serviceverbinding die u configureert.

Vrijgeven

Voeg de releasetaak van de App Store toe om de release van updates voor bestaande bèta-apps voor iOS TestFlight of productie-apps in de App Store te automatiseren.

Zie beperkingen voor het gebruik van deze taak met Tweeledige Apple-verificatie, omdat Apple-verificatie regiospecifiek is en fastlane-sessietokens snel verlopen en opnieuw moeten worden gemaakt en opnieuw moeten worden geconfigureerd.

- 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

Promoten

Voeg de taak App Store Niveau verhogen toe om de promotie van een eerder ingediende app vanuit iTunes Verbinding maken te automatiseren in de 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