72 votes

Utiliser xcodebuild (Xcode 8) et la signature automatique dans les environnements CI (Travis / Jenkins)

Avec la version de Xcode 8, Apple a introduit une nouvelle façon de gérer la signature de configuration. Maintenant, vous avez deux options Manual et Automatic.

Selon la WWDC 2016 Session sur la signature de Code (WWDC 2016 - 401 - Ce qui est nouveau dans Xcode application de signature), lorsque vous sélectionnez Automatic signature, Xcode va:

  • Créer des certificats de signature de
  • Créer et mettre à jour les Id d'Application
  • Créer et mettre à jour les profils de configuration

Mais selon ce que Apple dit dans cette session, l' Automatic Signing va utiliser Development signing et dans la limite de Xcode-créé les profils de configuration.

Le problème vient lorsque vous essayez d'utiliser Automatic Signing sur l'IC de l'environnement (comme Travis CI ou Jenkins). Je ne suis pas en mesure de trouver un moyen facile de garder à l'aide Automatique et signe pour la Distribution (comme Xcode vous oblige à utiliser du Développement et de Xcode-créé les profils de configuration).

Le nouveau "Xcode-créé les profils de configuration" ne pas afficher dans le portail des développeurs, même si je peux trouver dans ma machine... dois-je aller de ces profils à la CI de la machine, de construire Development et l'exportation d' Distribution? Est-il un moyen de remplacer l' Automatic Signing l'aide xcodebuild?

60voto

d4Rk Points 4622

En gros, j'ai couru dans le même problème à l'aide de Jenkins CI et Xcode Plugin. J'ai fini par faire le construire et codesigning me farcir à l'aide de xcodebuild.

0. Conditions préalables

Afin d'obtenir les étapes suivantes fait avec succès, vous devez avoir installé le nécessaire profils d'approvisionnement et des certificats. Cela signifie que votre signature de code devrait déjà être au travail en général.

1. La construction d'une .xcarchive

xcodebuild -project <path/to/project.xcproj> -scheme <scheme-name> -configuration <config-name> clean archive -archivePath <output-path> DEVELOPMENT_TEAM=<dev-team-id>
  • DEVELOPMENT_TEAM: les 10 chiffres de votre équipe de développeur id (quelque chose comme A1B2C3D4E5)

2. Exportation .ipa

xcodebuild -exportArchive -archivePath <path/to/your.xcarchive> -exportOptionsPlist <path/to/exportOptions.plist> -exportPath <output-path>

Exemple d' exportOptions.plist:

<!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>development</string>
    <key>teamID</key>
    <string> A1B2C3D4E5 </string>
</dict>
</plist>
  • method: est l'une des development, app-store, ad-hoc, enterprise
  • teamID: les 10 chiffres de votre équipe de développeur id (quelque chose comme A1B2C3D4E5)

Ce processus est de toute façon plus proche de ce que vous feriez avec Xcode manuellement que de ce qui est par exemple le Jenkins Xcode Plugin ne.

Remarque: La .xcarchive fichier sera toujours develpment signé, mais en sélectionnant "app store" en tant que méthode de la 2e étape sera de faire de la répartition de la signature et de également inclure le profil de distribution "embedded.mobileprovision".

Espérons que cette aide.

35voto

pablobart Points 419

Après avoir essayé quelques options, ce sont les solutions que j'ai pu l'utiliser sur mon serveur CI:

  • Inclure le Développeur certificat et la clé privée ainsi que la génération automatique d'profils de configuration dans l'IC de l'environnement:

À l'aide de Automatic signing vous oblige à utiliser un Developer certificat et auto-generated provisioning profiles. Une option est d'exporter votre certificat et la clé privée (Applications -> Utilitaires -> Trousseau d'Accès) et l'auto-générés profils de configuration pour l'IC de la machine. Une façon de trouver le générés automatiquement les profils de configuration est de naviguer à l' ~/Library/MobileDevice/Provisioning\ Profiles/, déplacer tous les fichiers vers un dossier de sauvegarde, ouvrez Xcode et archiver le projet. Xcode permettra de créer des auto-généré de développement de profils de configuration et de les copier à l' Provisioning Profiles le dossier.

xcodebuild archive ... permettra de créer un .xcarchive signé pour Development. xcodebuild -exportArchive ... peut puis de démissionner le bâtir Distribution

  • Remplacer "Automatique" et "Manuel" lors de la construction sur l'IC de l'environnement

Avant d'appeler, xcodebuild d'une solution de contournement consiste à remplacer toutes les occurrences de ProvisioningStyle = Automatic avec ProvisioningStyle = Manual dans le fichier de projet. sed peut être utilisé pour un simple de trouver un remplacement dans l' pbxproj le fichier:

sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' <ProjectName>.xcodeproj/project.pbxproj

@thelvis également créé un script Ruby pour ce faire à l'aide de l' xcodeproj gem. Le script vous donne un meilleur contrôle sur ce qui est changé.

xcodebuild sera alors utiliser la signature du code d'identité (CODE_SIGN_IDENTITY) mis dans le projet, ainsi que les profils de configuration (PROVISIONING_PROFILE_SPECIFIER). Ces paramètres peuvent également être fournis en tant que paramètres d' xcodebuild et ils vont remplacer la signature du code de l'identité et/ou un profil de configuration définie dans le projet.

EDIT: avec Xcode 9, xcodebuild a une nouvelle version des paramètres paramètre CODE_SIGN_STYLE à choisir entre Automatic et Manual donc il n'y a pas besoin de trouver et de remplacer les occurrences de automatique à manuel dans le fichier de projet, plus d'infos dans la WWDC 2017 Session 403 Quoi de neuf dans la Signature de Xcode et Xcode Serveur

  • Changement manuel de la signature de

Manuel de signature de fournir un contrôle total sur le code de la signature des identités et profils de configuration utilisé. C'est probablement la solution la plus propre, mais avec l'inconvénient de perdre tous les avantages de la signature Automatique.

Pour en savoir plus sur la signature de code avec Xcode 8 je recommande vraiment cet article ainsi que le WWDC2016 session 401 - Ce qui est nouveau dans Xcode application de signature

2voto

Paul Buchanan Points 31

Je suis en train d'étudier une autre option que je n'ai pas vu mentionné ici encore. Installation de deux des cibles identiques, qui ne diffèrent que par leur signature paramètres.

  • Le développement Cible utilise la signature pour obtenir tous ces avantages lorsque de nouveaux périphériques / développeurs sont ajoutés
  • CI Cible utilise les signatures manuelles

Inconvénient, c'est que vous avez à gérer deux des cibles identiques. Avantage est que vous obtenez les avantages d'automatique de signature pour le développement, et ne pas avoir à maintenir potentiellement fragiles des scripts qui modifient votre projet juste avant le temps de construction.

2voto

Ajeet Sharma Points 102

Si vous êtes en utilisant Xcode 8.x et Jenkins pour la CI. Alors probablement que vous seriez confronté à un problème avec la "Signature "YourProjectName" nécessite une équipe de développement. Sélectionnez une équipe de développement dans l'éditeur de projet.

La signature de Code est nécessaire pour des produits de type "Application" dans le SDK 'iOS 10.1'".** BUILD FAILED ** lors de l'exécution de la tâche.

Quelle est la solution?.

La Solution est:

  1. définir un profil de configuration à Aucun projet dans Xcode paramètres de construction.

  2. Dans jenkins, Créer un exécuter le shell avant de Xcode réglage et d'écrire la commande ci-dessous

    sed -i '' 's/ProvisioningStyle = Automatic;/ProvisioningStyle = Manual;/' ProjectName.xcodeproj/project.pbxproj 
    

    Rappelez-vous: gardez que exécuter shell avant de Xcode paramètres de créer une section de jenkins.

Les travaux de cette.

1voto

Pour moi, rien n'a fonctionné. J'ai résolu mon problème en modifiant un fichier dans l'application Xcode installée sur votre Mac Mini (serveur CI avec Jenkins), comme indiqué dans ce lien:
https://www.jayway.com/2015/05/21/fixing-your-ios-build-scripts/
De plus, j'ai désactivé la signature automatique à partir de Xcode.

Terminé! Enfin fonctionne!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X