Sestavování, testování a nasazování aplikací Xcode

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

Zjistěte, jak sestavovat a nasazovat projekty Xcode pomocí Azure Pipelines.

Požadavky

Vytvoření kanálu

  1. Přihlaste se ke své organizaci Azure DevOps a přejděte do svého projektu.

  2. Přejděte na Kanály a pak vyberte Nový kanál nebo Vytvořit kanál , pokud vytváříte první kanál.

  3. Kroky průvodce proveďte tak, že nejprve vyberete GitHub jako umístění zdrojového kódu.

  4. Můžete být přesměrováni na GitHub kvůli přihlášení. Pokud ano, zadejte svoje přihlašovací údaje GitHubu.

  5. Až se zobrazí seznam úložišť, vyberte úložiště.

  6. K instalaci aplikace Azure Pipelines můžete být přesměrováni na GitHub. Pokud ano, vyberte Schválit a nainstalovat.

Po zobrazení karty Konfigurovat vyberte Xcode.

  1. Jakmile se nový kanál zobrazí, podívejte se na YAML a podívejte se, co dělá. Až budete připraveni, vyberte Uložit a spustit.

    Tlačítko Uložit a spustit v novém kanálu YAML

  2. Zobrazí se výzva k potvrzení nového souboru azure-pipelines.yml do úložiště. Až budete se zprávou spokojeni, vyberte Uložit a spusťte znovu.

    Pokud chcete sledovat kanál v akci, vyberte úlohu sestavení.

    Právě jste vytvořili a spustili kanál, který jsme pro vás automaticky vytvořili, protože váš kód vypadal jako vhodný pro šablonu Xcode .

    Teď máte v úložišti funkční kanál YAML,azure-pipelines.yml který je připravený k přizpůsobení.

  3. Až budete chtít kanál změnit, vyberte ho na stránce Pipelines a pak upravteazure-pipelines.yml soubor.

V následujících částech se dozvíte některé z nejběžnějších způsobů přizpůsobení kanálu.

Tip

Pokud chcete provést změny v souboru YAML, jak je popsáno v tomto tématu, vyberte kanál na stránce Pipelines a pak výběrem možnosti Upravit otevřete editor souboru azure-pipelines.yml .

Sestavení prostředí

Azure Pipelines můžete použít k vytváření aplikací pomocí Xcode, aniž byste museli nastavovat vlastní infrastrukturu. Xcode je předinstalovaný na agentech macOS hostovaných Microsoftem ve službě Azure Pipelines. Ke spuštění sestavení můžete použít agenty macOS.

Přesné verze Xcode, které jsou předinstalované, najdete v agentech hostovaných Microsoftem.

V kořenovém adresáři úložiště vytvořte soubor s názvem azure-pipelines.yml . Potom do azure-pipelines.yml souboru přidejte následující fragment kódu a vyberte příslušný fond agentů:

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

Sestavení aplikace pomocí Xcode

Pokud chcete vytvořit aplikaci pomocí Xcode, přidejte do azure-pipelines.yml souboru následující fragment kódu. Jedná se o minimální fragment kódu pro sestavení projektu iOS pomocí výchozího schématu simulátoru a bez balení. Změňte hodnoty tak, aby odpovídaly konfiguraci projektu. Další informace o těchto možnostech najdete v úloze 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

Podepisování a zřizování

Aplikace Xcode musí být podepsaná a zřízená, aby běžela na zařízení nebo byla publikovaná v App Storu. Proces podepisování a zřizování potřebuje přístup k podpisovém certifikátu P12 a jednomu nebo více zřizovacím profilům. Úlohy instalace certifikátu Apple a instalace zřizovacího profilu Apple zpřístupní Xcode během sestavení.

Další informace najdete v tématu Podepsání mobilní aplikace .

Kartágo

Pokud váš projekt používá Carthage s privátním úložištěm Carthage, můžete nastavit ověřování nastavením proměnné prostředí s názvem GITHUB_ACCESS_TOKEN s hodnotou tokenu, který má přístup k úložišti. Carthage automaticky rozpozná a použije tuto proměnnou prostředí.

Nepřidávejte token tajného kódu přímo do YAML kanálu. Místo toho vytvořte novou proměnnou kanálu s povoleným zámkem v podokně Proměnné, aby se tato hodnota zašifrovala. Viz proměnné tajných kódů.

Tady je příklad, který používá tajnou proměnnou pojmenovanou myGitHubAccessToken pro hodnotu GITHUB_ACCESS_TOKEN proměnné prostředí.

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

Testování na zařízeních hostovaných v Azure

Přidejte úlohu Testování App Center, která otestuje aplikaci v hostované testovacím prostředí zařízení s iOSem a Androidem. Vyžaduje se bezplatná zkušební verze App Center , která se později musí převést na placenou verzi.

Nejdřív se zaregistrujte pomocí 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.

Zachování artefaktů pomocí záznamu sestavení

Přidejte úlohy Kopírování souborů a publikování artefaktů sestavení pro uložení IPA se záznamem sestavení nebo testem a jeho nasazením v následných kanálech. Viz Artefakty.

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

Nasadit

App Center

Přidejte úlohu Distribuce App Center pro distribuci aplikace do skupiny testerů nebo beta uživatelů nebo zvýšení úrovně aplikace do Intune nebo Apple App Storu. Vyžaduje se bezplatný účet App Center (nevyžaduje se žádná platba).

# 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

Nainstalujte rozšíření Apple App Store a pomocí následujících úloh automatizujte interakci s App Storem. Ve výchozím nastavení se tyto úlohy ověřují u Společnosti Apple pomocí připojení služby, které nakonfigurujete.

Verze

Přidejte úlohu vydání z App Storu, která automatizuje vydávání aktualizací stávajících beta aplikací pro iOS TestFlight nebo produkčních aplikací v App Storu.

Podívejte se na omezení použití této úlohy s dvojúrovňovým ověřováním Apple, protože ověřování Apple je specifické pro oblast a platnost tokenů relace fastlane vyprší rychle a musí se znovu vytvořit a znovu nakonfigurovat.

- 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

Propagovat

Přidejte úlohu Zvýšení úrovně App Storu, která automatizuje povýšení dříve odeslané aplikace z iTunes Připojení do App Storu.

- 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