CI / CD personnalisé pour Unity

image

Je vais maintenant vous dire à quoi ressemble le processus de développement d'Unity dans une petite entreprise gamedev et comment nous l'améliorons et l'automatisons. Pourtant, 2020 est dans la cour, il suffit de conduire avec la souris ...

À propos de la souris, ce n'est pas une telle blague. Jusqu'à récemment, le processus de test et de développement de jeux avec nous ressemblait à ceci:

Android


  1. Les développeurs écrivent du code
  2. Vers la version Android
  3. Importe dans un dossier partagé sur Google Drive
  4. Le testeur télécharge la dernière version
  5. Teste et lance des tâches dans Redmine
  6. Goto: Étape 1

La version iOS est un peu plus délicate:

iOS


  1. Les développeurs écrivent du code
  2. Aller au projet Xcode
  3. Le script de post-construction ajoute la localisation, le SDK et plus encore
  4. Projet compilé
  5. Archivé
  6. Exporté dans un fichier IPA (tout cela ne se fait pas très rapidement, haha)
  7. Après cela, vous pouvez télécharger l'IPA dans le dossier partagé sur Google Drive
  8. Ou téléchargez sur TestFlight, où vous pouvez attendre quelques jours
  9. Le testeur télécharge la dernière IPA
  10. Connecte l'appareil, installe l'application
  11. Teste et lance des tâches dans Redmine
  12. Goto: Étape 1

Voici une telle tristesse. Et si pour Android, le processus est toujours acceptable (non), alors pour iOS - tout est très long, gênant et incorrect. De plus, la plupart des opérations sont effectuées manuellement par le développeur (ici à propos de la souris) et le temps qui peut être consacré au développement prend pour attendre la compilation, l'exportation du projet Xcode, etc. Il faut également tenir compte du fait que tout le monde est dans le même bureau, c'est-à-dire Vous pouvez venir demander / dire quelque chose avant de commencer tout ce processus infernal.

Mais, en général, cela fonctionne et sort des jeux :)

Et ici récemment, avec le dépôt de Leopotam , un autre amoureux de la construction de vélos et de l'optimisation de tout, j'ai décidé d'automatiser ce processus. Le résultat est un script BASH qui peut:

  • Téléchargez les dernières modifications depuis le référentiel GIT
  • Exécuter des tests
  • Build APK for Android, in develop and release
  • Construire un projet pour iOS Xcode, en développement et en version
  • Compilez-le
  • Archiver et exporter IPA
  • Générez un manifeste pour cela
  • Générer des pages HTML à installer
  • Téléchargez tout cela sur le serveur en utilisant sshpass
  • Mettez tous les journaux dans un dossier séparé
  • Envoyer une notification par télégramme

Et tout cela sur simple pression d'un bouton. Sans démarrer Unity et Xcode. En quelque sorte plus amusant, hein?

image

Maintenant, lorsque l'assemblage est terminé, le testeur reçoit une notification dans Telegram avec deux liens vers les versions Android et iOS. Reste à les parcourir et à installer l'application directement depuis l'appareil. Il fonctionne également sous iOS et un manifeste spécial est généré à cet effet.

En général, c'est ma première expérience en programmation BASH, donc je ne sais pas comment c'est, en Feng Shui ou pas, mais ça fonctionne correctement. Dans tous les cas, le script sera mis à jour et modifié pour répondre aux besoins des projets. Voici quelques points clés sur ce qui est fait:

Comment commencer à créer un projet Unity pour une plateforme spécifique


Le manuel décrit tous les arguments pouvant être utilisés pour la génération. Exécutez le build APK:

$UNITY -batchmode -quit -projectPath "$PATH" -executeMethod Game.BuildActions.AndroidDevelopment -buildTarget android -logFile "$LOGS_PATH/android_development.log" 

Ici, -buildTarget définit simplement la plateforme, et - executeMethod appelle une fonction dans le projet Unity, qui démarre la construction avec les paramètres donnés, elle ressemble à ceci:

 static void AndroidDevelopment () { PlayerSettings.SetScriptingBackend (BuildTargetGroup.Android, ScriptingImplementation.IL2CPP); PlayerSettings.SetScriptingDefineSymbolsForGroup (BuildTargetGroup.Android, "DEV"); EditorUserBuildSettings.SwitchActiveBuildTarget (BuildTargetGroup.Android, BuildTarget.Android); EditorUserBuildSettings.development = true; EditorUserBuildSettings.androidETC2Fallback = AndroidETC2Fallback.Quality32Bit; BuildReport report = BuildPipeline.BuildPlayer (GetScenes (), ANDROID_DEVELOPMENT_FILE, BuildTarget.Android, BuildOptions.None); int code = (report.summary.result == BuildResult.Succeeded) ? 0 : 1; EditorApplication.Exit (code); } 

Ici, vous pouvez définir vos propres paramètres de construction, d'état, etc. Le résultat est renvoyé au script BASH.

Comment compiler et exporter un projet Xcode


Une fois que Unity a émis avec succès le projet Xcode, il doit être compilé, archivé et exporté vers un fichier IPA, cela se fait comme ceci:

 xcodebuild -project "$IOS_PATH/Unity-iPhone.xcodeproj" -quiet > "$LOGS_PATH/ios_build_release.log" 2>&1 

 xcodebuild -project "$IOS_PATH/Unity-iPhone.xcodeproj" -scheme "Unity-iPhone" archive -archivePath "$IOS_RELEASE/Unity-iPhone.xcarchive" -quiet > "$LOGS_PATH/ios_archive_release.log" 2>&1 

 xcodebuild -exportArchive -archivePath "$IOS_RELEASE/Unity-iPhone.xcarchive" -exportOptionsPlist "$IOS_RELEASE/options.plist" -exportPath $IOS_RELEASE -allowProvisioningUpdates -quiet > "$LOGS_PATH/ios_export_release.log" 2>&1 


Ici options.plist est un manifeste spécial qui indique la méthode d'exportation, TeamID et plus encore. Tous les paramètres disponibles peuvent être visualisés par la commande:

 xcodebuild -help 

Avec toutes ces opérations, le Unity-iPhone.xcodeproj standard généré par Unity est spécifié. Si vous avez xcworkspace , vous devez vérifier sa disponibilité et son utilisation.

Comment envoyer un message à un télégramme à partir d'un script BASH


Vous devez trouver le bot BotFather , lui écrire / start ou / newbot, remplir les champs et recevoir un message avec un jeton et un lien vers la documentation. Pour envoyer un message à l'aide du bot, vous devez exécuter la commande suivante:

 curl $BOT_PROXY https://api.telegram.org/bot$BOT_TOKEN/sendMessage -m 60 -s -X POST -d chat_id=$CHAT_ID -d text="$1" > "$LOGS_PATH/bot.log" 2>&1 

Ici CHAT_ID est l'identifiant de chat où envoyer les messages. Par exemple, vous pouvez ajouter le bot au groupe où les testeurs sont assis, lui donner le droit de lire les messages. Après cela, exécutez:

 https://api.telegram.org/bot[BOT_TOKEN]/getUpdates 

Et obtenez l'ID du groupe et des membres qui ont écrit quelque chose. Après cela, indiquez l'ID du groupe ou du membre spécifique à qui envoyer. Comment trouver et configurer l'envoi via un proxy, je pense que ce n'est pas un problème.

Autres fonctions, correctifs des modèles de manifeste et HTML à l'aide de sed et téléchargement des fichiers nécessaires sur le serveur à l'aide de sshpass .

Paramètres pouvant être modifiés rapidement:

 # # PARAMS TO CHANGE # BRANCH='master' COMPANY='my_company' GAME_NAME='new_game' BUNDLE='com.mygames.game' TEAM='ios_team_id' REMOTE_PATH='url_my_builds_server' SSH_LOGIN='my_login' SSH_PASS='my_pass' SSH_HOST='my_builds_server.ru' SSH_PATH='~/domains/my_builds_server.ru/builds' TEMPLATE_FILE=$(PWD)'/template.html' MANIFEST_FILE=$(PWD)'/manifest.plist' VERSION_FILE=$(PWD)'/version.txt' LOGS_PATH=$PROJECT_PATH'/Logs' ANDROID_PATH=$PROJECT_PATH'/Builds/Android' BUILDS_PATH=$PROJECT_PATH'/Builds' IOS_PATH=$PROJECT_PATH'/Builds/iOS' IOS_BUILD_PATH=$PROJECT_PATH'/Builds/iOS/build' IOS_DEVELOPMENT=$PROJECT_PATH'/Builds/iOS/build/development' IOS_RELEASE=$PROJECT_PATH'/Builds/iOS/build/release' BOT_TOKEN='my_bot_token' BOT_PROXY='--proxy 185.189.211.70:8080' CHAT_ID='123456798' UNITY='/Applications/Unity/Hub/Editor/2019.3.0f1/Unity.app/Contents/MacOS/Unity' # # # 

Démo et source



Bien sûr, tout cela pourrait être fait via le même Gitlab CI / CD, il existe déjà des scripts prêts à l'emploi pour cela, exécutez les runners, construisez et testez. En bref, utilisez une infrastructure et des mécanismes prêts à l'emploi. Mais vous devez y accéder et également le configurer. Peut-être y arriverons-nous, alors que c'est tellement mieux qu'il ne l'était. De plus, le script entier a été écrit assez rapidement.

Toute l'automatisation en 2020! Les robots injectent, pas un homme.

Source: https://habr.com/ru/post/fr479884/


All Articles