- PVSM.RU - https://www.pvsm.ru -
Всем привет! В этой статье я расскажу вам о том, как можно использовать наши продукты для подготовки окружения для тестирования ваших программ. В большинстве сценариев тестирования ПО для достижения повторяемости результатов необходимо, чтобы окружение, на котором оно проводится, было идентичным. Подготовку этого окружения перед тестом будем называть деплойментом [1](“deployment”).
Весь комплекс автоматизированного тестирования [2] выглядит следующим образом: стартовой точкой является сервер с установленным на нём «Jenkins [3]»; через него мы задаём параметры автоматического прогона теста:
— на каком сервере или машине мы будем запускать наш тест;
— как сконфигурировать на нём рейд контроллер; как, в какой последовательности и с какими параметрами разбить диски;
— какую операционную систему поставить
— какие продукты необходимо установить на этот сервер для прогона тестового сценария.
Дженкинс через SSH подключается к другому серверу, на котором лежат все необходимые скрипты для деплоймента, и выполняет эти скрипты с переданными в него параметрами. Сервер, который непосредственно выполняет все действия, подготавливает конфигурацию для загрузки выбранного компьютера через PXe [4].
В качестве того, что будет грузить PXe, мы выбрали нашу Acronis Bootable Media, т. к. с её помощью можно выполнить всё, что нам нужно. Acronis Bootable Media — это урезанная версия Linux’a (BusyBox) с исполняемыми файлами нашего продукта, упакованная в ramdisk [5]. Рамдиск нашей медии можно получить, установив из дистрибутива Acronis Backup компонент Agent For Windows. Рамдиск будет находиться в папке с установленным продуктом:
C:Program Files (x86)Common FilesAcronisBackupAndRecoveryAgent
и будет называться agent_ramdisk.dat
для 32х битной медии и agent_ramdisk64.dat
– для 64х битной.
Внешний вид загруженной из рамдиска медии
В загруженной медии мы выполним все скрипты по подготовке рейд-контролера, и через неё восстановим образ той или иной операционной системы – поверх только что настроенного железа. Первый шаг – настройка рейд-контроллера. Для конфигурации дисков мы используем утилиту storcli [6], которую предварительно запаковываем в 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 [7] (если у машины он есть).
После того как машина загрузится из 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
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/qa/64721
Ссылки в тексте:
[1] деплойментом : http://en.wikipedia.org/wiki/Software_deployment
[2] автоматизированного тестирования: http://en.wikipedia.org/wiki/Test_automation
[3] Jenkins: http://jenkins-ci.org/
[4] PXe: http://ru.wikipedia.org/wiki/PXE
[5] ramdisk: http://en.wikipedia.org/wiki/RAM_drive
[6] storcli: http://www.thomas-krenn.com/en/wiki/LSI_StorCLI
[7] IPMI: http://ru.wikipedia.org/wiki/Intelligent_Platform_Management_Interface
[8] Источник: http://habrahabr.ru/post/229417/
Нажмите здесь для печати.