Найти тему
Invariant World

CiCd GitLab + Unity3D

Оглавление

Одним из немаловажных моментов в разработке является Continuous Integration и Continuous deployment. Простым языком - это система, позволяющая автоматически делать билды и осуществлять к ним доступ для легкой выгрузки и установки.

Цель:

Необходимо настроить CiCd для своего проекта. Необходимо брать проект и делать билд по требованию. На первом этапе надо настроить выпуск Win приложения. В будущем необходимо также настроить сборку под WebGL и Android. С iOS придется подождать, так как нет для него необходимого оборудования.

План:

  • Выбрать сервис CiCd.
  • Настроить сервис на создание билдов.
  • Настроить Unity на запуск сборки.

Реализация:

Сервисы:

На своем жизненном пути я уже настраивал и использовал CiCd через Bamboo от Atlassian и TeamCity от JetBrains. TC мне нравился больше. Он гибкий, шустрый, несложно настраивается. Но на этот раз я решил попробовать использовать встроенный CiCd в GitLab.
Почему я так решил? В GitLab лежит мой репозиторий с проектом. Там же происходят Merge Requests. Единственное, что связки с YouTrack нет.
Как все происходит в GitLab Ci\Cd и что нам надо сделать.

Агент:

Необходимо установить и настроить билд агент на машине с Unity. У меня это машина под Windows, если делать на MacOS (у меня его пока что нет), то все действия очень похожи.
Весь процесс описан в их документации:
https://docs.gitlab.com/runner/install/windows.html#installation
Вначале выкачиваем последнюю версию агента в соответствии с системой и переименовываем его в
gitlab-runner.exe.
Далее, через командную строку необходимо его зарегистрировать.
https://docs.gitlab.com/runner/register/index.html#windows. Перевод делать не буду, там все просто и понятно. Уточню только несколько моментов.
1. Токен при запросе получается со страницы проекта admin/runners
https://docs.gitlab.com/ee/ci/runners/#registering-a-shared-runner.
2. При запросе в консоли:

Please enter the gitlab-ci tags for this runner

необходимо вбить в качестве тэга Unity
3. В качестве исполнителя выбираем ssh.
Также, при желании можно установить агент как сервис, чтобы он автоматом запускался при перезагрузке компьютера.

После проделанной работы нам надо еще поменять среду для запуска команд с PowerSell на cmd. PowerSell конечно хорошая штука, но при работе с Unity ряд проблем, как то - вывод лога в консоль. К тому же, cmd команды будут аналогичными и для MacOS, если будет необходимо развернуть билд агент на нем. Для этого нам надо в файле с настройками \GitLab-Runner\config.toml в секции [runners] запись shell поменять с powershell на cmd.

[[runners]]
...
token = "TOKEN"
...
executor = "ssh"
...
shell = "cmd"

Еще для дальнейшего удобства я прописал пути к разным версиям Unity в системные переменные Unity2019, Unity2020 для того, чтобы можно было на разных машинах с разным расположением Unity запускать билды.

Подготовка Unity к запуску билдов:

Для того чтобы Unity запускала билд из командной строки, нам надо создать файл в папке Editor со статичным методом, который и будет исполняться.

using System.Linq;
using UnityEditor;

public class ContinuousIntegration
{
/// <summary>
/// Запуск билда под Windows через командную строку
/// </summary>
public static void BuildWin()
{
Build(BuildTarget.StandaloneWindows64, "Build/Chono.exe");
}

/// <summary>
/// Запуск билда под необходимую платформу
/// </summary>
/// <param name="target">платформа</param>
/// <param name="outPath">путь для билда</param>
public static void Build(BuildTarget target, string outPath)
{
var options = new BuildPlayerOptions
{
target = target,
//собираем все сцены необходимые включить в билд
scenes = (from settingsScene in EditorBuildSettings.scenes
where settingsScene.enabled
select settingsScene.path).ToArray(),
locationPathName = outPath
};
BuildPipeline.BuildPlayer(options);
}
}

Настройка этапов сборки:

Осталось только настроить этапы. Для GitLab это все делается через файл .gitlab-ci.yml, который кладется в корень проекта. Все параметры прописываются там.

stages:
- test
- build

unity-test:
stage: test
script: '"%Unity2020%"
-batchmode
-projectPath .
-runTests
-testPlatform editmode
-testResults ./unit-tests.xml
-logFile -'
tags:
- Unity
artifacts:
paths:
- unit-tests.xml
only:
- web
- merge_requests

unity-build:
stage: build
script: '"%Unity2020%"
-batchmode
-projectPath .
-buildTarget Win64
-executeMethod ContinuousIntegration.BuildWin
-logFile -
-quit'
tags:
- Unity
artifacts:
paths:
- Build/
only:
- web
- merge_requests

Я разбил сборку на два этапа. Первый - это запуск тестов. Второй - уже сам билд.
Пояснения:
Первый этап. Мы запускаем Unity, расположенный по пути сохраненному в системные переменные, в режиме -batchmode. Путь проекта ведет в корень, там он и лежит (в случае если он распологается в другом месте - этот путь надо поменять). Запускаем -runTests для -editmode тестов, и сохраняем результат. Результаты будут также сохраняться в качестве артефакта (пригодится).
Второй этап. Также запускаем Unity с тем же проектом, и на этот раз вызываем ранее созданный нами метод -executeMethod ContinuousIntegration.BuildWin. В качестве артефакта сохраняем папку с билдом.
Для обоих этапов мы проставляем тэг Unity, это означает, что сборка будет происходить только на агентах, которым был проставлен этот тэг (что мы и сделали при установке агента).
А также я проставил в каких случаях будет осуществляться сборка. Это при вызове в самом GitLab и при создании merge request. Если этого не указывать, то сборка будет осуществляться при каждой заливке в репозиторий.

Итого:

В результате всего этого у меня при создании merge request автоматом запускаются тесты и осуществляется сборка. Результат я могу забрать с самого GitLab. Создание сборок под Android и WebGl добавлю как новые этапы при возникновении необходимости осуществлять под эти платформы сборку.