Skapa, testa och distribuera Xcode-appar

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

Lär dig hur du skapar och distribuerar Xcode-projekt med Azure Pipelines.

Förutsättningar

Skapa pipelinen

  1. Logga in på din Azure DevOps-organisation och gå till projektet.

  2. Gå till Pipelines och välj sedan Ny pipeline eller Skapa pipeline om du skapar din första pipeline.

  3. Utför stegen i guiden genom att först välja GitHub som plats för källkoden.

  4. Du kan omdirigeras till GitHub för att logga in. I så fall anger du dina GitHub-autentiseringsuppgifter.

  5. När du ser listan över lagringsplatser väljer du din lagringsplats.

  6. Du kan omdirigeras till GitHub för att installera Azure Pipelines-appen. I så fall väljer du Godkänn och installera.

När fliken Konfigurera visas väljer du Xcode.

  1. När den nya pipelinen visas tar du en titt på YAML för att se vad den gör. När du är klar väljer du Spara och kör.

    Knappen Spara och kör i en ny YAML-pipeline

  2. Du uppmanas att checka in en ny azure-pipelines.yml fil till lagringsplatsen. När du är nöjd med meddelandet väljer du Spara och kör igen.

    Om du vill se din pipeline i praktiken väljer du byggjobbet.

    Du har precis skapat och kört en pipeline som vi skapade automatiskt åt dig, eftersom koden verkade vara en bra matchning för Xcode-mallen .

    Nu har du en fungerande YAML-pipeline (azure-pipelines.yml) på din lagringsplats som är redo att anpassas!

  3. När du är redo att göra ändringar i din pipeline väljer du den på sidan Pipelines och sedan Redigeraazure-pipelines.yml filen.

Se avsnitten nedan för att lära dig några av de vanligaste sätten att anpassa din pipeline.

Dricks

Om du vill göra ändringar i YAML-filen enligt beskrivningen i det här avsnittet väljer du pipelinen på sidan Pipelines och väljer sedan Redigera för att öppna en redigerare för azure-pipelines.yml filen.

Skapa miljö

Du kan använda Azure Pipelines för att skapa dina appar med Xcode utan att behöva konfigurera någon egen infrastruktur. Xcode är förinstallerat på Microsoft-värdbaserade macOS-agenter i Azure Pipelines. Du kan använda macOS-agenterna för att köra dina versioner.

Exakta versioner av Xcode som är förinstallerade finns i Microsoft-värdbaserade agenter.

Skapa en fil med namnet azure-pipelines.yml i roten på lagringsplatsen. Lägg sedan till följande kodfragment i azure-pipelines.yml filen för att välja lämplig agentpool:

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

Skapa en app med Xcode

Om du vill skapa en app med Xcode lägger du till följande kodfragment i azure-pipelines.yml filen. Det här är ett minimalt kodfragment för att skapa ett iOS-projekt med dess standardschema, för Simulatorn och utan paketering. Ändra värden så att de matchar projektkonfigurationen. Mer information om de här alternativen finns i Xcode-aktiviteten .

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

Signering och etablering

En Xcode-app måste signeras och etableras för att kunna köras på en enhet eller publiceras till App Store. Signerings- och etableringsprocessen behöver åtkomst till ditt P12-signeringscertifikat och en eller flera etableringsprofiler. Uppgifterna Installera Apple Certificate och Install Apple Provisioning Profile gör dessa tillgängliga för Xcode under en version.

Mer information finns i Signera din mobilapp .

Karthago

Om ditt projekt använder Carthage med en privat Carthage-lagringsplats kan du konfigurera autentisering genom att ange en miljövariabel med namnet GITHUB_ACCESS_TOKEN med värdet för en token som har åtkomst till lagringsplatsen. Karthage identifierar och använder automatiskt den här miljövariabeln.

Lägg inte till den hemliga token direkt i din YAML-pipeline. Skapa i stället en ny pipelinevariabel med låset aktiverat i fönstret Variabler för att kryptera det här värdet. Se hemliga variabler.

Här är ett exempel som använder en hemlig variabel med namnet myGitHubAccessToken för värdet för GITHUB_ACCESS_TOKEN miljövariabeln.

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

Testa på Azure-värdbaserade enheter

Lägg till App Center-testuppgiften för att testa appen i ett värdbaserat labb med iOS- och Android-enheter. En kostnadsfri utvärderingsversion av App Center krävs som senare måste konverteras till betald.

Registrera dig med App Center först.

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

Behålla artefakter med byggposten

Lägg till uppgifterna Kopiera filer och Publicera byggartefakter för att lagra din IPA med byggposten eller testa och distribuera den i efterföljande pipelines. Se Artefakter.

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

Distribuera

App Center

Lägg till appcenterdistributionsuppgiften för att distribuera en app till en grupp testare eller betaanvändare, eller flytta upp appen till Intune eller Apple App Store. Ett kostnadsfritt App Center-konto krävs (ingen betalning krävs).

# 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

Installera Apple App Store-tillägget och använd följande uppgifter för att automatisera interaktionen med App Store. Som standard autentiseras dessa uppgifter till Apple med hjälp av en tjänstanslutning som du konfigurerar.

Frisläpp

Lägg till App Store-versionsuppgiften för att automatisera lanseringen av uppdateringar till befintliga betaappar för iOS TestFlight eller produktionsappar i App Store.

Se begränsningar för att använda den här uppgiften med Apple-tvåfaktorsautentisering, eftersom Apple-autentisering är regionspecifik och fastlane-sessionstoken går ut snabbt och måste återskapas och konfigureras om.

- 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

Marknadsföra

Lägg till uppgiften App Store-upphöjning för att automatisera befordran av en tidigare skickad app från iTunes Anslut till 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