Benutzerdefiniertes CI / CD für Unity

Bild

Jetzt erkläre ich Ihnen, wie der Entwicklungsprozess für Unity in einem kleinen Unternehmen von gamedev aussieht und wie wir ihn verbessern und automatisieren. Trotzdem ist 2020 auf dem Hof, es ist genug, um mit der Maus zu fahren ...

Über die Maus ist dies kein Witz. Bis vor kurzem sah der Prozess des Testens und Entwickelns von Spielen bei uns ungefähr so ​​aus:

Android


  1. Entwickler schreiben Code
  2. Going Android-Version
  3. Lädt in einen freigegebenen Ordner auf Google Drive hoch
  4. Der Tester lädt den neuesten Build herunter
  5. Testet und löst Aufgaben in Redmine
  6. Gehe zu: Schritt 1

Die iOS-Version ist etwas kniffliger:

iOS


  1. Entwickler schreiben Code
  2. Gehe zum Xcode-Projekt
  3. Postbuild-Skript fügt Lokalisierung, SDK und mehr hinzu
  4. Kompiliertes Projekt
  5. Archiviert
  6. Exportiert in eine IPA-Datei (all das ist nicht sehr schnell erledigt, haha)
  7. Danach können Sie den IPA in den freigegebenen Ordner auf Google Drive hochladen
  8. Oder laden Sie es in TestFlight hoch, wo Sie einige Tage warten können
  9. Tester lädt die neueste IPA herunter
  10. Verbindet das Gerät, installiert die Anwendung
  11. Testet und löst Aufgaben in Redmine
  12. Gehe zu: Schritt 1

Hier ist so eine Traurigkeit. Und wenn der Prozess für Android immer noch akzeptabel ist (nein), dann für iOS - alles ist sehr lang, unpraktisch und falsch. Darüber hinaus werden die meisten Vorgänge vom Entwickler manuell ausgeführt (hier über die Maus) und die Zeit, die für die Entwicklung aufgewendet werden muss, um auf die Kompilierung, den Export des Xcode-Projekts usw. zu warten. Es muss auch berücksichtigt werden, dass sich jeder im selben Büro befindet, d. H. Sie können kommen, um etwas zu fragen / zu sagen, bevor Sie diesen ganzen höllischen Prozess beginnen.

Aber im Allgemeinen funktioniert es irgendwie und veröffentlicht Spiele :)

Und hier entschied ich mich kürzlich mit der Einreichung von Leopotam , einem weiteren Liebhaber des Fahrradbaus und der Optimierung von allem, diesen Prozess zu automatisieren. Das Ergebnis ist ein BASH-Skript, das Folgendes kann:

  • Laden Sie die neuesten Änderungen aus dem GIT-Repository herunter
  • Führen Sie Tests durch
  • Erstellen Sie APK für Android in Entwicklung und Veröffentlichung
  • Erstellen Sie ein Projekt für iOS Xcode in Entwicklung und Veröffentlichung
  • Kompiliere es
  • IPA archivieren und exportieren
  • Erstellen Sie ein Manifest dafür
  • Generieren Sie zu installierende HTML-Seiten
  • Laden Sie all dies mit sshpass auf den Server hoch
  • Legen Sie alle Protokolle in einem separaten Ordner ab
  • Senden Sie eine Telegrammbenachrichtigung

Und das alles auf Knopfdruck. Ohne Unity und Xcode zu starten. Irgendwie macht es mehr Spaß, oder?

Bild

Jetzt, wenn die Montage abgeschlossen ist, erhält der Tester eine Benachrichtigung in Telegramm mit zwei Links zu den Android- und iOS-Versionen. Es bleibt ihnen durch und installieren Sie die Anwendung direkt vom Gerät. Es funktioniert auch unter iOS, und dafür wird ein spezielles Manifest generiert.

Eigentlich ist dies meine erste Erfahrung in der BASH-Programmierung, daher weiß ich nicht, wie es ist, in Feng Shui oder nicht, aber es funktioniert einwandfrei. In jedem Fall wird das Skript aktualisiert und an die Anforderungen der Projekte angepasst. Nachfolgend sind einige wichtige Punkte aufgeführt:

So erstellen Sie ein Unity-Projekt für eine bestimmte Plattform


Das Handbuch beschreibt alle Argumente, die für den Build verwendet werden können. Führe das Build APK aus:

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

Hier legt -buildTarget nur die Plattform fest und - executeMethod ruft eine Funktion im Unity-Projekt auf, die den Build mit den angegebenen Parametern startet. Sie sieht ungefähr so aus:

 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); } 

Hier können Sie Ihre eigenen Parameter für Build, Bedingung usw. einstellen. Das Ergebnis wird an das BASH-Skript zurückgegeben.

So kompilieren und exportieren Sie ein Xcode-Projekt


Nachdem Unity das Xcode-Projekt erfolgreich ausgestellt hat, muss es kompiliert, archiviert und in eine IPA-Datei exportiert werden.

 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 


Hier ist options.plist ein spezielles Manifest, das die Exportmethode, TeamID und mehr angibt. Alle verfügbaren Parameter können mit dem Befehl angezeigt werden:

 xcodebuild -help 

Bei all diesen Vorgängen wird das von Unity generierte Standard- Unity-iPhone.xcodeproj angegeben. Wenn Sie über xcworkspace verfügen, müssen Sie die Verfügbarkeit und Verwendung überprüfen.

So senden Sie eine Nachricht aus einem BASH-Skript an ein Telegramm


Sie müssen den BotFather- Bot finden, ihm / start oder / newbot schreiben, die Felder ausfüllen und eine Nachricht mit einem Token und einem Link zur Dokumentation erhalten. Um eine Nachricht mit dem Bot zu senden, müssen Sie den folgenden Befehl ausführen:

 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 

Hier ist CHAT_ID die Chat- ID, an die Nachrichten gesendet werden sollen. Sie können beispielsweise den Bot der Gruppe hinzufügen, in der die Tester sitzen, und ihm das Recht geben, Nachrichten zu lesen. Danach führen Sie aus:

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

Und erhalte die ID der Gruppe und der Mitglieder, die etwas geschrieben haben. Geben Sie anschließend die ID der Gruppe oder des bestimmten Mitglieds an, an das die Nachricht gesendet werden soll. Wie man das Versenden über einen Proxy findet und konfiguriert, halte ich für kein Problem.

Andere Funktionen, Patchen von Manifest-Vorlagen und HTML mithilfe von sed und Hochladen der erforderlichen Dateien auf den Server mithilfe von sshpass .

Parameter, die schnell geändert werden können:

 # # 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' # # # 

Demo und Quelle



Natürlich könnte dies alles über das gleiche Gitlab CI / CD erfolgen, es gibt bereits fertige Skripte dafür, führen Läufer aus, bauen und testen. Kurz gesagt: Verwenden Sie vorgefertigte Infrastrukturen und Mechanismen. Sie müssen jedoch zu ihm wechseln und ihn auch konfigurieren. Vielleicht kommen wir dazu, obwohl es so viel besser ist als es war. Darüber hinaus wurde das gesamte Skript schnell genug geschrieben.

Alle Automatisierung im Jahr 2020! Roboter spritzen, kein Mann.

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


All Articles