Integración e implementación continuas en dispositivos Azure IoT Edge (editor clásico)

Se aplica a:marca de verificación de IoT Edge 1.1 IoT Edge 1.1 marca de verificación de IoT Edge 1.2 IoT Edge 1.2 marca de verificación de IoT Edge 1.3 IoT Edge 1.3 marca de verificación de IoT Edge 1.4 IoT Edge 1.4

Azure Pipelines incluye una tarea integrada de Azure IoT Edge que le ayuda a adoptar un enfoque DevOps con sus aplicaciones de Azure IoT Edge. En este artículo se muestra cómo usar las características de integración e implementación continuas de Azure Pipelines para crear, probar e implementar aplicaciones de forma rápida y eficaz en Azure IoT Edge mediante el editor clásico. Como alternativa, puede usar YAML.

Diagrama: ramas CI y CD para desarrollo y producción

En este artículo, aprenderá a usar las tareas integradas de Azure IoT Edge para Azure Pipelines para crear canalizaciones de compilación y versión para la solución de IoT Edge. Cada tarea de Azure IoT Edge que se agrega a la canalización implementa una de las cuatro acciones siguientes:

Acción Descripción
Generar imágenes de módulo Usa el código de su solución de IoT Edge y compila las imágenes de contenedor.
Insertar imágenes de módulo Inserta las imágenes del módulo en el registro de contenedor especificado.
Generar el manifiesto de implementación Usa el archivo deployment.template.json y sus variables para generar el archivo final de manifiesto de implementación de IoT Edge.
Implementación en dispositivos de IoT Edge Crea implementaciones de IoT Edge en uno o varios dispositivos IoT Edge.

A menos que se especifique lo contrario, los procedimientos descritos en este artículo no exploran toda la funcionalidad disponible mediante parámetros de tarea. Para obtener más información, consulte los siguientes recursos:

Requisitos previos

  • Un repositorio de Azure Repos. Si no tiene uno, puede crear un nuevo repositorio de Git en el proyecto. En este artículo, hemos creado un repositorio denominado IoTEdgeRepo.

  • Una solución de IoT Edge confirmada e insertada en el repositorio. Si quiere crear una nueva solución de ejemplo para hacer pruebas según este artículo, siga los pasos para desarrollar y depurar módulos en Visual Studio Code o desarrollar y depurar módulos de C# en Visual Studio. Para este artículo, hemos creado una solución en el repositorio denominada IoTEdgeSolution, que tiene el código de un módulo denominado filtermodule.

    En este artículo, todo lo que necesita es la carpeta de la solución creada mediante las plantillas de IoT Edge en Visual Studio Code o Visual Studio. No es necesario compilar, insertar, implementar ni depurar este código antes de continuar. Configurará esos procesos en Azure Pipelines.

    Conozca la ruta de acceso al archivo deployment.template.js de la solución, ya que se usa en varios pasos. Si no está familiarizado con el rol de la plantilla de implementación, consulte Aprenda a implementar módulos y establecer rutas.

    Sugerencia

    Si está creando una nueva solución, clone el repositorio localmente en primer lugar. A continuación, cuando cree la solución, puede elegir crearlo directamente en la carpeta del repositorio. Puede confirmar e insertar fácilmente los nuevos archivos desde allí.

  • Un registro de contenedor donde pueda insertar imágenes del módulo. Puede usar Azure Container Registry o un registro de terceros.

  • Un centro de IoT de Azure activo con al menos dos dispositivos de IoT Edge para hacer pruebas de las fases independientes de implementación de prueba y producción. Puede seguir los artículos de la guía de inicio rápido para crear un dispositivo IoT Edge en Linux o Windows

Crear una canalización de compilación para la integración continua

En esta sección, creará una nueva canalización de compilación. Configurará la canalización para que se ejecute automáticamente y publique registros de compilación cuando registre cambios en la solución IoT Edge.

  1. Inicie sesión en la organización de Azure DevOps (https://dev.azure.com/{your organization}) y abra el proyecto que contiene el repositorio de la solución de IoT Edge.

    Abrir el proyecto de DevOps

  2. En el menú del panel izquierdo del proyecto, seleccione Canalizaciones. Seleccione Crear canalización en el centro de la página. O bien, si ya tiene canalizaciones de compilación, seleccione el botón Nueva canalización en la parte superior derecha.

    Creación de una canalización de compilación

  3. En la parte inferior de la página ¿Dónde está el código? , seleccione Usar el editor clásico. Si quiere usar YAML para crear las canalizaciones de compilación del proyecto, consulte la guía de YAML.

    Seleccionar Usar el editor clásico

  4. Siga las indicaciones para crear la canalización.

    1. Proporcione la información de origen para la nueva canalización de compilación. Seleccione GIT de Azure Repos como origen y, luego, seleccione el proyecto, el repositorio y la rama donde está ubicado el código de la solución de IoT Edge. Después, seleccione Continuar.

      Seleccione el origen de la canalización

    2. Seleccione Fase vacía en lugar de una plantilla.

      Comenzar con un trabajo vacío para la canalización de compilación

  5. Una vez creada la canalización, irá al editor de canalizaciones. Aquí puede cambiar el nombre de la canalización, el grupo de agentes y la especificación del agente.

    Puede seleccionar un grupo de hosts de Microsoft o un grupo autohospedado que administre.

    En la descripción de la canalización, elija la especificación del agente correcta a partir de la plataforma de destino:

    Configuración de la especificación del agente de compilación

  6. La canalización viene preconfigurada con un trabajo denominado Trabajo del agente 1. Seleccione el signo de más (+) para agregar cuatro tareas al trabajo: Azure IoT Edge dos veces, Copiar archivos una vez y Publicar los artefactos de la compilación una vez. Busque cada tarea y mantenga el mouse sobre el nombre de la tarea para ver el botón Agregar.

    Incorporación de la tarea Azure IoT Edge

    Cuando se hayan agregado las cuatro tareas, el Trabajo del agente se verá similar al ejemplo siguiente:

    Cuatro tareas en la canalización de compilación

  7. Seleccione la primera tarea Azure IoT Edge para editarla. Esta tarea compila todos los módulos de la solución con la plataforma de destino que se especificó. Edite la tarea con los valores siguientes:

    Parámetro Descripción
    Nombre para mostrar El nombre para mostrar se actualiza automáticamente cuando cambia el campo Acción.
    Acción Seleccione Generar imágenes de módulo.
    archivo .template.json Seleccione los puntos suspensivos (...) y navegue hasta el archivo deployment.template.json en el repositorio que contiene la solución de IoT Edge.
    Plataforma predeterminada Seleccione el sistema operativo adecuado para los módulos en función de su dispositivo IoT Edge de destino.
    Variables de salida Proporcione un nombre de referencia para asociarlo a la ruta de acceso del archivo donde se genera el archivo deployment.json, como edge.

    Para más información sobre esta tarea y sus parámetros, consulte Tarea de Azure IoT Edge.

    Estas configuraciones usan el repositorio de imágenes y la etiqueta que se definen en el archivo module.json para asignar un nombre a la imagen del módulo y etiquetarla. Compilar imágenes del módulo también ayuda a reemplazar las variables por el valor exacto que defina en el archivo module.json. En Visual Studio o Visual Studio Code, el valor real se especifica en un archivo .env. En Azure Pipelines, el valor se establece en la pestaña Variables de canalización. Seleccione la pestaña Variables en el menú del editor de la canalización y configure el nombre y el valor de la siguiente manera:

    • ACR_ADDRESS: Valor del servidor de inicio de sesión de Azure Container Registry. El valor del servidor de inicio de sesión está disponible en la página de información general del registro de contenedor en Azure Portal.

    Si tiene otras variables en el proyecto, puede especificar el nombre y el valor en esta pestaña. Build module images (Compilar imágenes del módulo) solo reconoce las variables que están en formato ${VARIABLE}. Asegúrese de usar este formato en los archivos de **/module.json.

  8. Seleccione la segunda tarea Azure IoT Edge para editarla. Esta tarea insertará todas las imágenes del módulo en el registro de contenedor que seleccionó.

    Parámetro Descripción
    Nombre para mostrar El nombre para mostrar se actualiza automáticamente cuando cambia el campo Acción.
    Acción Seleccione Insertar imágenes de módulo.
    Tipo de registro de contenedor Use el tipo predeterminado: Azure Container Registry.
    Suscripción de Azure Elija su suscripción.
    Azure Container Registry Seleccione el tipo de registro de contenedor que usa para almacenar las imágenes del módulo. Dependiendo del tipo de registro que elija, el formulario cambia. Si elige Azure Container Registry, use las listas desplegables para seleccionar la suscripción de Azure y el nombre del registro de contenedor. Si elige Generic Container Registry (Registro de contenedor genérico), seleccione Nuevo para crear una conexión del servicio del registro.
    archivo .template.json Seleccione los puntos suspensivos (...) y navegue hasta el archivo deployment.template.json en el repositorio que contiene la solución de IoT Edge.
    Plataforma predeterminada Seleccione el sistema operativo adecuado para los módulos en función de su dispositivo IoT Edge de destino.
    Agregar credenciales del registro al manifiesto de implementación Especifique true para agregar las credenciales del registro para insertar imágenes de Docker en el manifiesto de implementación.

    Para más información sobre esta tarea y sus parámetros, consulte Tarea de Azure IoT Edge.

    Si tiene varias instancias de Container Registry para hospedar las imágenes del módulo, tiene que duplicar esta tarea, seleccionar otra instancia de Container Registry y usar Omitir módulos en la configuración Avanzada para omitir las imágenes que no son de este registro específico.

  9. Seleccione la tarea Copiar archivos para editarla. Use esta tarea para copiar archivos en el directorio de almacenamiento provisional de artefactos.

    Parámetro Descripción
    Nombre para mostrar Usar el nombre predeterminado o personalizar
    Carpeta de origen Carpeta con los archivos que se van a copiar.
    Contenido Agregue dos líneas: deployment.template.json y **/module.json. Estos dos archivos sirven de entrada para generar el manifiesto de implementación de IoT Edge.
    Carpeta de destino Especifique la variable $(Build.ArtifactStagingDirectory). Consulte las variables de compilación para obtener información acerca de sus descripciones.

    Para más información sobre esta tarea y sus parámetros, consulte Tarea de copia de archivos.

  10. Seleccione la tarea Publicar los artefactos de la compilación para editarla. Proporcione la ruta de acceso del directorio de almacenamiento provisional de artefactos a la tarea para que la ruta de acceso pueda publicarse en la canalización de versión.

    Parámetro Descripción
    Nombre para mostrar Use el nombre predeterminado o personalícelo.
    Ruta de acceso para publicar Especifique la variable $(Build.ArtifactStagingDirectory). Consulte Variables de compilación para obtener más información.
    Nombre del artefacto Use el nombre predeterminado: drop
    Ubicación de publicación de artefactos Use la ubicación predeterminada: Azure Pipelines

    Para más información sobre esta tarea y sus parámetros, consulte Publicar artefactos de compilación.

  11. Abra la pestaña Desencadenadores y marque la casilla para Habilitar la integración continua. Asegúrese de que se incluye la rama que contiene el código.

    Activación del desencadenador de integración continua

  12. Seleccione Guardar en el menú desplegable Guardar y poner en cola

Esta canalización ahora está configurada para ejecutarse automáticamente al insertar código nuevo en el repositorio. La última tarea, la publicación de los artefactos de la canalización, desencadena una canalización de versión. Continúe con la sección siguiente para compilar la canalización de versión.

Creación de una canalización de versión para la implementación continua

En esta sección, se crea una canalización de versión que está configurada para ejecutarse automáticamente cuando la canalización de compilación coloca artefactos, y mostrará los registros de implementación en Azure Pipelines.

Creación de una nueva canalización y adición de una nueva fase:

  1. En la pestaña Versiones, en Canalizaciones, elija + Nueva canalización. O bien, si ya tiene canalizaciones de versión, elija el botón + Nuevo y seleccione + Nueva canalización de versión.

    Adición de una canalización de compilación mediante el botón + Nueva canalización

  2. Cuando se le pida que seleccione una plantilla, elija empezar con una Fase vacía.

    Comenzar con un trabajo vacío para la canalización de versión

  3. La nueva canalización de versión se inicializa con una fase, llamada Fase 1. Cambie el nombre de la fase 1 a dev y trátela como una canalización de implementación continua para el entorno de desarrollo. Por lo general, las canalizaciones de implementación continua tienen varias fases, como desarrollo, almacenamiento provisional y producción. Puede usar distintos nombres y crear más según su práctica de DevOps. Cierre la ventana de detalles de la fase una vez que haya cambiado el nombre.

    También puede cambiar el nombre de la canalización de versión. Para hacerlo, seleccione el texto "Nueva canalización de versión" en la parte superior.

  4. Vincule la versión con los artefactos de compilación que publica la canalización de compilación. Haga clic en Agregar en el área de artefactos.

    Haga clic en Agregar en el área de artefactos de la interfaz

  5. En la página Agregar un artefacto, seleccione Compilación como Tipo de origen. Elija el proyecto y la canalización de compilación que ha creado. Si quiere, puede cambiar el alias de origen por algo más descriptivo. Después, seleccione Agregar.

    En la página Agregar un artefacto, seleccione Agregar para crearlo

  6. Abra los desencadenadores de artefacto y seleccione el botón de alternancia para habilitar el desencadenador de implementación continua. Ahora, se creará una nueva versión cada vez que haya disponible una nueva compilación.

    Abra los desencadenadores de artefacto y seleccione el botón de alternancia para habilitar el desencadenador de implementación continua.

  7. La fase dev está preconfigurada con un trabajo y cero tareas. En el menú de la canalización, seleccione Tareas y, a continuación, elija la fase dev. Seleccione el Trabajo de agente y cambie su Nombre para mostrar por QA. Puede configurar los detalles del trabajo del agente, pero la tarea de implementación no distingue entre plataformas, por lo que puede usar cualquier Especificación del agente del Grupo de agentes seleccionado.

    Ver las tareas de la fase de desarrollo de la pestaña Tareas

  8. En el trabajo QA, seleccione el signo más ( + ) para agregar dos tareas. Busque y agregue Azure IoT Edge dos veces.

  9. Seleccione la primera tarea de Azure IoT Edge y configúrela con los valores siguientes:

    Parámetro Descripción
    Nombre para mostrar El nombre para mostrar se actualiza automáticamente cuando cambia el campo Acción.
    Acción Seleccione Generate deployment manifest.
    archivo .template.json Especifique la ruta de acceso: $(System.DefaultWorkingDirectory)/Drop/drop/deployment.template.json. La ruta de acceso se publica desde la canalización de compilación.
    Plataforma predeterminada Seleccione el sistema operativo adecuado para los módulos en función de su dispositivo IoT Edge de destino.
    Ruta de acceso de resultados especifique la ruta de acceso $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json. Esta es la ruta de acceso del archivo de manifiesto de implementación de IoT Edge final.

    Estas configuraciones ayudan a reemplazar las direcciones URL del módulo en el archivo deployment.template.json. Generate deployment manifest (Generar manifiesto de implementación) también ayuda a reemplazar las variables con el valor exacto que especificó en el archivo deployment.template.json. En VS o VS Code, el valor real se especifica en un archivo .env. En Azure Pipelines, el valor se establece en la pestaña Variables de canalización de versión. Vaya a la pestaña Variables y configure el nombre y valor de la siguiente manera:

    • ACR_ADDRESS: Valor del servidor de inicio de sesión de Azure Container Registry. Puede recuperar el servidor de inicio de sesión en la página de información general del registro de contenedor en Azure Portal.
    • ACR_PASSWORD: la contraseña de Azure Container Registry.
    • ACR_USER: el nombre de usuario de Azure Container Registry.

    Si tiene otras variables en el proyecto, puede especificar el nombre y el valor en esta pestaña. La opción Generar manifiesto de implementación solo puede reconocer las variables del tipo ${VARIABLE}. Asegúrese de que está usando este tipo en los archivos *.template.json.

    "registryCredentials": {
      "<ACR name>": { // Your Azure Container Registry **Registry name** value
        "username": "${ACR_USER}",
        "password": "${ACR_PASSWORD}",
        "address": "${ACR_ADDRESS}"
      }
    }
    

    Configuración de las variables para la canalización de versión en la pestaña Variables

  10. Seleccione la segunda tarea de Azure IoT Edge y configúrela con los valores siguientes:

    Parámetro Descripción
    Nombre para mostrar El nombre para mostrar se actualiza automáticamente cuando cambia el campo Acción.
    Acción Seleccione Deploy to IoT Edge devices.
    Archivo de implementación especifique la ruta de acceso $(System.DefaultWorkingDirectory)/Drop/drop/configs/deployment.json. Esta es la ruta de acceso del archivo de manifiesto de implementación de IoT Edge.
    Suscripción de Azure Seleccione la suscripción que contiene el centro de IoT.
    Nombre de IoT Hub Seleccione IoT Hub.
    Elegir uno o varios dispositivos Elija si quiere que la canalización de versión se implemente en uno o varios dispositivos. Si implementa en un único dispositivo, escriba el IoT Edge device ID (Id. de dispositivo IoT Edge). Si va a implementar en varios dispositivos, especifique la condición de destino del dispositivo. La condición de destino es un filtro para asociar un conjunto de dispositivos de IoT Edge en IoT Hub. Si quiere usar etiquetas de dispositivo como condición, debe actualizar las etiquetas de dispositivo correspondientes con el dispositivo gemelo de IoT Hub. Actualice IoT Edge deployment ID (Id. de implementación de IoT Edge) e IoT Edge deployment priority (Prioridad de implementación de IoT Edge) en la configuración avanzada. Para más información acerca de cómo crear una implementación para varios dispositivos, consulte Descripción de las implementaciones automáticas de IoT Edge.
    Id. de dispositivo o condición de destino En función de la selección anterior, especifique un id. de dispositivo o condición de destino que implementar en varios dispositivos.
    Avanzado Para el id. de implementación de IoT Edge, especifique $(System.TeamProject)-$(Release.EnvironmentName). Esta variable asigna el proyecto y el nombre de la versión con el id. de implementación de IoT Edge.

    Si la tarea implica el uso de una imagen que reside en un registro de confianza de Docker privado que no es visible para la nube pública, puede establecer la variable de entorno SKIP_MODULE_IMAGE_VALIDATION en true para omitir la validación de la imagen.

    Adición de tareas de Azure IoT Edge para la fase de desarrollo

  11. Seleccione Guardar para guardar los cambios en la nueva canalización de versión. Para volver a la vista de canalización, seleccione la pestaña Canalización en el menú.

Nota

Las tareas de Azure IoT Edge en Azure DevOps aún no admiten las implementaciones superpuestas.

Sin embargo, puede usar una tarea de la CLI de Azure en Azure DevOps para crear la implementación por capas. Para el valor Script en línea, puede usar el comando az iot edge deployment create:

az iot edge deployment create -d {deployment_name} -n {hub_name} --content modules_content.json --layered true

Comprobación de CI/CD de IoT Edge con las canalizaciones de compilación y de versión

Para desencadenar un trabajo de compilación, puede insertar una confirmación en el repositorio de código fuente o desencadenarlo manualmente. En esta sección, desencadenará manualmente la canalización de CI/CD para probar que funcione. Luego verifique que la implementación se complete correctamente.

  1. En el menú del panel izquierdo, seleccione Canalizaciones y abra la canalización de compilación que creó al principio de este artículo.

  2. Para desencadenar un trabajo de compilación en la canalización de compilación, puede seleccionar el botón Ejecutar canalización de la parte superior derecha.

    Desencadenar manualmente la canalización de compilación mediante el botón Ejecutar canalización

  3. Revise la configuración de Ejecutar canalización. Luego, seleccione Ejecutar.

    Especificar las opciones de ejecución de la canalización y seleccionar Ejecutar

  4. Seleccione Trabajo de agente 1 para ver el progreso de la ejecución. Puede seleccionar el trabajo para revisar los registros de la salida del trabajo.

    Revisar la salida del registro del trabajo

  5. Si la canalización de compilación se completa correctamente, se desencadena una versión en la fase dev. La versión dev correcta crea una implementación de IoT Edge en los dispositivos IoT Edge de destino.

    Versión de dev

  6. Haga clic en la fase dev para ver los registros de versión.

    Registros de versión

  7. Si se ha generado un error en la canalización, empiece por ver los registros. Para ver los registros, vaya al resumen de ejecución de canalización y seleccione el trabajo y la tarea. Si se ha generado un error en una tarea determinada, compruebe los registros de esa tarea. Para obtener instrucciones detalladas sobre cómo configurar y usar registros, consulte Revisión de registros para diagnosticar problemas de canalización.

Pasos siguientes