> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devinenterprise.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Téléverser des builds iOS vers TestFlight avec Devin

> Configurez App Store Connect, une API key et des secrets Devin pour que Devin puisse archiver une application iOS sur une VM macOS et téléverser le build vers TestFlight.

Devin peut archiver une application iOS, la signer, la téléverser vers TestFlight et ajouter le build à un beta group. Il exécute `xcodebuild` sur une [VM macOS](/fr/onboard-devin/environment/macos-support) et s'authentifie à l'aide d'une API key App Store Connect que vous stockez sous forme de secrets Devin.

Avant que Devin puisse téléverser un build, vous devez :

1. Configurer votre application dans App Store Connect.
2. Créer une API key App Store Connect.
3. Ajouter la clé et votre Team ID à Devin sous forme de secrets.
4. Vérifier que Devin peut joindre les serveurs d'Apple.

<Note>
  Le téléversement vers TestFlight nécessite des sessions macOS. Si vous utilisez un déploiement Dedicated SaaS, contactez votre account team pour activer les VM macOS.
</Note>

<div id="requirements">
  ## Prérequis
</div>

| Prérequis                                  | Détail                                                               |
| ------------------------------------------ | -------------------------------------------------------------------- |
| Adhésion à l'Apple Developer Program       | Une adhésion payante pour la Team propriétaire de l'application.     |
| Fiche d'application dans App Store Connect | Une application ayant le même bundle ID que le projet Xcode.         |
| API key App Store Connect                  | Une key de Team avec le rôle **App Manager**.                        |
| Secrets Devin                              | `ASC_KEY_ID`, `ASC_ISSUER_ID`, `ASC_PRIVATE_KEY` et `APPLE_TEAM_ID`. |
| Accès réseau                               | La VM macOS de Devin peut joindre les serveurs d'Apple.              |

<div id="set-up-app-store-connect">
  ## Configurer App Store Connect
</div>

Effectuez ces étapes dans le portail Apple Developer et dans App Store Connect. Devin ne peut pas les réaliser à votre place : la plupart nécessitent un Account Holder ou un Admin, et certaines requièrent l'authentification à deux facteurs sur l'Apple Account d'une personne.

<Steps>
  <Step title="Accepter les derniers contrats">
    L'Account Holder se connecte à [App Store Connect](https://appstoreconnect.apple.com) et accepte les contrats en attente dans **Business**. Les téléversements échouent tant qu'un contrat requis reste en attente.
  </Step>

  <Step title="Enregistrer le bundle ID">
    Dans le [portail Apple Developer](https://developer.apple.com/account/resources/identifiers/list), allez dans **Certificates, Identifiers & Profiles → Identifiers** et enregistrez un App ID correspondant au bundle ID de la cible de votre application. Ignorez cette étape si l'identifiant existe déjà.
  </Step>

  <Step title="Créer la fiche de l'application">
    Dans App Store Connect, allez dans **Apps**, cliquez sur **+**, puis sélectionnez **New App**. Choisissez la plateforme, le nom, la langue principale, le bundle ID de l'étape précédente et un SKU. Les téléversements TestFlight échouent si aucune fiche d'application n'existe pour ce bundle ID.
  </Step>

  <Step title="Créer un beta group">
    Ouvrez l'application, allez dans **TestFlight** et créez un groupe :

    * **Internal testing** : les testeurs doivent être des utilisateurs de votre équipe App Store Connect. Les builds sont disponibles dès la fin du traitement.
    * **External testing** : les testeurs peuvent être n'importe quelle personne disposant d'une adresse e-mail ou d'un lien public. Renseignez d'abord les **Test Information** (description de l'application bêta, e-mail de retour et coordonnées du contact de review). Le premier build de chaque version passe par la Beta App Review.
  </Step>

  <Step title="Répondre à la conformité à l'exportation">
    Chaque build doit répondre à la question de conformité à l'exportation avant que les testeurs puissent l'installer. Pour éviter cette question à chaque build, définissez `ITSAppUsesNonExemptEncryption` dans le fichier `Info.plist` de votre application. Réglez-le sur `NO` si l'application n'utilise que du chiffrement exempté, comme HTTPS.
  </Step>
</Steps>

<div id="create-an-app-store-connect-api-key">
  ## Créer une API key App Store Connect
</div>

Devin s'authentifie avec une API key App Store Connect, et non avec un Apple Account. Cette clé ne nécessite pas d'authentification à deux facteurs.

<Steps>
  <Step title="Activer l'accès à l'API">
    Dans App Store Connect, rendez-vous dans **Users and Access → Integrations → App Store Connect API**. Si l'accès à l'API n'est pas encore activé, l'Account Holder doit cliquer sur **Request Access** et accepter les conditions.
  </Step>

  <Step title="Générer une clé d'équipe">
    Sous **Team Keys**, cliquez sur **+**. Saisissez un nom, par exemple `Devin TestFlight`, puis sélectionnez le rôle **App Manager**. Le rôle Admin est requis pour générer une clé. Si Xcode ne parvient pas à créer un certificat de distribution avec une clé App Manager, générez plutôt une clé avec le rôle **Admin**.
  </Step>

  <Step title="Télécharger la clé privée">
    Cliquez sur **Download** à côté de la nouvelle clé pour enregistrer `AuthKey_<KEY_ID>.p8`. Apple n'autorise qu'un seul téléchargement de ce fichier. Si vous le perdez, révoquez la clé et générez-en une nouvelle.
  </Step>

  <Step title="Copier l'Issuer ID et le Key ID">
    L'**Issuer ID** s'affiche au-dessus du tableau des clés. Le **Key ID** figure sur la ligne de la clé.
  </Step>

  <Step title="Trouver votre Team ID">
    Dans le [portail Apple Developer](https://developer.apple.com/account), ouvrez **Membership details** et copiez le **Team ID**. Il s'agit d'une chaîne de 10 caractères, par exemple `A1B2C3D4E5`.
  </Step>
</Steps>

<Warning>
  Toute personne disposant du fichier `.p8` peut téléverser des builds et gérer TestFlight pour l'ensemble des applications de votre team. Stockez-le uniquement dans les secrets Devin et ne le committez jamais dans un repository.
</Warning>

<div id="add-secrets-to-devin">
  ## Ajouter des secrets à Devin
</div>

Ajoutez les valeurs suivantes en tant que secrets bruts sur la [page Secrets](https://app.devin.ai/settings/secrets) :

| Nom du secret     | Valeur                                                                                                                      | Où le trouver                                                               |
| ----------------- | --------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
| `ASC_KEY_ID`      | Key ID, par exemple `2X9R4HXF34`                                                                                            | App Store Connect → Users and Access → Integrations → App Store Connect API |
| `ASC_ISSUER_ID`   | Issuer ID, un UUID                                                                                                          | Même page, au-dessus du tableau des clés                                    |
| `ASC_PRIVATE_KEY` | Contenu complet de `AuthKey_<KEY_ID>.p8`, y compris les lignes `-----BEGIN PRIVATE KEY-----` et `-----END PRIVATE KEY-----` | Le fichier téléchargé lors de la création de la clé                         |
| `APPLE_TEAM_ID`   | Team ID, par exemple `A1B2C3D4E5`                                                                                           | Portail Apple Developer → Membership details                                |

Pour copier la clé privée sur un Mac, exécutez :

```bash theme={null}
pbcopy < AuthKey_<KEY_ID>.p8
```

Choisissez un périmètre pour les secrets :

* **Organization** : toutes les sessions de votre organisation peuvent utiliser la clé. Utilisez ce périmètre lorsque la Team livre des builds avec Devin.
* **Personal** : seules les sessions que vous lancez peuvent utiliser la clé.

Les secrets ne sont disponibles que dans les sessions lancées après leur ajout. Pour en savoir plus sur les périmètres, consultez [Secrets](/fr/product-guides/secrets).

<div id="allow-network-access">
  ## Autoriser l'accès réseau
</div>

La VM macOS de Devin doit pouvoir joindre les serveurs d'Apple pour signer et téléverser les builds. Si votre organisation applique une politique réseau restrictive, ajoutez `api.appstoreconnect.apple.com` ainsi que les autres hôtes Apple utilisés par `xcodebuild` pour la signature et les téléversements. Autoriser `*.apple.com` suffit à tous les couvrir.

Un hôte bloqué se manifeste généralement par une erreur d'authentification, et non par une erreur réseau. Consultez la section [Dépannage](#troubleshooting).

<div id="upload-a-build">
  ## Téléverser un build
</div>

Démarrez une session macOS et demandez à Devin de téléverser un build :

```text theme={null}
Archive le schéma MyApp et téléverse-le sur TestFlight. Utilise un numéro de
build supérieur à celui du dernier build présent dans App Store Connect, ajoute
le build au groupe « QA », puis envoie-moi le numéro de build une fois terminé.
```

Devin utilise les secrets pour effectuer les opérations suivantes :

1. Écrire `ASC_PRIVATE_KEY` dans `~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8` avec les autorisations `0600`.
2. Vérifier le dernier numéro de build via l'API App Store Connect et en choisir un plus élevé.
3. Archiver l'application avec `xcodebuild archive`.
4. Signer et téléverser le build avec `xcodebuild -exportArchive`.
5. Attendre la fin du traitement, puis ajouter le build au beta group via l'API App Store Connect.

L'étape d'export utilise un fichier plist d'options d'export dont le paramètre `destination` est défini sur `upload` :

```xml theme={null}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>method</key><string>app-store-connect</string>
  <key>destination</key><string>upload</string>
  <key>teamID</key><string>A1B2C3D4E5</string>
  <key>signingStyle</key><string>automatic</string>
</dict>
</plist>
```

Ainsi que ces commandes :

```bash theme={null}
xcodebuild -project MyApp.xcodeproj -scheme MyApp \
  -configuration Release -destination 'generic/platform=iOS' \
  -archivePath build/MyApp.xcarchive \
  CURRENT_PROJECT_VERSION=<build-number> archive

xcodebuild -exportArchive \
  -archivePath build/MyApp.xcarchive \
  -exportOptionsPlist ExportOptions.plist \
  -exportPath build/export \
  -allowProvisioningUpdates \
  -authenticationKeyID "$ASC_KEY_ID" \
  -authenticationKeyIssuerID "$ASC_ISSUER_ID" \
  -authenticationKeyPath ~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8
```

`-allowProvisioningUpdates` permet à Xcode de créer le certificat de distribution et le profil de provisioning à l'aide de l'API key : la VM n'a donc pas besoin que les ressources de signature y soient installées.

Si votre repository dispose déjà d'un script de release, comme une lane `fastlane` ou une cible `make`, demandez à Devin de l'utiliser. `fastlane` accepte la même clé via `app_store_connect_api_key`.

<div id="save-the-steps-in-your-blueprint">
  ### Enregistrer les étapes dans votre blueprint
</div>

Pour éviter de répéter les instructions dans chaque prompt, ajoutez-les à la section `knowledge` du [blueprint](/fr/onboard-devin/environment/blueprints) de votre repository :

```yaml theme={null}
runs-on: macos

knowledge:
  - name: testflight
    contents: |
      To upload a TestFlight build:
      1. Write $ASC_PRIVATE_KEY to ~/.appstoreconnect/private_keys/AuthKey_$ASC_KEY_ID.p8 (chmod 600).
      2. Use a build number higher than the latest build in App Store Connect.
      3. Archive the MyApp scheme, then run xcodebuild -exportArchive with
         ExportOptions.plist (destination: upload, teamID: $APPLE_TEAM_ID),
         -allowProvisioningUpdates, and the -authenticationKey* flags.
      4. Add the build to the "QA" beta group.
```

<div id="troubleshooting">
  ## Troubleshooting
</div>

**`No Accounts with App Store Connect Access` ou `Failed to Use Accounts` lors de l'export.** Vérifiez d'abord l'accès réseau. Si la VM ne parvient pas à joindre les serveurs d'Apple, `xcodebuild` signale cette erreur même lorsque la clé est valide. Recherchez `ITunesConnectFoundationErrorDomain Code=-1003` dans les lignes qui précèdent. Si le réseau fonctionne, vérifiez que la clé dispose du rôle App Manager.

**`No profiles for '<bundle ID>' were found`.** Le bundle ID n'est pas enregistré pour la team indiquée dans `APPLE_TEAM_ID`, ou aucune fiche d'application ne lui correspond dans App Store Connect.

**`The provided entity includes an attribute with a value that has already been used`.** Le numéro de build a déjà été utilisé pour cette version. Téléversez à nouveau avec un numéro de build supérieur.

**Le build est téléversé, mais les testeurs ne peuvent pas l'installer.** Vérifiez le build dans App Store Connect → TestFlight. Il est peut-être encore en cours de traitement, les informations de conformité à l'exportation manquent peut-être, ou il est en attente de Beta App Review.

**Xcode ne parvient pas à créer un certificat de distribution.** Le rôle de la clé ne permet pas de gérer les certificats. Générez une clé avec le rôle Admin, ou demandez à un Admin de créer le certificat de distribution dans le portail Apple Developer.

**Les variables d'environnement sont vides dans la session.** Les secrets ne sont disponibles que dans les sessions démarrées après leur ajout. Démarrez une nouvelle session.
