- Резюме
- TOC
- Обзор
- Архитектура
- Шаги тестирования
- Развертывание инфраструктуры
- Группа сетевой безопасности — входящий порт 22
- Метка доменного имени ВМ
- Группа потребителей концентратора IoT
- Настройка и установка
- Подключение службы VM
- Роль контрибьютора блобов
- Развертывание кода и выполнение тестов
- edge-module.yml
- test-prep.yml
- test-execution.yml
- test-cleanup.yml
Резюме
Это часть цикла статей, посвященных шаблону интеграции Azure IoT Edge — azure-iot-edge-integration-test-template. В этой части.1 я объясню весь конвейер, включая Infrastructure as Code и интеграционный тест. В части.2 будет представлена информация о каждом модуле IoT Edge, а в части.3 я расскажу о генераторе манифеста IoT Edge.
- Шаблон интеграционного теста Azure IoT Edge — часть.2
- Шаблон интеграционного теста Azure IoT Edge — часть.3
TOC
- Обзор
- Архитектура
- Этапы тестирования
- Развертывание инфраструктуры
- Группа сетевой безопасности — входящий порт 22
- Метка доменного имени виртуальной машины
- Группа потребителей концентратора IoT
- Настройка и установка
- Подключение службы ВМ
- Роль контрибьютора блобов
- Развертывание кода и выполнение тестов
- edge-module.yml
- test-prep.yml
- test-execution.yml
- test-cleanup.yml
Обзор
Когда у вас есть несколько модулей Azure IoT Edge на граничном устройстве и вы хотите обновить код одного из этих модулей, вы можете убедиться в качестве кода путем внедрения линтерных и модульных тестов, но трудно проверить связь между модулями. Поэтому при каждом обновлении программного обеспечения необходимо выполнять интеграционные тесты.
В этом шаблоне вы можете выполнить интеграционные тесты модулей Azure IoT Edge в тестовой среде на виртуальной машине Azure. Вся процедура тестирования автоматизирована с помощью Azure Pipelines. Используя этот шаблон, вы развертываете и выполняете интеграционные тесты перед развертыванием кода на граничном устройстве.
Архитектура
Этот шаблон включает шесть образцов модулей IoT Edge — FileGenerator, FileUpdater, FileUploader, IothubConnector, WeatherObserver и LocalBlobStorage. Подробности о модулях IoT Edge описаны в Azure IoT Edge Integration Test template — Part.2.
Шаги тестирования
Вам необходимо выполнить три шага: 1) развертывание инфраструктуры, 2) настройка и установка и 3) развертывание кода и выполнение теста. Все, что нужно знать для запуска этого шаблона, описано в разделе Getting-started, но я расскажу о деталях и важных моментах для этих конвейеров.
Развертывание инфраструктуры
Ресурсы Azure, необходимые для этого шаблона, определены в файле main.bicep, и вы можете запустить конвейер IaC (Infrastructure as Code) из файла iac.yml в Azure Pipelines.
Группа сетевой безопасности — входящий порт 22
В файле main.bicep определено входящее правило Network Security Group, которое открывает порт 22. Это необходимо для доступа к ВМ через SSH при установке Azure IoT Edge на следующем шаге и для того, чтобы агент Azure Pipelines настроил каталог ВМ и предоставил разрешения на доступ к каталогу в test-prep.yml.
properties: {
securityRules: [
{
name: 'SSH'
properties: {
protocol: 'Tcp'
sourcePortRange: '*'
destinationPortRange: '22'
sourceAddressPrefix: '*'
destinationAddressPrefix: '*'
access: 'Allow'
priority: 100
direction: 'Inbound'
}
}
]
}
Метка доменного имени ВМ
Настройка метки доменного имени для ВМ очень важна, поскольку IP-адрес выделяется динамически, а агент Azure Pipelines получает доступ с помощью VM Service Connection, описанного в Create SSH Service Connection.
Имя хоста должно быть edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com
, которое определено в main.bicep.
var dns_label = 'edge-${base_name}'
resource PublicIp 'Microsoft.Network/publicIPAddresses@2021-05-01' = {
name: public_ip_name
location: location
sku: {
name: 'Basic'
}
properties: {
publicIPAllocationMethod: 'Dynamic'
publicIPAddressVersion: 'IPv4'
dnsSettings: {
domainNameLabel: dns_label
}
idleTimeoutInMinutes: 4
}
}
Группа потребителей концентратора IoT
Лучше создавать группы потребителей IoT Hub. Если вы хотите потреблять сообщения на IoT Hub через другой инструмент, например Azure IoT Hub Explorer, это приведет к ошибкам интеграционного теста. main.bicep развертывает группу потребителей, которая посвящена агенту Azure Pipelines, выполняющему интеграционные тесты.
param iothub_cg_name string
resource IoTHubConsumerGroup 'Microsoft.Devices/IotHubs/eventHubEndpoints/ConsumerGroups@2021-07-02' = {
name: '${IoTHub.name}/events/${iothub_cg_name}'
properties:{
name: iothub_cg_name
}
}
Настройка и установка
Подключение службы VM
В этом шаблоне используется SSH сервисное подключение. Можно использовать команды bash, например ssh testuser@edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com
. Комбинируя retryCountOnTaskFailure
задачи Azure Pipelines, вы можете обрабатывать ошибки нестабильного соединения SSH.
Роль контрибьютора блобов
Вам нужно вручную установить Storage Blob Data Contributor
из встроенных ролей Azure RBAC, которые привязаны к вашей подписке Azure Subscription, чтобы агент Azure Pipelines мог генерировать SAS-токен для Blob Storage. Вам нужна роль Azure Subscription Owner или User Access Administrator.
az role assignment create `
--role "Storage Blob Data Contributor" `
--assignee {Object ID of Azure Service Connection} `
--scope "/subscriptions/{Azure Subscription ID}/resourceGroups/rg-{BASE_NAME}/providers/Microsoft.Storage/storageAccounts/st{BASE_NAME}"
Развертывание кода и выполнение тестов
edge-module.yml
-
Вызывайте этот шаблон с каждым модулем IoT Edge. Он создает и размещает образы контейнеров в Azure Container Registry.
-
Используйте не задачу Azure Pipeline Docker, а команды docker, поскольку в этом случае не нужно вручную создавать подключение к службе Docker Registry. Процесс, в ходе которого Azure Pipelines извлекает ключ Azure Container Registry, создает и перемещает контейнерные образы, автоматизирован.
acrkey=$(az acr credential show --name $(ACR_NAME) --query passwords[0].value -o tsv)
cd ${{ parameters.dockerfileDirectory }}
docker login -u $(ACR_NAME) -p $acrkey $(ACR_NAME).azurecr.io
docker build --rm -f Dockerfile -t $(ACR_NAME).azurecr.io/${{ parameters.repositoryName }}:$(Build.BuildNumber) .
docker push $(ACR_NAME).azurecr.io/${{ parameters.repositoryName }}:$(Build.BuildNumber)
test-prep.yml
- Вызовите этот шаблон с модулями IoT Edge в качестве параметров. Параметры используются для итеративных задач, которые проверяют, существуют ли образы модулей в Azure Container Registry и запущен ли каждый модуль на IoT Edge runtime.
- template: ./templates/test-prep.yml
parameters:
azureSvcName: $(AZURE_SVC_NAME)
vmSshSvcName: $(VM_SVC_NAME)
EdgeImages:
module1:
name: IothubConnector
repository: iothub-connector
tag: $(Build.BuildNumber)
module2:
name: WeatherObserver
repository: weather-observer
tag: $(Build.BuildNumber)
module3:
name: FileGenerator
repository: file-generator
tag: $(Build.BuildNumber)
module4:
name: FileUploader
repository: file-uploader
tag: $(Build.BuildNumber)
module5:
name: FileUpdater
repository: file-updater
tag: $(Build.BuildNumber)
- Задача SSH
- Удалите каталог
/edge
, чтобы очистить его от остатков прошлых тестов. - Предоставьте разрешения на чтение, запись и выполнение каталогу хост-машины. Azure IoT Edge Hub с
UID 1000
и Azure IoT Edge local blob storage сuser ID 11000
иuser group ID 11000
. - Разрешения хост-системы
- Предоставление доступа к каталогам пользователю контейнера в Linux
- Установите команду tree, чтобы она могла показывать каталог хост-машины в журнале.
- Перезапустите Azure IoT Edge runtime, потому что вы удалили каталог, который текущие модули реализуют bind mount. Чтобы обновить связь между модулями и каталогом, необходимо перезапустить среду выполнения, иначе это приведет к ошибкам.
- Удалите каталог
if [ -d "/edge" ]
then
sudo rm -r /edge
fi
sudo mkdir -p $(FILE_UPLOADER_DIR)
sudo chown -R 1000 $(FILE_UPLOADER_DIR)
sudo chmod -R 700 $(FILE_UPLOADER_DIR)
sudo mkdir -p $(FILE_UPDATER_DIR)
sudo chown -R 1000 $(FILE_UPDATER_DIR)
sudo chmod -R 700 $(FILE_UPDATER_DIR)
sudo mkdir -p $(LOCAL_BLOB_STORAGE_DIR)
sudo chown -R 11000:11000 $(LOCAL_BLOB_STORAGE_DIR)
sudo chmod -R 700 $(LOCAL_BLOB_STORAGE_DIR)
sudo apt-get install tree
tree /edge
sudo iotedge system restart
test-execution.yml
- Используйте асинхронный метод bash
&
, чтобы агент Azure Pipelines отправлял прямой запрос метода на IoT Hub и в то же время слушал сообщения на IoT Hub, отправленные из модулей IoT Edge.--timeout
в настоящее время установлен30
сек. Иногда ответ от IoT Edge медленный, они не отвечают и вызывают ошибки. Вероятно, 30 секунд — это хорошее время для ожидания. Если оно превышает 30 секунд, значит, в модулях Edge что-то идет не так.
az iot hub invoke-module-method --hub-name $(IOTHUB_NAME) --device-id $(IOTHUB_DEVICE_ID) --module-id IothubConnector --method-name request_weather_report --method-payload '{"city": "Tokyo"}' &
testResult=$(az iot hub monitor-events --hub-name $(IOTHUB_NAME) --device-id $(IOTHUB_DEVICE_ID) --module-id IothubConnector --cg $(IOTHUB_CONSUMER_GROUP) --timeout 30 -y)
test-cleanup.yml
- Удалите все каталоги, но сохраните контейнер blob
weather
.
az storage blob directory delete --account-name $(STORAGE_ACCOUNT_NAME) --container-name $(BLOB_CONTAINER_NAME) --directory-path $(TEST_ORGANIZATION_NAME) --recursive