![](http://habrastorage.org/getpro/habr/post_images/789/e14/a7b/789e14a7b43d878c3ae87d1547b9033b.png)
Весь комплекс автоматизированного тестирования выглядит следующим образом: стартовой точкой является сервер с установленным на нём «Jenkins»; через него мы задаём параметры автоматического прогона теста:
— на каком сервере или машине мы будем запускать наш тест;
— как сконфигурировать на нём рейд контроллер; как, в какой последовательности и с какими параметрами разбить диски;
— какую операционную систему поставить
— какие продукты необходимо установить на этот сервер для прогона тестового сценария.
Дженкинс через SSH подключается к другому серверу, на котором лежат все необходимые скрипты для деплоймента, и выполняет эти скрипты с переданными в него параметрами. Сервер, который непосредственно выполняет все действия, подготавливает конфигурацию для загрузки выбранного компьютера через PXE.
В качестве того, что будет грузить PXE, мы выбрали нашу Acronis Bootable Media, т. к. с её помощью можно выполнить всё, что нам нужно. Acronis Bootable Media — это урезанная версия Linux’a (BusyBox) с исполняемыми файлами нашего продукта, упакованная в ramdisk. Рамдиск нашей медии можно получить, установив из дистрибутива Acronis Backup компонент Agent For Windows. Рамдиск будет находиться в папке с установленным продуктом:
C:\Program Files (x86)\Common Files\Acronis\BackupAndRecoveryAgent\
и будет называться agent_ramdisk.dat
для 32х битной медии и agent_ramdisk64.dat
– для 64х битной.
Внешний вид загруженной из рамдиска медии
В загруженной медии мы выполним все скрипты по подготовке рейд-контролера, и через неё восстановим образ той или иной операционной системы – поверх только что настроенного железа. Первый шаг – настройка рейд-контроллера. Для конфигурации дисков мы используем утилиту storcli, которую предварительно запаковываем в ramdisk.
Вот пример shell’овского скрипта, который запаковывает нужные нам файлы в ramdisk:
# Распаковка ramdisk. extract_ramdisk() { rm -rf .ramdisk mkdir .ramdisk pushd .ramdisk gzip -dc < $1 | cpio -i -d --no-absolute-filenames popd } # Подкладывание нужных файлов в Acronis Media. copy_extra_files() { mkdir -p .ramdisk/tmp/root/.ssh cp -f files/id_rsa .ramdisk/tmp/root/.ssh cp -f files/autostart.sh .ramdisk/bin/autostart_dbg cp -f files/libstorelibir-2.so.14.07-0 .ramdisk/bin cp -f files/storcli64 .ramdisk/bin } # Запаковка ramdisk’a. pack_ramdisk() { mkdir -p out pushd .ramdisk /cygdrive/c/cygwin/bin/find . | cpio -H newc -o > ../out/agent_ramdisk_echo.dat.initrd popd gzip -c9 out/agent_ramdisk_echo.dat.initrd > out/ramdisk.dat rm -f out/agent_ramdisk_echo.dat.initrd rm -rf .ramdisk } # Вызов методов. echo Extracting ramdisk... extract_ramdisk $1 echo Copying extra files... copy_extra_files echo Packing ramdisk... pack_ramdisk
После того, как мы запаковали утилиту в ramdisk, её можно использовать в загруженной Acronis медии. Для загрузки через кастомный ramdisk из-под PXE, нужно создать корректный конфигурационный файл для загружающей машины. В качестве PXE-сервера мы используем ту же самую машину, которой Jenkins передаёт управление. На ней же у нас стоит DHCP сервер. Все тестовые машины держим в своей собственной виртуальной сети, чтобы не мешать другим работникам компании.
Процесс деплоймента начинается с подготовки конфигурационного файла для PXE: который генерируется по имени машины. Поскольку этот же сервер также выполняет функцию DHCP, имени нам достаточно, чтобы узнать её mac-адрес, создать правильный файл конфигурации и положить его в /var/lib/tftpboot. Пример файла конфигурации загрузки приведен ниже. После этого мы перезагружаем машину через IPMI (если у машины он есть).
После того как машина загрузится из ramdisk, в медии начнёт выполняться скрипт autostart.sh. Сначала мы прописываем в нем, как через storcli сконфигурировать диски, а затем задаём параметры восстановления того или иного образа операционной системы на машину через наш продукт. Эти образы сделаны нашим же продуктом Acronis
Backup представляют собой *.tib файлы и лежат на шаре в этой же сети.
Вот пример скрипта autostart.sh:
configureRaidDisk() { conf_id=$(cat /proc/cmdline | grep -o 'raid_configuration_number=[^ ]*' | sed 's/\(^raid_configuration_number=\)\(.*\)/\2/') echo Raid configuration: $conf_id # Default value not to reconfigure raid controller disk state. if [ "$conf_id" == "0" ]; then return elif [ "$conf_id" == "1" ]; then (/bin/storcli64 /c1/vall delete force && echo Delete all virtual drives.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:3 wt nora direct strip=64 && echo Create system partition.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:0,252:1,252:2 wt nora direct strip=64 && echo Create first virtual drive.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:4,252:5,252:6 wt nora direct strip=64 && echo Create second virtual drive.) || exit 1 (/bin/storcli64 /c1 add vd type=raid0 drives=252:7 wt nora direct strip=64 && echo Create third virtual drive.) || exit 1 (/bin/storcli64 /c1/v0 set bootdrive=on && echo Set system disk as bootable.) || exit 1 fi } execCmd() { tmp=$(cat /proc/cmdline | grep -oe acrocmd.*\) ) cmd=${tmp%%\)} echo Recovering OS image... ($cmd >> /dev/null && echo Done.) || exit 1 } configureRaidDisk startProduct execCmd reboot now
Параметры для этого скрипта мы передаём через /proc/cmdline, который берём конфигурационного файла из PXE. Мы просматриваем, какую конфигурацию рейда нам взять, и зовём уже непосредственно storcli с нужными нам параметрами. Сейчас у нас всё настроено под определённые железки, в дальнейшем есть желание сделать эти операции более умными.
После конфигурации рейда мы запускаем операцию восстановления операционной системы. Для этого опять вычленяем из переданного нам в /proc/cmdline команду для восстановления и выполняем её.
Вот пример конфигурационного файла, сгенерированного для загрузки машины через PXE:
timeout=1 default=media image=kernel64.dat label=media initrd=ramdisk64.dat append="ramdisk_size=100000 quiet vga=791 recover=(acrocmd recover disk --loc=smb://10.250.114.44/raid/images --credentials=image,qweqweqwe --arc=win7_64srv --disk=1 --target_disk=1) bootfile=root@10.250.114.101:/tmp/uefi/0AFA7218.conf#end raid_configuration_number=1"
Из него мы и задаем, какой архив восстанавливать – как раз то, что в параметре append попадёт затем в proc/cmdline внутри медии.
Рамдиск должен лежать в /var/lib/tftpboot/ на PXE-сервере. В нашем случае он называется ramdisk64.dat. После того, как наша медия отработала, и система восстановлена, мы можем столкнуться с проблемой: после настройки рейда с помощью storcli, тома на виртуальных дисках рейда не создаются. Поэтому в скрипте самого высокого уровня, который подготавливает конфигурацию для загрузки PXE, перезагружает машину и ждет загрузки восстановленной системы, мы добавили выполнение следующего скрипта:
echo list disk > list.txt for /f "usebackq tokens=1,2" %%a in (`diskpart /s list.txt ^| findstr /r /c:"Disk [1-99]"`) do ( echo sel %%a %%b>script.txt echo clean>>script.txt echo create part primary>>script.txt echo format FS=NTFS quick>>script.txt echo assign>>script.txt echo rescan>>script.txt diskpart /s script.txt ) del list.txt, del script.txt
Он создаёт NTFS-тома на каждом найденном диске (кроме первого). Так как diskpart не может принимать на вход параметры, а может только использовать скрипт, мы генерируем файл с командой для листинга дисков на лету и после форматируем файловую систему, используя диски из листинга.
После восстановления ОС можно приступать к установке продуктов. Запуск скриптов и прочих действий на тестовой машине производится с управляющего сервера через SSH-соединение. Для этого на тестовой машине стоит SSH-сервер, который уже установлен в образе, так что после восстановления машины, мы просто подключаемся к ней по SSH. Установку продукта реализуем копированием на машину нужных нам msi-файлов нашего продукта, которые просто ставим через msiexec. Теперь можно приступать к самому тестированию.
Тесты представляют собой «обертки» на Питоне, выполняющие те или иные операции через командную строку утилиты Acrocmd. Acrocmd позволяет нам выполнять все те же операции, что и через GUI основного продукта.
Запуском этих файлов (реализованных на Python’e) на тестируемой машине занимается специальная система, установленная на другой управляющий сервер. Управляющий сервер по SSH-соединению заливает все скрипты на машину и запускает их, собирает их вывод и объединяет результаты всех тестов в один итоговый отчет. В дальнейшем по нему можно построить красивый отчёт о прогоне тестового сценария. Для этого мы используем несложный веб-сервер, написанный на Python’e, который преобразует результаты в красивые html-странички.
Вот пример отчета, который мы получается в конечном итоге. Сравнение скорости бекапа в трех различных версиях продукта. Ось абсцисс – это номер итерации в прогоне, а ось ординат – это скорость бекапа.
Задачу автоматизации деплоймента, каждый решает по-своему. Мы выбрали путь с применением собственных же продуктов, так как по своим возможностям они полностью подходят к нашим целям.
А как вы автоматизируете тестирование и подготовку окружения для него?
ссылка на оригинал статьи http://habrahabr.ru/company/acronis/blog/229417/
Добавить комментарий