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