Всем привет! В этой статье я расскажу вам о том, как можно использовать наши продукты для подготовки окружения для тестирования ваших программ. В большинстве сценариев тестирования ПО для достижения повторяемости результатов необходимо, чтобы окружение, на котором оно проводится, было идентичным. Подготовку этого окружения перед тестом будем называть деплойментом (“deployment”).
Весь комплекс автоматизированного тестирования выглядит следующим образом: стартовой точкой является сервер с установленным на нём «Jenkins»; через него мы задаём параметры автоматического прогона теста:
— на каком сервере или машине мы будем запускать наш тест;
— как сконфигурировать на нём рейд контроллер; как, в какой последовательности и с какими параметрами разбить диски;
— какую операционную систему поставить
— какие продукты необходимо установить на этот сервер для прогона тестового сценария.
Дженкинс через SSH подключается к другому серверу, на котором лежат все необходимые скрипты для деплоймента, и выполняет эти скрипты с переданными в него параметрами. Сервер, который непосредственно выполняет все действия, подготавливает конфигурацию для загрузки выбранного компьютера через PXe.
В качестве того, что будет грузить PXe, мы выбрали нашу Acronis Bootable Media, т. к. с её помощью можно выполнить всё, что нам нужно. Acronis Bootable Media — это урезанная версия Linux’a (BusyBox) с исполняемыми файлами нашего продукта, упакованная в ramdisk. Рамдиск нашей медии можно получить, установив из дистрибутива Acronis Backup компонент Agent For Windows. Рамдиск будет находиться в папке с установленным продуктом:
C:Program Files (x86)Common FilesAcronisBackupAndRecoveryAgent
и будет называться 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-странички.
Вот пример отчета, который мы получается в конечном итоге. Сравнение скорости бекапа в трех различных версиях продукта. Ось абсцисс – это номер итерации в прогоне, а ось ординат – это скорость бекапа.
Задачу автоматизации деплоймента, каждый решает по-своему. Мы выбрали путь с применением собственных же продуктов, так как по своим возможностям они полностью подходят к нашим целям.
А как вы автоматизируете тестирование и подготовку окружения для него?
Автор: sefremov