CI своими руками для Unity3D

в 6:55, , рубрики: ci, linux, unity3d, virtualbox, windows

Дисклеймер: я знаю, что лучше было бы поставить Jenkins, а подход к реализации некоторых вещей, далеко не лучший. Но суть в создании CI с API, с полностью своим решением и как можно быстрее. Буду рад советам и любой критике.

image

В наличии у насть есть только GNU/Linux сервер и доступ через ssh. Цель — виртуальная машина с Windows и возможностью делать билды и использовать весь функционал Unity3D из командной строки.

Мы установим и будем использовать:

  • VNC сервер
  • Xcfe оболочку
  • Oracle VirtualBox

Начнем с установки Xcfe и VNC сервера. Xcfe — графическая оболочка, которая будет существенно упрощать жизнь и рутину c будущей виртуалкой, так как почему-то я не смог сделать адекватный RDP, а костыли с TeamViewer меня не устраивали. Для примера возьмем Ubuntu и выполним следующие действия:

sudo apt-get update
sudo apt-get -y upgrade
apt-get install xfce4 xfce4-goodies gnome-icon-theme tightvncserver

На все вопросы отвечаем да и после установки всего этого создаем пользователя для нашего удаленного рабочего стола на сервере:

sudo adducer remoteUser

Вводим пароль и по желанию дом информацию о пользователе, или просто пропускаем ее. Далее по-необходимости устанавливаем sudo:

sudo apt-get install sudo

И добавляем нашего пользователя в root-группу:

sudo gpasswd -a remoteUser sudo

Если вас напрягает вводить sudo перед каждой командой, можно зайти от имени root:

sudo -s

После произведений всех манипуляций выше у нас уже есть пользователь от имени которого мы будем создавать нашу виртуальную машину, так как я хотел иметь возможность создавать билды с браузера, я еще установил apache2 и php:

sudo apt-get -y  apache2 install php5 libapache2-mod-php5 php5-cli

Далее, заходим от имени пользователя, которого мы только что создали:

sudo su - inc

Теперь мы можем стартовать наш vnc сервер, для удобства я его стартую с разрешением моего экрана:

sudo vncserver -geometry 1280x800

Если вы не можете зайти на ваш удаленный рабочий стол советую так же открыть порт для исходящего соединения, бывает, что по-дефолту порт закрыт:

sudo iptables -A INPUT -p tcp --dport 5901 -j ACCEPT

Ну и пока мы в консоли, было бы круто установить VirtualBox, а то запускать виртуалку будет не на чем:

sudo apt-get install virtualbox

Я испольную Mac и у меня есть screenshare.app для входа на сервак, для других систем вроде должен подойти TightVNC.

Теперь у нас есть все, что нам нужно для работы с виртуальной машиной — образ диска с установленной Windows, для ознакомительных целей, советую скачатьтут после скачивания, импортируем *ova-файл, если при импорте происходят ошибки, просто откройте ova файл как архив и извлеките vmdk, ovf — просто конфиг, он нам не будет нужен, далее создаем виртуалку и цепляем существующий жесткий диск.

После произведения выше описанных действий мы получим возможность включить нашу виртуальную машину и установить туда все необходимое: Unity, любимое средство для работы c git и т.д.

Важное замечание, Unity сможет работать ТОЛЬКО в headless режиме без использования графического устройства, я не смог решить проблему с драйверами для Intel HD видеокарт и 3D ускорение для виртуалки у меня не заработало, но мне оно и не нужно.

Важный момент, если вы захотите так же как и я вызывать функционал Unity через php, вам нужно будет установить возможность выполнять команды без запроса пароля, через visudo, для пользователя, от имени которого выполняется php скрипт, у меня это www-data — стандартный пользователь, так же все bash скрипты и php я сразу же делал от имени этого пользователя, если вы не сильны в настройке через терминал, в интерфейсе все легко можно настроить, пример visudo:

www-data ALL=NOPASSWD: ALL

Как вызвать visudo:

sudo visudo

Я согласен, что это не самый лучший подход, потому что мы по сути разрешаем из php делать все, что хочется, но в моем случае это никого особо не волновало, сервер был изолирован.

Ну и на закуску, как вызывать билд для Unity:

sudo vboxmanage guestcontrol "Windows" execute --username IEUser --password Passw0rd! --image "C:CIbuild.bat" --verbose -- "${1}"

verbose — вывод ответа консоли гостевой машины
"${1}" — параметр, который отвечает за платформу (buildWindowsPlayer)

PHP скрипт который вызывает все это непотребство:

    $platform  = $_GET["platform"];
    $shell = "sh build.sh $platform 2>&1";
    $out = shell_exec($shell);
    echo $out;

2>&1 — это очень помогает при отладке, так как выводит ошибки и позволяет увидеть, вывод скрипта

build.bat выглядит тоже очень просто:

C:PROGRA~1UnityEditorUnity.exe -batchmode -projectPath "%PROJECTPATH%" -%1 %buildPath% -quit -nographics
C:7z.exe a %buildPath% %sharedFolderPath%build.zip

%1 — директива билдa под платформу (buildWindowsPlayer).

Все возможности и манипуляции которые можно произвести находятся здесь
Автор данной статьи не так уж силен в никсах, и если я совершил ошибку буду рад исправить. Более подробно о настройке vnc тут.

В качестве заключения скажу лишь, что конечно данный способ пригоден для обучения как все взаимодействует и рассчитан на тех у кого есть сервер на GNU/Linux и проект на Unity, но нет времени разобраться с этим. Так же отвечая на вопрос почему я для таких простых операций использую такое количество скриптов: в моем случае batch файлы отвечают за постпроцессинг и деплой на shared директории, batch файлы за вызов всего необходимого функционала, а php служит лишь инструментом для вызова всего этого с браузера, если есть предложения как это сделать эффективнее без потерь в наглядности — буду рад замечаниям, так как сам думаю как минимизировать все это, не превратив во что-то неподдерживаемое.

P.S.: Я сейчас делаю небольшой тулз для себя что бы это все работало с одного скрипта и можно было замапить все функции на одной странице и использовать их, если будет желание, я могу поделиться своими наработками в Github.

P.S. 2: Так же есть вариант с заливкой уже настроенного vmdk диска со всем необходимым, но мне честно говоря так было проще, ну и довольно весело было поизучать все остальное.

P.S. 3: Не забудьте активировать лицензию на вашу копию Windows.

Автор: yara_73

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js