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

image

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

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

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

Начнем с установки Xfce и VNC сервера. Xfce — графическая оболочка, которая будет существенно упрощать жизнь и рутину 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:\CI\build.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~1\Unity\Editor\Unity.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.

Комментарии (3)


  1. Leopotam
    11.03.2016 10:58
    +1

    А зачем Windows вообще? Вроде были в паблике билды редактора для бубунты, оно оказалось нерабочим? Накатить бубунту (можно даже сервер + X-ы) и запускать так же билд-скрипты из консольки.


    1. yara_73
      11.03.2016 11:05
      +3

      Конкретно в моем случае Debian билд не завелся с моим проектом (то-ли проект большой, или чересчур тяжелый) ну и нужно было делать билды на той же версии, которая стоит на моей машине для разработки, а билд для Linux на немного староватой версии был сделан, ну и потенциальное отставание на полгода не устраивало.


  1. steamoor
    21.03.2016 05:54

    > sudo apt-get install sudo

    это конечно сильно :))