Générer, tester et déployer des applications Xcode

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

Découvrez comment créer et déployer des projets Xcode avec Azure Pipelines.

Prérequis

Créer le pipeline

  1. Connectez-vous à votre organisation Azure DevOps et accédez à votre projet.

  2. Accédez à Pipelines, puis sélectionnez Nouveau pipeline ou Création d’un pipeline si vous créez votre premier pipeline.

  3. Effectuez les étapes de l’Assistant en sélectionnant d’abord GitHub comme emplacement du code source.

  4. Vous serez peut-être redirigé vers GitHub pour vous connecter. Si c’est le cas, entrez vos informations d’identification GitHub.

  5. Quand la liste des dépôts s’affiche, sélectionnez le vôtre.

  6. Vous serez peut-être redirigé vers GitHub pour pouvoir installer l’application Azure Pipelines. Si c’est le cas, sélectionnez Approuver et installer.

Lorsque l’onglet Configurer s’affiche, sélectionnez Xcode.

  1. Quand votre nouveau pipeline s’affiche, examinez le code YAML pour voir ce qu’il fait. Lorsque vous êtes prêt, sélectionnez Enregistrer et exécuter.

    Bouton Enregistrer et exécuter dans un nouveau pipeline YAML

  2. Vous êtes à valider un nouveau fichier azure-pipelines.yml dans votre référentiel. Une fois que vous êtes satisfait du message, sélectionnez Enregistrer et exécuter.

    Si vous souhaitez voir votre pipeline en action, sélectionnez le travail de build.

    Vous venez de créer et d’exécuter un pipeline que nous avons créé automatiquement pour vous, car votre code semblait correspondre au modèle Xcode.

    Vous disposez maintenant d’un pipeline YAML opérationnel (azure-pipelines.yml) dans votre référentiel qui est prêt à être personnalisé !

  3. Lorsque vous êtes prêt à apporter des modifications à votre pipeline, sélectionnez-le sur la page Pipelines, puis modifiez le fichier azure-pipelines.yml.

Consultez les sections ci-dessous pour découvrir quelques-unes des façons les plus courantes de personnaliser votre pipeline.

Conseil

Pour apporter des modifications au fichier YAML comme décrit dans cette rubrique, sélectionnez le pipeline dans la page Pipelines, puis sélectionnez Modifier pour ouvrir un éditeur pour le fichier azure-pipelines.yml.

Environnement de génération

Vous pouvez utiliser Azure Pipelines pour générer vos applications avec Xcode sans avoir besoin de configurer votre propre infrastructure. Xcode est préinstallé sur les agents macOS hébergés par Microsoft dans Azure Pipelines. Vous pouvez utiliser les agents macOS pour exécuter vos builds.

Pour connaître les versions exactes de Xcode préinstallées, reportez-vous aux agents hébergés par Microsoft.

Créez un fichier nommé azure-pipelines.yml à la racine de votre référentiel. Ensuite, ajoutez l’extrait de code suivant à votre fichier azure-pipelines.yml pour sélectionner le pool d’agents approprié :

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

Créer une application avec Xcode

Pour créer une application avec Xcode, ajoutez l’extrait de code suivant à votre fichier azure-pipelines.yml. Il s’agit d’un extrait de code minimal permettant de créer un projet iOS à l’aide de son schéma par défaut, pour le simulateur et sans empaquetage. Modifiez les valeurs pour qu’elles correspondent à la configuration de votre projet. Pour plus d’informations sur ces options, consultez la tâche 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

Signature et approvisionnement

Une application Xcode doit être signée et provisionnée pour s’exécuter sur un appareil ou être publiée sur l’App Store. Le processus de signature et d’approvisionnement doit avoir accès à votre certificat de signature P12 et à un ou plusieurs profils d’approvisionnement. Les tâches Installer le certificat Apple et Installer le profil d’approvisionnement Apple les rendent disponibles pour Xcode pendant une build.

Pour en savoir plus, consultez Signer votre application mobile.

Carthage

Si votre projet utilise Carthage avec un référentiel Carthage privé, vous pouvez configurer l’authentification en définissant une variable d’environnement nommée GITHUB_ACCESS_TOKEN avec la valeur d’un jeton qui a accès au référentiel. Carthage détecte et utilise automatiquement cette variable d’environnement.

N’ajoutez pas le jeton secret directement à votre pipeline YAML. Créez plutôt une nouvelle variable de pipeline en activant son verrou sous le volet Variables pour chiffrer cette valeur. Consultez Variables de secret.

Voici un exemple qui utilise une variable secrète nommée myGitHubAccessToken pour la valeur de la variable d’environnement GITHUB_ACCESS_TOKEN.

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

Test sur des appareils hébergés par Azure

Ajoutez la tâche Test de l’App Center pour tester l’application dans un labo hébergé d’appareils iOS et Android. Un essai gratuit d’App Center est requis, qui doit être converti ultérieurement en version payante.

Dans un premier temps, inscrivez-vous avec 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.

Conserver les artefacts avec l’enregistrement de build

Ajoutez les tâches Copier des fichiers et Publier des artefacts de build pour stocker votre IPA avec l’enregistrement de build ou le tester et le déployer dans les pipelines suivants. Consultez Artefacts.

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

Déployer

App Center

Ajoutez la tâche Distribuer de l’App Center pour distribuer une application à un groupe de testeurs ou d’utilisateurs bêta, ou promouvoir l’application auprès de Intune ou de l’App Store d’Apple. Un compte App Center gratuit est requis (aucun paiement n’est nécessaire).

# 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

Installez l’extension Apple App Store et utilisez les tâches suivantes pour automatiser l’interaction avec l’App Store. Par défaut, ces tâches s’authentifient auprès d’Apple à l’aide d’une connexion de service que vous configurez.

Libérer

Ajoutez la tâche Libérer de l’App Store pour automatiser la publication des mises à jour des applications bêta iOS TestFlight ou des applications de production existantes dans l’App Store.

Consultez les limitations de l’utilisation de cette tâche avec l’authentification à deux facteurs d’Apple, car l’authentification d’Apple est spécifique à la région et les jetons de session fastlane expirent rapidement et doivent être recréés et reconfigurés.

- 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

Promouvoir

Ajoutez la tâche Promouvoir de l’App Store pour automatiser la promotion d’une application précédemment soumise à partir d’iTunes Connect à l’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