Jenkins — Libvirt Slaves Plugin + MacOS

 

Пример того, как используя плагин Libvirt Slaves Plugin для Jenkins‘а подключить воркеров OSX запущенных на QEMU/Virsh, которые могут работать On-demend.

 

Этап настройки MacOS как Jenkins как такового упущена.

Первое что нужно, это установить Libvirt Slaves плагин. Переходим в конфигурацию Jenkins‘а и находим «Управление плагинами»

 

 

Во вкладке «Доступные» ищем Libvirt Slaves и устанавливаем.

 

 

После чего в настройках Jenkins‘а в самом низу появится блок «Cloud«. Тут необходимо подключить наш гипервизор. В данном примере используется QEMU, который работает на удаленном сервере.

Поэтому для начала необходимо на Jenkins сервере установить «libvirt» пакет.

Для Ubuntu:

apt install apt install libvirt

 

Так же закрытый SSH ключ пользователя «jenkins» добавляем в «authorized_keys» пользователя «root» на гипервизоре.

 

Добавляем наш гипервизор в Jenkins‘е

 

И проверяем «Test connection»

Так же в «Расширенные» можно указать нестандартный SSH порт и выбрать SSH ключ.

Параметр «Concurrent Slaves Capacity» задаем максимальное количество запущенных виртуальных машин на гипервизоре одновременно, «0» — неограниченное количество, но с этой переменной может возникнуть баг, который так и не пофиксили. Может виртуальная машина не запускаться, из-за ошибки что вы достигли максимального количества виртуалок, хотя вы его не привешали, для запуска нужно открыть настройки и поменять значение на любое другое и применить.

 

Теперь можем добавлять «Node»

 

Сразу после создания узла, список виртуальных машин у меня был пуст, хотя на гипервизоре было запущенно 4 виртуальных машины.

 

Мне помогло следующее, сразу сохранить данный узел и открыть его на редактирование.

 

 

Так как MacOS использует OVMF файлы, то мы не сможем использовать «Snapshot«, мой способ для «revert» будет ниже.

 

В данной конфигурации Slave будет использоваться только при использовании лейбла.

 

Параметр «Availability» задает доступность агента, если задать только по запросу, то агент будет выключать виртуальную машину, и при необходимости будет сам ее запускать.

 

Переменную «VM_NAME» я использую для «обнуления» виртуальной машины после каждой сборки. Для этого, на гипервизоре создадим скрипт со следующим содержимым:

kvm_image_revert.sh

#!/bin/bash

VM_NAME="$1"
VM_PATH="/var/lib/kvm/vm_images"
VIRSH="/usr/bin/virsh"

sleep 30

$VIRSH define $VM_PATH/$VM_NAME/$VM_NAME.xml
$VIRSH snapshot-delete --domain $VM_NAME --metadata pure_system
rm $VM_PATH/$VM_NAME/mac_hdd.pure_system
$VIRSH destroy $VM_NAME
$VIRSH snapshot-create-as --domain $VM_NAME --name pure_system --disk-only
$VIRSH start $VM_NAME

 

Для работы скрипта нужен один аргумент, это имя виртуальной машины. Это же имя у меня соответствует путям к образам виртуальных машин.

В XML файле в качестве диска должен быть указан оригинальный образ диска, а не снапшот. Тем самым при «define» мы переключаемся на него. Затем удаляем снапшот с именем «pure_system» и удаляем его диск. Если снапшота на момент запуска скрипта не было, ничего страшного, в конце скрипта он создастся. После удаления снапшота выключается виртуальная машина, создается снапшот и запускается виртуальная машина со снапшота. Тем самым все изменения будут проходить в снапшоте, и при каждом запуске скрипта будет создаваться новой на основе оригинального диска, в данном примере это «mac_hdd.img»

 

Так как состояние виртуальной машины будет всегда сбрасываться, то будем лог сборки и ipa файл будем архивировать в артефакты. И последним пунктом обращаемся со сборщика на гипервизор на запуск скрипта в фоне на «обнуление» виртуальной машины. Для этого SSH ключ сборщика должен быть добавлен на гипервизор.

Jenkinsfile:

stage ('iOS. Make artifacts') {
    steps {
        echo "Making Artifacts..."
    }
    post {
        always {
            archiveArtifacts artifacts: "ios_build/*.ipa", onlyIfSuccessful: false
            archiveArtifacts artifacts: "/Users/admin/Library/Logs/gym/*.log", onlyIfSuccessful: false
            sh "rm -rf $WORKSPACE/ios_build"
        }
    }
}
stage ('Revert VM image') {
    steps {
        script {
            sh "ssh -i /Users/admin/.ssh/kvm_server [email protected] \"nohup /scripts/kvm_image_revert.sh $VM_NAME > /dev/null 2>&1 &\""
        }
    }
}
Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии