Build et distribution automatisés
Alexey
Membre
Bonjour,
J'ai un besoin un peu special, et je suis débutant Mac et X-Code.
Le besoin :
Des développeurs déposent des projets X-Code sur un mac via un partage reseau :
\\mon-mac\projets\projet 1
\\mon-mac\projets\projet 2
...
\\mon-mac\projets\projet N
(quand ils déposent les sources le dossier "projet N" est ecrasé complétement avec une nouvelle version)
Le poste Mac doit détecter la mise à jour d'un dossier projet (projet N)
Si dossier mis à jour, il doit :
-compiler une configuration (ex. : Config iPad)
-générer le fichier .ipa (Ad-Hoc pour iPad)
-fermer X-Code si il est ouvert
-déployer le fichier .ipa pour les testeurs
-installer automatiquement sur les iPad de test
Tout est connu par avance :
-liste des iPad de test
-liste des projets avec les configurations cibles
Il faut automatiser :
-la détection de mise à jour des dossiers (projets X-Code)
-la compilation de chaque projets avec une config cible
-le déploiement sur les iPad de test
Les sources de chaque projet pourront être mis à jour plusieurs fois par jour.
Il faut déployer vers les iPad de test des que le dossier projet N est ecrasé.
J'ai trouvé des tutos sur internet, mais je n'y comprends pas grand chose.
Par exemple celui la : http://blog.carbonfive.com/2011/05/0...using-xcode-4/
J'ai aussi entendu parler de TestFlight ...
qui permettrait de faire le déploiement automatiquement?
Merci de m'aider.
Cordialement,
Alex
J'ai un besoin un peu special, et je suis débutant Mac et X-Code.
Le besoin :
Des développeurs déposent des projets X-Code sur un mac via un partage reseau :
\\mon-mac\projets\projet 1
\\mon-mac\projets\projet 2
...
\\mon-mac\projets\projet N
(quand ils déposent les sources le dossier "projet N" est ecrasé complétement avec une nouvelle version)
Le poste Mac doit détecter la mise à jour d'un dossier projet (projet N)
Si dossier mis à jour, il doit :
-compiler une configuration (ex. : Config iPad)
-générer le fichier .ipa (Ad-Hoc pour iPad)
-fermer X-Code si il est ouvert
-déployer le fichier .ipa pour les testeurs
-installer automatiquement sur les iPad de test
Tout est connu par avance :
-liste des iPad de test
-liste des projets avec les configurations cibles
Il faut automatiser :
-la détection de mise à jour des dossiers (projets X-Code)
-la compilation de chaque projets avec une config cible
-le déploiement sur les iPad de test
Les sources de chaque projet pourront être mis à jour plusieurs fois par jour.
Il faut déployer vers les iPad de test des que le dossier projet N est ecrasé.
J'ai trouvé des tutos sur internet, mais je n'y comprends pas grand chose.
Par exemple celui la : http://blog.carbonfive.com/2011/05/0...using-xcode-4/
J'ai aussi entendu parler de TestFlight ...
qui permettrait de faire le déploiement automatiquement?
Merci de m'aider.
Cordialement,
Alex
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Concernant les premiers points, un combo SVN + Hudson pourrait faire l'affaire.
J'aimerais si possible éviter d'installer et de configurer des machines de guerre (dans un premier temps).
Si c'est inconturnable pourrait tu m'expliquer le principe général de SVN + Hudson?
Il est capable de détecter une mise à jour des sources dans un dossier puis de générer un fichier ipa?
Pour la 1ere partie (build+ipa) ça ne peut pas se faire avec un script executé en boucle à intervalles reguliers?
Ce n'est pas ce que fait Johan Williams sur son blog? :
http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/
On ma dit qu'il existe un logiciel, qui permet d'automatiser des actions simples sur MAC : AutoMator.
Il n'est pas possible d'adapter un peu le script plus haut et de le faire executer à intervalles reguliers avec AutoMator?
J'aimerais arriver à :
-compiler un projet X-Code avec un script paramétré et générer un fichier ipa
-déposer le ipa sur un ftp
...
-ensuite aborder le probléme de l'installation automatisée coté iPad de test
(et si ce n'est pas possible, la 1ere partie ma suffira pour commencer)
Cordialement,
Alex
Y'a pas besoin de configurer des machines de guerre, rencardes-toi sur SVN, rencardes-toi sur Hudson, ça sera un très bon début ne serait-ce que pour travailler en groupe sur un même projet et automatiser les builds.
Voilà le rêve de beaucoup de chefs de projets: un développeur termine un bout de code et c'est dirrectement déployé sur un device de test ... Dans la réalité, c'est une longue succession de petites étapes:
Pour éclaircir tout ça, je te conseille une vidéo des CocoaHeads Rennais: "Intégration continue pour les nuls":
J.
Je comprends bien l'intéret d'un SVN et le rôle de Jenkins.
Je vais regarder ça dans le détail, merci pour la vidéo et les explications.
En fait je suis dans un cas particulier :
-les développeurs codent avec un IDE sous Windows
-cet IDE ne compile pas et ne produit pas de ipa : il génére seulement des sources X-Code (le dossier Projet X-Code)
-le Mac sert uniquement pour compiler, générer le ipa et déployer sur les devices de test
L'IDE Windows posséde un gestionnaire de sources intégré pour son language propriétaire.
Donc le SVN coté Mac ne servira pas à gérer les sources : elles sont gérées coté Windows.
Il peut se présenter deux cas :
-1 développeur seul travaille sur ses projets : il a un PC et un Mac en reseau (pas d'autres matériéls)
-N développeurs partagent N projets : il y a N PC et un Mac mutualisé qui sert de centrale d'integration continue (pas d'autres matériéls)
Je dois proposer une automatisation de la chaine de production.
La chaine de production aujourd'hui :
-fermeture projet X-code coté Mac si ouvert
-clic coté windows -> ecrasement dossier projet X-code sur le mac (dossier mac partagé en reseau)
-ouverture du projet X-code sur mac par le développeur
-generation manuelle ipa
-copie manuelle ipa vers ftp
-clic sur un lien web coté testeur sur son iPad de test
-boite de confirmation : voulez vous installer le logiciel ... ?
-installation
-lancement appli et tests
(le développeur a un PC avec un mac à coté, et un iPad relié par un fil sur le mac)
Objectif pour demain :
-clic coté windows -> ecrasement dossier projet X-code sur le mac (dossier mac partagé en reseau)
-generation automatique ipa
-fermeture automatique X-code
-déploiement automatique ipa sur les devices de test (si possible sans boite de confirlmation pour le testeur)
-optionnél : lancement automatique de l'appli installée sur le device de test
(le développeur a un PC, il y a un seul mac pour tous (centrale d'integration), les iPad sont en wifi : pas de fil)
Voila pourquoi j'etais parti sur cette option :
http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/
Cordialement,
Alex
- compiler ton projet ou ton workspace
- packager l'application générée en IPA
- signer l'IPA
Avec un script qui encapsule le tout (je suis en train d'en développer un pour ma boite actuellement, mais son utilisation est spécifique je ne peux pas le partager), on peut donc avoir un script shell qui :
- Lance xcodebuild pour compiler l'appli, utilise xcrun pour packager et signer l'IPA
- En ligne de commande, génère un manifest pour la publication OTA, et pousse le manifest.plist et le IPA sur un serveur (via FTP ou SSH)
- Envoie un mail par exemple aux développeurs avec le lien pour installer l'OTA.
La partie "détection que les sources ont changé pour lancer l'exécution de ce script qui build + déploie", par contre, sans des outils comme SVN+Jenkins (ou un post-commit hook sur SVN au moins), ça me parait déjà plus difficile. Surtout sur un partage réseau (à la limite sinon on aurait pu imaginer une Action de Dossier AppleScript sur le dossier, mais sur les partages réseau ça marche pas). Avec un outil de gestion de version type SVN c'est bcp plus facile (y'a tout ce qu'il faut pour).
La partie "installation automatique sur les devices de test sans action utilisateur ni boite de dialogue", c'est clairement pas possible sans MDM. La seule possibilité pour déployer Over-The-Air sans MDM c'est un déploiement OTA classique, où l'utilisateur vient cliquer sur un lien itms-services qui va demander confirmation à l'utilisateur d'installer l'appli, puis effectuer l'installation.
La meilleure solution est clairement un SCM (genre SVN ou GIT) + Jenkins (ou Hudson). Après, je pense que ton meilleur compromis serait de faire un service Web, par exemple une page PHP (servie par le Mac), sur clic sur un bouton de ta page, ça ouvre une page PHP qui est en charge de lancer les scripts de build et le packaging et générer le manifest pour déploiment OTA et finir par te faire un redirect vers l'URL itms-services pour installer l'OTA.
Au final le développeur depuis son ordi Windows va alors pouvoir (1) déplacer les sources dans le répertoire adéquat puis (2) ouvrir son navigateur sur iPhone vers http://ip.du.mac/generateOTA.php, qui va lancer le build sur le Mac et tout packager et à la fin t'ouvrir/te rediriger vers l'URL itms-service qui va te demander si tu veux installer l'appli. Ca me parait un bon compromis entre le tout-automatisé nécessitant un MDM et tout le boxon, et le tout manuel /wink.png' class='bbc_emoticon' alt=';)' />
Ou pourrais je trouver des tutos/aides qui m'aideraient à reailiser un tel script?
(je suis débutant en mac)
Cordialement,
Alex
Pour les commandes shell à lancer pour compiler il suffit de compiler un projet avec Xcode et regarder dans les logs de compilation les commandes qu'il lance. Tu as la commande xcodebuild (man xcodebuild pour la doc, comme d'hab avec les commandes shell UNIX) pour faire un build de ton projet, xcrun pour lancer la commande PackageApplication et transformer le .app en .ipa, et après bah c'est juste de la génération d'un fichier XML pour le manifest OTA (y'a plein de ressources sur le net, GIYF)
J'ai travaillé comme tu l'indiques pendant plusieurs mois (mais j'étais tout seul).
Les outils que j'ai dû installé étaient : cygwin pour windows (pour avoir rsync et un client ssh) et xcode sur le mac, c'est tout.
Il faut prévoir une journée pour la mise en place.
Voici le workflow :
-Copie des sources sur le mac via rsync (ne copie que les sources qui ont changé).
-Connexion via SSH sur le mac, lancement d'un script de compilation (voir message de Ali).
Hors-sujet pour toi :
-récupération de dossier .ipa via rsync.
-Envoie de l'ipa sur un iPhone jailbreaké via ssh
-Debuggage sur l'iPhone avec l'app Console et gdb via ssh sur iPhone.
Donc j'avais résolu le problème de détection de changement en commandant la compilation via SSH, tout simplement.
Dans un cas multi-équipe, il faudra un dossier source par développeur sur le mac.
Si je retrouve les scripts, je te les envoie.
Tu peux même lancer le script PC via une ligne de commande cygwin ce qui peut te permettre de voir les résultats de la compilation dans ton éditeur de texte PC.
Je crois que c'est ce qu'il faut faire aujourd'hui (l'OTA).
A l'epoque, en 2010, je ne sais pas si l'OTA existait.
Je ne pense pas qu'il reste encore beaucoup d'iDevice en iOS3 !
La partie Hors sujet peut m'intéresser également.
Et s'il vous est possible d'envoyer un bout de script ce serait un gain de temps formidable.
Cordialement,
Alex
Mais bon, c'était vraiment juste deux commandes :
-un rsync pour envoyer les sources sur le mac
-un ssh vers le mac pour faire exécuter le script de compilation.
Après compilation :
-un rsync dans l'autre sens pour relire l'ipa du mac vers le PC
-un killall en ssh sur l'iphone pour tuer l'instance de l'app en cours de debug
-et, enfin, un rsync (ou peut-être un sftp je sais plus) du PC vers l'iphone (connecté par wifi en mode ad-hoc) pour copier l'ipa.
-je n'ai jamais trouvé comment lancer l'app automatiquement sur l'iPhone...
Quand j'ai écrit le script, je ne connaissais pas bien ces commandes, j'ai juste copié des idées et des bouts de code trouvés sur le web.
A priori, aujourd'hui, il faudrait plutôt utiliser la méthode OTA pour déployer sur l'iPhone.
En fait, copier directement l'ipa sur l'iPhone jb n'était pas toujours très stable. En cas de plantage de l'app, je n'arrivais pas toujours à la tuer et donc, j'étais obligé de supprimer l'app de la ré-installer via le mac et, dans ce cas, le répertoire cible n'était plus le même sur l'iPhone, il fallait donc changer le script pour indiquer le nouveau répertoire cible. (j'aurais pu automatiser la procédure via un "find" sur l'iPhone, mais bon j'avais aussi du code à écrire /smile.png' class='bbc_emoticon' alt=':)' />. Pas hyper pratique donc.
Cela dit, je ne peux pas vraiment comparer à la méthode OTA que je n'ai jamais utilisée. Peut-être qu'un mix des deux pourrait être plus pratique.
Maintenant, il faudrait aussi investiguer la méthode qui consisterait à utiliser des softs type "iPhone Explorer" pour copier l'ipa sur l'iPhone.
En ce qui concerne le script de compilation, je l'ai retrouvé mais je pense qu'il est obsolète avec Xcode 4 :
iphone.keychain est un keychain que j'avais dû créer avec l'app "Trousseau d'accès" pour stocker mes certificats.
xcodebuild suffit ("-project" si tu veux compiler un xcodeproj tout seul, "-workspace" si tu veux compiler un Workspace à la Xcode4, pour le reste des flags genre -target (pour un xcodeproj) ou -scheme (pour un xcworkspace) et autres, voir la doc de xcodebuild selon tes besoins.
Pour packager l'appli, j'ai plus la ligne de commande par coeur en tête, mais en gros faut utiliser xcrun avec comme outil PackageApplication (ou un nom comme ça), donc ça doit ressembler à "xcrun -sdk iphoneos PackageApplication blablabla". Le plus simple est de faire un build depuis Xcode et de regarder dans le détail des étapes de build (Build Output) quelle commande il lance à la fin de la compilation pour faire ce packaging d'appli en IPA.
Pour tout le reste, ça ne dépend plus d'Xcode, et ça dépend de ton infrastructure et de comment tu veux automatiser la chose : depuis un script PHP ? Depuis un script Shell ? Transfert du code source par ssh ? scp ? rsync ? ftp ? svn ? git ? Et de comment tu comptes servir le IPA produit, par ftp/ssh/scp/autre sur ton PC et installation via iTunes ? Par installation OTA directement sur l'iPhone (la création du manifest.plist par script se fait simplement en demandant à Xcode d'en générer un et de le prendre pour modèle, la structure du plist en question est simple, et le script pour créer un PLIST peut se faire en PHP, en Shell, en Ruby, en tout ce que tu veux selon tes besoins après tout c'est que du XML). Bref toutes ces étapes en amont et en aval, c'est à toi de choisir ce que tu préfères comme outil, ce qui s'intègrera le mieux dans ton environnement global, mais toutes ces choses périphériques, ce n'est pas dépendant d'Xcode ou de OSX, c'est des outils de transfert de fichiers et de scripting, ceux que tu préfères iront très bien.
J'ai eu beaucoup de mal à trouver ces lignes qui servent à unlocker le keychain. Je m'en serais bien passé mais ça ne fonctionnait pas en lançant simplement xcodebuild.
En fait, quand tu compiles en local sur ta machine, Xcode est effectivement déjà autorisé à accéder au keychain.
Par contre, quand tu te connectes via SSH, si tu ne 'unlocke' pas le keychain, alors le codesigning échoue.
Je viens de refaire l'essai avec iSSH.
Et je vois qu'elles sont aussi dans le script très complet cité par Alexey.
Je pensais que même en SSH, du moment que tu te connectais au SSH avec un utilisateur UNIX qui avait déjà lancé Xcode sur le poste et récupéré les droits, ça passait /wink.png' class='bbc_emoticon' alt=';)' />
Ceci dit c'est compréhensible niveau sécurité pour pas que n'importe qui qui se connecte sur ta machine à distance puisse créer des applications en ton nom, en même temps s'il a accès SSH il a déjà un certain niveau d'autorisations...
Il s'agit d'utiliser la libraire utilisée par iTunes (MobileDevice.framework sur Mac OSX et [font=arial, sans-serif]iTunesMobileDevice.dll sur Windows).[/font]
[font=arial, sans-serif]En fait c'est comme cela que fonctionne des logiciels comme "iPhone Explorer".[/font]
[font=arial, sans-serif]Il existe plusieurs projets open-source utilisant ces librairies et ça marche (enfin je n'ai pas essayé l'installation d'une app mais la copie de fichiers fonctionne).[/font]
[font=arial, sans-serif]Ce projet sur Mac est un utilitaire en ligne de commande : https://github.com/xslim/mobileDeviceManager.[/font]
Sur Windows, il y a la libraire Manzana en C# (et sans doute d'autres plus récents, chercher [font=arial, sans-serif]iTunesMobileDevice.dll).[/font]
Certaines fonctions peuvent aussi être utilisée via le Wifi.
Merci à tous.
Grâce à votre aide j'arrive à faire ce qui était demandé en ssh jusqu'à la copie du fichier IPA sur l'iPad inclus.
Petit résumé de ce qu'on a fait :
-coté iPad :
-jailbreak de l'iPad, installation de OpenSSH (+Veency), changement mot de passe root par défaut, test avec un client SSH
-coté Mac (sert de compilateur X-Code) :
-activation de SSH, test avec un client SSH
-script : xcodebuild, génération ipa, copie fichiers (Mac->iPad) via SSH
-coté Pc (Windows 7) :
-installation et test serveur SSH (Cygwin)
-développement d'un petit exe (pilotage DLL ExtraPuTTY) pour executer les scripts ssh coté Mac et iPad
On génére donc les sources X-Code avec l'IDE Windows.
Cet IDE enchaine le petit exe qui copie les sources sur le mac, génére le script SSH pour mac, et compile et déploie le IPA sur iPad.
Il reste un point que je n'ai pas encore reglé :
-une fois le fichier IPA copié sur l'iPad, comment faire pour l'installer automatiquement puis lancer l'application ?
(automatiquement et sans confirmation par l'utilisateur)
Cordialement,
Alex
Merci grâce à ton code ça marche pour moi : j'arrive à complier en ssh.
Une petite difference sur mon mac : la keychain s'appelle login.keychain et non iphone.keychain (je ne sais pas pourquoi?).
Donc dans mon cas le code est le suivant :
Cordialement,
Alex
Petite question en plus : j'essaye de faire mes tests SSH par internet.
Le PC et le Mac sont derriére une FreeBox.
J'ai redirigé les ports pour avoir un SSH de l'exterieur vers les deux machines.
J'envoie mes scripts SSH depuis le bureau.
Petit probléme :
-WakeOnLan PC : OK (marche en reseau local et par internet)
-WakeOnLan Mac : impossible de réveiller mon Mac Book Pro (OSX Mountain Lion)
J'ai essayé avec l'adresse MAC des deux cartes reseau : Wifi et LAN.
J'ai bien activé la case "Activer lors des accés reseau" dans "Gestion energie".
J'ai essayé en mode eteint (Eteindre) et en veille (Suspendre l'activité).
Dans Partage j'ai activé : Ecran, Fichiers et Session à distance.
Sur le PC j'ai du activer l'option WakeOnLan dans le bios.
Il y a un truc similaire à faire pour le Mac Book Pro?
L'option de laisser le Mac Book Pro allumé toute la journée ne me plait pas beaucoup.
J'aimerais pouvoir l'allumer et l'eteindre quand j'ai envie et à distance.
Merci par avance,
Alex
En fait j'ai créé un nouveau keychain dans lequel je 'ai mis que le certificat développeur.
Dans le login.keychain, il y a d'autres choses et comme le mot de passe apparait en clair dans le script, c'est assez moyen.
Sujet WOL
Je l'ai fait avec iMac connecté en ethernet à une freebox v5.
dans la config freebox, il faut activer le "proxy wol".
Sur le mac, ta config parait bonne.
Il faut peut-etre aussi attribuer une ip fixe a ton mac sur la freebox.
Je reveille le mac avec un logiciel qui s'appelle RemoteBoot sur iOS.
Le port à configurer est le port 9.
Sur mon iMac 2009, ca ne fonctionne pas en Wifi, ni en mode eteint.