Это часть серии статей, посвященных шаблону интеграции Azure IoT Edge — azure-iot-edge-integration-test-шаблон. В этой части 1 я объясню весь конвейер, включая инфраструктуру как код и интеграционный тест. Часть 2 будет предоставлять информацию о каждом модуле IoT Edge, а часть 3 — о генераторе манифестов IoT Edge.

Если у вас есть несколько модулей Azure IoT Edge на пограничном устройстве и вы хотите обновить коды одного из этих модулей, вы можете убедиться в качестве кода, внедрив линтер и модульные тесты, но проверить связь между модулями сложно. Вот почему выполнение интеграционных тестов каждый раз, когда вы обновляете программное обеспечение.

Описание изображения

В этом шаблоне вы можете выполнять интеграционные тесты модулей Azure IoT Edge в тестовой среде на виртуальной машине Azure. Процедура тестирования полностью автоматизирована Azure Pipelines. Воспользовавшись этим шаблоном, вы развертываете и выполняете интеграционные тесты перед развертыванием своего кода на пограничном устройстве.

Описание изображения

Этот шаблон включает шесть примеров модулей IoT Edge: ФайлГенератор, FileUpdater, FileUploader, IothubConnector, WeatherObserverа также Локалблобстораже. Подробные сведения о модулях IoT Edge объясняются в шаблоне интеграционного теста Azure IoT Edge — часть 2.

Описание изображения

Вам нужно выполнить три шага, 1) Развертывание инфраструктуры, 2) Настройка и установкаа также 3) Развертывание кода и выполнение тестов. Все, что нужно знать для запуска этого шаблона, описано в Начинаяно я собираюсь проинструктировать подробности и важные моменты для этих конвейеров.

Описание изображения

Ресурсы Azure, необходимые для этого шаблона, определены в основной.бицепс и вы можете запустить конвейер IaC (инфраструктура как код) як.yml в Azure Pipelines.

Описание изображения


Группа безопасности сети — входящий порт 22

основной.бицепс определяет входящее правило группы безопасности сети, которое открывает порт 22. Это необходимо для доступа к виртуальной машине через SSH при установке Azure IoT Edge на следующем шаге, а также для агента Azure Pipelines для настройки каталога виртуальной машины и предоставления разрешений на доступ к каталогу в тест-prep.yml.

properties: {
  securityRules: [
    {
      name: 'SSH'
      properties: {
        protocol: 'Tcp'
        sourcePortRange: '*'
        destinationPortRange: '22'
        sourceAddressPrefix: '*'
        destinationAddressPrefix: '*'
        access: 'Allow'
        priority: 100
        direction: 'Inbound'
      }
    }
  ]
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Метка доменного имени виртуальной машины

Настройка метки доменного имени для виртуальной машины важна, поскольку IP-адрес назначается динамически, а доступ агента Azure Pipelines осуществляется с помощью подключения к службе виртуальной машины, описанного в Создать подключение к службе SSH.

Имя хоста должно быть edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.comкоторый определен в основной.бицепс.

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
  }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Группа потребителей Центра Интернета вещей

Лучше создать группы потребителей Центра Интернета вещей. Если вы хотите получать сообщения в Центре Интернета вещей с помощью другого инструмента, например Обозреватель Центра Интернета вещей Azure это может привести к ошибкам интеграционного теста. основной.бицепс развертывает группу потребителей, предназначенную для агента 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
  }
}
Войти в полноэкранный режим

Выйти из полноэкранного режима


Подключение службы ВМ

В этом шаблоне используется SSH-подключение к сервису. Возможно, вы используете команды bash, такие как ssh testuser@edge-{BASE_NAME}.{LOCATION}.cloudapp.azure.com. Комбинируя retryCountOnTaskFailure задачи Azure Pipelines, вы можете обрабатывать ошибки нестабильного подключения SSH.


Роль участника BLOB-объектов

Вам нужно настроить вручную Storage Blob Data Contributor из Встроенные роли Azure Azure RBAC, который привязан к вашей подписке Azure, поэтому агент Azure Pipelines может создавать маркер SAS для хранилища BLOB-объектов. Вам потребуется роль владельца подписки Azure или администратора доступа пользователей.

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}"
Войти в полноэкранный режим

Выйти из полноэкранного режима

Описание изображения

  • Вызывайте этот шаблон с каждым модулем IoT Edge. При этом образы контейнеров создаются и отправляются в Реестр контейнеров Azure.

  • Использовать не Azure Pipeline Докер задача но команды docker, потому что ему не нужно создавать Подключение службы Docker Registry вручную. Процесс, в ходе которого Azure Pipelines извлекает ключ реестра контейнеров Azure, выполняет сборку и отправку, полностью автоматизирован.

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)
Войти в полноэкранный режим

Выйти из полноэкранного режима

  • Вызовите этот шаблон с модулями IoT Edge в качестве параметров. Параметры используются для повторяющихся задач, которые проверяют, существуют ли образы модулей в Реестре контейнеров Azure, и каждый модуль работает в среде выполнения IoT Edge.
- 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 и локальное хранилище BLOB-объектов Azure IoT Edge с user ID 11000 а также user group ID 11000.
    • Разрешения хост-системы
    • Предоставление доступа к каталогу пользователю контейнера в Linux
    • Установите команду дерева, чтобы она могла отображать каталог хост-компьютера в журнале.
    • Перезапустите среду выполнения Azure IoT Edge, так как вы удалили каталог, в котором текущие модули реализуют монтирование привязки. Чтобы обновить связь между модулями и каталогом, вам необходимо перезапустить среду выполнения, иначе это приведет к ошибкам.
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
Войти в полноэкранный режим

Выйти из полноэкранного режима

  • Используйте асинхронный метод bash & поэтому агент Azure Pipelines отправляет прямой запрос метода в Центр Интернета вещей и в то же время прослушивает сообщения в Центре Интернета вещей, отправленные из модулей 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)
Войти в полноэкранный режим

Выйти из полноэкранного режима

Описание изображения

  • Удалите весь каталог, но сохраните контейнер больших двоичных объектов. weather
az storage blob directory delete --account-name $(STORAGE_ACCOUNT_NAME) --container-name $(BLOB_CONTAINER_NAME) --directory-path $(TEST_ORGANIZATION_NAME) --recursive
Войти в полноэкранный режим

Выйти из полноэкранного режима