CI / CD personalizado para Unity

imagem

Agora, mostrarei como é o processo de desenvolvimento do Unity em uma pequena empresa de gamedev e como o aprimoramos e automatizamos. Ainda assim, 2020 está no quintal, basta dirigir com o mouse ...

Sobre o mouse, isso não é brincadeira. Até recentemente, o processo de teste e desenvolvimento de jogos conosco era algo como:

Android


  1. Desenvolvedores escrevem código
  2. Going Android Version
  3. Carrega para uma pasta compartilhada no Google Drive
  4. O testador baixa a versão mais recente
  5. Testa e lança tarefas no Redmine
  6. Ir para: Etapa 1

A versão do iOS é um pouco mais complicada:

iOS


  1. Desenvolvedores escrevem código
  2. Indo para o projeto Xcode
  3. O script Postbuild adiciona localização, SDK e muito mais
  4. Projeto compilado
  5. Arquivado
  6. Exportado para arquivo IPA (tudo isso não é feito muito rapidamente, haha)
  7. Depois disso, você pode fazer o upload do IPA para a pasta compartilhada no Google Drive
  8. Ou faça o upload para o TestFlight, onde você pode esperar alguns dias
  9. O testador baixa o IPA mais recente
  10. Conecta o dispositivo, instala o aplicativo
  11. Testa e lança tarefas no Redmine
  12. Ir para: Etapa 1

Aqui está uma tristeza. E se para Android, o processo ainda é aceitável (não), então para iOS - tudo é muito longo, inconveniente e errado. Além disso, a maioria das operações é realizada manualmente pelo desenvolvedor (aqui sobre o mouse) e o tempo que pode ser gasto no desenvolvimento leva para aguardar a compilação, a exportação do projeto Xcode e assim por diante. Também é necessário levar em consideração que todos estão no mesmo escritório, ou seja, Você pode perguntar / dizer algo antes de iniciar todo esse processo infernal.

Mas, em geral, de alguma forma funciona e lança jogos :)

E aqui recentemente, com a apresentação do Leopotam , outro amante da construção de bicicletas e otimização de tudo, decidi automatizar esse processo. O resultado é um script BASH que pode:

  • Faça o download das alterações mais recentes do repositório GIT
  • Executar testes
  • Build APK para Android, em desenvolvimento e lançamento
  • Crie um projeto para o iOS Xcode, em desenvolvimento e lançamento
  • Compile
  • Arquivar e exportar IPA
  • Gere um manifesto para ele
  • Gere páginas HTML para instalar
  • Carregue tudo isso para o servidor usando sshpass
  • Coloque todos os logs em uma pasta separada
  • Enviar uma notificação por telegrama

E tudo isso com o toque de um botão. Sem iniciar o Unity e o Xcode. De alguma forma, mais divertido, hein?

imagem

Agora, quando a montagem é concluída, o testador recebe uma notificação no Telegram com dois links para as versões Android e iOS. Resta passar por eles e instalar o aplicativo diretamente do dispositivo. Também funciona no iOS, e um manifesto especial é gerado para isso.

Na verdade, esta é minha primeira experiência em programação BASH, então não sei como é, no Feng Shui ou não, mas funciona corretamente. De qualquer forma, o script será atualizado e modificado para atender às necessidades dos projetos. Abaixo estão alguns pontos-chave sobre o que está sendo feito:

Como começar a construir um projeto do Unity para uma plataforma específica


O manual descreve todos os argumentos que podem ser usados ​​para a compilação. Execute a compilação APK:

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

Aqui -buildTarget apenas define a plataforma e - executeMethod chama uma função no projeto do Unity, que inicia a compilação com os parâmetros fornecidos, é algo como isto:

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

Aqui você pode definir seus próprios parâmetros para construção, condição etc. O resultado é retornado ao script BASH.

Como compilar e exportar o projeto Xcode


Depois que o Unity emitiu com sucesso o projeto Xcode, ele deve ser compilado, arquivado e exportado para um arquivo IPA; isso é feito da seguinte maneira:

 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 


Aqui options.plist é um manifesto especial que indica o método de exportação, TeamID e muito mais. Todos os parâmetros disponíveis podem ser visualizados pelo comando:

 xcodebuild -help 

Com todas essas operações, o Unity-iPhone.xcodeproj padrão que o Unity gera é especificado. Se você tiver o xcworkspace , precisará verificar sua disponibilidade e uso.

Como enviar uma mensagem para um telegrama a partir de um script BASH


Você precisa encontrar o bot do BotFather , escrever para ele / start ou / newbot, preencher os campos e receber uma mensagem com um token e um link para a documentação. Para enviar uma mensagem usando o bot, você precisa executar o seguinte comando:

 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 

Aqui, CHAT_ID é o identificador de bate-papo para onde enviar as mensagens. Por exemplo, você pode adicionar o bot ao grupo em que os testadores estão sentados e conceder o direito de ler as mensagens. Depois disso execute:

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

E obtenha o ID do grupo e dos membros que escreveram algo. Depois disso, indique o ID do grupo ou membro específico para quem enviar. Como encontrar e configurar o envio através de um proxy, acho que não é um problema.

Outras funções, modifique modelos de manifesto e HTML usando sed e faça upload dos arquivos necessários para o servidor usando sshpass .

Parâmetros que podem ser alterados rapidamente:

 # # 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 e fonte



Obviamente, tudo isso pode ser feito através do mesmo CI / CD do Gitlab, já existem scripts prontos para isso, execute corredores, construa e teste. Em resumo, use infraestrutura e mecanismos prontos. Mas você precisa passar para ele e também configurá-lo. Talvez cheguemos a isso, enquanto é muito melhor do que era. Além disso, o script inteiro foi escrito com bastante rapidez.

Toda a automação em 2020! Robôs injetam, não um homem.

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


All Articles