Tarea de DevOps del servicio Azure Image BuilderAzure Image Builder Service DevOps Task

En este artículo se explica cómo usar una tarea de Azure DevOps para insertar artefactos de compilación en una imagen de máquina virtual, para que pueda instalar y configurar la aplicación y el sistema operativo.This article shows you how to use an Azure DevOps task to inject build artifacts into a VM image so you can install and configure your application and OS.

Versiones de la tarea de DevOpsDevOps Task versions

Hay dos tareas de DevOps de Azure VM Image Builder (AIB):There are two Azure VM Image Builder (AIB) DevOps Tasks:

  • Tarea de AIB "estable": esta es la última compilación estable que se ha probado y la telemetría no muestra incidencias.'Stable' AIB Task, this is the latest stable build that has been tested, and telemetry shows no issues.

  • Tarea de AIB "inestable": nos permite agregar las últimas actualizaciones y características, permitir a los clientes probarlas antes de promocionarlas a la tarea "estable".'Unstable' AIB Task, this allows us to put in the latest updates and features, allow customers to test them, before we promote it to the 'stable' task. Si no se ha notificado ningún problema y los datos de telemetría no muestran ningún problema, aproximadamente una semana después, promocionaremos el código de la tarea a "estable".If there are no reported issues, and our telemetry shows no issues, approximately 1 week later, we will promote the task code to 'stable'.

PrerrequisitosPrerequisites

  • Instale la tarea de DevOps estable de Visual Studio Marketplace.Install the Stable DevOps Task from Visual Studio Marketplace.

  • Debe tener una cuenta de VSTS DevOps y una canalización de compilación creada.You must have a VSTS DevOps account, and a Build Pipeline created

  • Registre y habilite los requisitos de las características de Image Builder en la suscripción que usan las canalizaciones:Register and enable the Image Builder feature requirements in the subscription used by the pipelines:

  • Cree una cuenta de Azure Storage estándar en el grupo de recursos de la imagen de origen; puede usar otras cuentas de almacenamiento o grupo de recursos.Create a Standard Azure Storage Account in the source image Resource Group, you can use other Resource Group/Storage accounts. La cuenta de almacenamiento se usa para transferir los artefactos de compilación de la tarea de DevOps a la imagen.The storage account is used transfer the build artifacts from the DevOps task to the image.

    # Az PowerShell
    $timeInt=$(get-date -UFormat "%s")
    $storageAccName="aibstorage"+$timeInt
    $location=westus
    # create storage account and blob in resource group
    New-AzStorageAccount -ResourceGroupName $strResourceGroup -Name $storageAccName -Location $location -SkuName Standard_LRS
    
    # Az CLI
    location=westus
    scriptStorageAcc=aibstordot$(date +'%s')
    # create storage account and blob in resource group
    az storage account create -n $scriptStorageAcc -g $strResourceGroup -l $location --sku Standard_LRS
    

Adición de la tarea a la canalización de versiónAdd Task to Release Pipeline

Seleccione Canalización de versión > Editar.Select Release Pipeline > Edit

En el agente de usuario, seleccione + para agregarlo y, a continuación, busque Image Builder.On the User Agent, select + to add then search for Image Builder. Seleccione Agregar.Select Add.

Establezca las propiedades de la tarea siguientes:Set the following task properties:

Suscripción de AzureAzure Subscription

En el menú desplegable, seleccione la suscripción donde desea que se ejecute Image Builder.Select from the drop-down menu which subscription you want the Image Builder to run. Use la misma suscripción en la que se encuentran las imágenes de origen y donde se distribuyen las imágenes.Use the same subscription where your source images are located and where the images are to be distributed. Debe autorizar el acceso de colaborador de Image Builder a la suscripción o al grupo de recursos.You need to authorize the image builder contributor access to the Subscription or Resource Group.

Grupo de recursosResource Group

Use el grupo de recursos donde se almacenará el artefacto de plantilla de imagen temporal.Use the resource group where the temporary image template artifact will be stored. Al crear un artefacto de plantilla, se crea un grupo de recursos IT_<DestinationResourceGroup>_<TemplateName>_guid de Image Builder temporal adicional.When creating a template artifact, an additional temporary Image Builder resource group IT_<DestinationResourceGroup>_<TemplateName>_guid is created. El grupo de recursos temporal almacena los metadatos de la imagen, como scripts.The temporary resource group stores the image metadata, such as scripts. Al final de la tarea, se eliminan el artefacto de la plantilla de imagen y el grupo de recursos de Image Builder temporal.At the end of the task, the image template artifact and temporary Image Builder resource group is deleted.

LocationLocation

La ubicación es la región donde se ejecutará Image Builder.The location is the region where the Image Builder will run. Solo se admite un número establecido de regiones.Only a set number of regions are supported. Las imágenes de origen deben estar presentes en esta ubicación.The source images must be present in this location. Por ejemplo, si usa Shared Image Gallery, debe existir una réplica en esa región.For example, if you are using Shared Image Gallery, a replica must exist in that region.

Identidad administrada (requerida)Managed Identity (Required)

Image Builder requiere una identidad administrada, que se usa para leer imágenes personalizadas de origen, conectarse a Azure Storage y crear imágenes personalizadas.Image Builder requires a Managed Identity, which it uses to read source custom images, connect to Azure Storage, and create custom images. Obtenga más información aquí.See here for more details.

Compatibilidad de redes virtualesVNET Support

Actualmente, la tarea de DevOps no permite especificar una subred existente; está en la hoja de ruta, pero si desea utilizar una red virtual existente, puede usar una plantilla de ARM, con una plantilla de Image Builder anidada dentro de ella; vea los ejemplos de la plantilla de Image Builder con Windows sobre cómo se consigue, o bien use AZ AIB PowerShell.Currently the DevOps task does not support specifying an existing Subnet, this is on the roadmap, but if you want to utilize an existing VNET, you can use an ARM template, with an Image Builder template nested inside, please see the Windows Image Builder template examples on how this is achieved, or alternatively use AZ AIB PowerShell.

SourceSource

Las imágenes de origen debe ser del sistema operativo de Image Builder compatible.The source images must be of the supported Image Builder OSs. Puede elegir imágenes personalizadas existentes en la misma región desde la que se ejecuta Image Builder:You can choose existing custom images in the same region as Image Builder is running from:

  • Imagen administrada: debe pasar el identificador de recurso, por ejemplo:Managed Image - You need to pass in the resourceId, for example:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • Azure Shared Image Gallery: debe pasar el identificador de recurso de la versión de la imagen, por ejemplo:Azure Shared Image Gallery - You need to pass in the resourceId of the image version, for example:

    /subscriptions/$subscriptionID/resourceGroups/$sigResourceGroup/providers/Microsoft.Compute/galleries/$sigName/images/$imageDefName/versions/<versionNumber>
    

    Si necesita obtener la última versión de Shared Image Gallery, puede tener una tarea AZ PowerShell o AZ CLI antes de que obtenga la última versión y establezca una variable de DevOps.If you need to get the latest Shared Image Gallery version, you can have an AZ PowerShell or AZ CLI task before that will get the latest version and set a DevOps variable. Use la variable en la tarea AZ VM de DevOps de Image Builder.Use the variable in the AZ VM Image Builder DevOps task. Para obtener más información, vea los ejemplos.For more information, see the examples.

  • Imagen base (Marketplace): hay una lista desplegable de imágenes populares; estas siempre usarán la "última" versión de los sistemas operativos compatibles.(Marketplace) Base Image There is a drop-down list of popular images, these will always use the 'latest' version of the supported OS's.

    Si la imagen base no está en la lista, puede especificar la imagen exacta mediante Publisher:Offer:Sku.If the base image is not in the list, you can specify the exact image using Publisher:Offer:Sku.

    Versión de la imagen base (opcional): puede proporcionar la versión de la imagen que desea usar; el valor predeterminado es latest.Base Image Version (optional) - You can supply the version of the image you want to use, default is latest.

PersonalizarCustomize

AprovisionadorProvisioner

Inicialmente, se admiten dos personalizadores: Shell y PowerShell.Initially, two customizers are supported - Shell and PowerShell. Solo se admite la inserción.Only inline is supported. Si desea descargar scripts, puede pasar comandos insertados para hacerlo.If you want to download scripts, then you can pass inline commands to do so.

En el sistema operativo, seleccione PowerShell o Shell.For your OS, select PowerShell or Shell.

Tarea de Windows UpdateWindows Update Task

Solo para Windows, la tarea ejecuta Windows Update al final de las personalizaciones.For Windows only, the task runs Windows Update at the end of the customizations. Controla los reinicios necesarios.It handles the required reboots.

Se ejecuta la siguiente configuración de Windows Update:The following Windows Update configuration is executed:

    "type": "WindowsUpdate",
    "searchCriteria": "IsInstalled=0",
    "filters": [
        "exclude:$_.Title -like '*Preview*'",
        "include:$true"

Instala las actualizaciones de Windows importantes y recomendadas que no están en versión preliminar.It installs important and recommended Windows Updates that are not preview.

Control de los reiniciosHandling Reboots

Actualmente, la tarea de DevOps no admite el reinicio de las compilaciones de Windows; si intenta reiniciar con el código de PowerShell, se producirá un error en la compilación.Currently the DevOps task does not have support for rebooting Windows builds, if you try to reboot with PowerShell code, the build will fail. Sin embargo, puede usar código para reiniciar las compilaciones de Linux.However, you can use code to reboot Linux builds.

Ruta de acceso de compilaciónBuild Path

La tarea está diseñada para poder insertar artefactos de versión de compilación de DevOps en la imagen.The task is designed to be able to inject DevOps Build release artifacts into the image. Para realizar este trabajo, debe configurar una canalización de compilación.To make this work, you need to set up a build pipeline. En la configuración de la canalización de versión, debe agregar el repositorio de los artefactos de compilación.In the setup of the release pipeline, you must add the repo of the build artifacts.

Seleccionar Agregar un artefacto en la canalización de versión

Seleccione el botón Ruta de acceso de compilación para elegir la carpeta de compilación que desea colocar en la imagen.Select the Build Path button to choose the build folder you want to be placed on the image. La tarea de Image Builder copia todos los archivos y directorios que contiene.The Image Builder task copies all files and directories within it. Cuando se crea la imagen, Image Builder implementa los archivos y directorios en diferentes rutas de acceso, en función del sistema operativo.When the image is being created, Image Builder deploys the files and directories into different paths, depending on OS.

Importante

Al agregar un artefacto de repositorio, es posible que el directorio tenga como prefijo un guion bajo _ .When adding a repo artifact, you may find the directory is prefixed with an underscore _. El guion bajo puede producir problemas con los comandos insertados.The underscore can cause issues with the inline commands. Use las comillas adecuadas en los comandos.Use the appropriate quotes in the commands.

En los ejemplos siguientes se explica cómo funciona:The following example explains how this works:

Una estructura de directorio que muestra la jerarquía

  • Windows: existen archivos en C:\.Windows - Files exist in C:\. Se crea un directorio denominado buildArtifacts que incluye el directorio webapp.A directory named buildArtifacts is created which includes the webapp directory.

  • Linux: existen archivos en /tmp.Linux - Files exist in /tmp. Se crea el directorio webapp que incluye todos los archivos y directorios.The webapp directory is created which includes all files and directories. Debe trasladar los archivos de este directorio.You must move the files from this directory. De lo contrario, se eliminarán, ya que se encuentra en el directorio temporal.Otherwise, they will be deleted since it is in the temporary directory.

Script de personalización insertadoInline customization script

  • Windows: puede escribir comandos insertados de PowerShell separados por comas.Windows - You can enter PowerShell inline commands separated by commas. Si desea ejecutar un script en el directorio de compilación, puede usar:If you want to run a script in your build directory, you can use:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    

    Puede hacer referencia a varios scripts o agregar más comandos, por ejemplo:You can reference multiple scripts, or add more commands, for example:

    & 'c:\buildArtifacts\webapp\webconfig.ps1'
    & 'c:\buildArtifacts\webapp\installAgent.ps1'
    
  • Linux: en los sistemas Linux, los artefactos de compilación se colocan en el directorio /tmp.Linux - On Linux systems the build artifacts are put into the /tmp directory. Sin embargo, en muchos sistemas operativos Linux, al reiniciar, se elimina el contenido del directorio /tmp.However, on many Linux OSs, on a reboot, the /tmp directory contents are deleted. Si desea que los artefactos existan en la imagen, debe crear otro directorio y copiarlos.If you want the artifacts to exist in the image, you must create another directory and copy them over. Por ejemplo:For example:

    sudo mkdir /lib/buildArtifacts
    sudo cp -r "/tmp/_ImageBuilding/webapp" /lib/buildArtifacts/.
    

    Si está de acuerdo con el directorio "/tmp", puede usar el código siguiente para ejecutar el script.If you are ok using the "/tmp" directory, then you can use the code below to execute the script.

    # grant execute permissions to execute scripts
    sudo chmod +x "/tmp/_ImageBuilding/webapp/coreConfig.sh"
    echo "running script"
    sudo . "/tmp/AppsAndImageBuilderLinux/_WebApp/coreConfig.sh"
    

¿Qué ocurre con los artefactos de compilación después de la compilación de la imagen?What happens to the build artifacts after the image build?

Nota

Image Builder no quita automáticamente los artefactos de compilación; se recomienda encarecidamente que siempre tenga código para quitar los artefactos de compilación.Image Builder does not automatically remove the build artifacts, it is strongly suggested that you always have code to remove the build artifacts.

  • Windows: Image Builder implementa archivos en el directorio c:\buildArtifacts.Windows - Image builder deploys files to the c:\buildArtifacts directory. El directorio se conserva y debe quitarlo.The directory is persisted you must remove the directory. Puede quitarlo en el script que se ejecuta.You can remove it in the script you execute. Por ejemplo:For example:

    # Clean up buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts\*" -Force -Recurse
    
    # Delete the buildArtifacts directory
    Remove-Item -Path "C:\buildArtifacts" -Force 
    
  • Linux: los artefactos de compilación se colocan en el directorio /tmp.Linux - The build artifacts are put into the /tmp directory. Sin embargo, en muchos sistemas operativos Linux, al reiniciar, se elimina el contenido del directorio /tmp.However, on many Linux OSs, on a reboot, the /tmp directory contents are deleted. Se sugiere que tenga código para quitar el contenido y no basarse para ello en el sistema operativo.It is suggested that you have code to remove the contents and not rely on the OS to remove the contents. Por ejemplo:For example:

    sudo rm -R "/tmp/AppsAndImageBuilderLinux"
    

Longitud total de la compilación de la imagenTotal length of image build

La longitud total no se puede cambiar todavía en la tarea de canalización de DevOps.Total length cannot be changed in the DevOps pipeline task yet. Utiliza el valor predeterminado de 240 minutos.It uses the default of 240 minutes. Si desea aumentar buildTimeoutInMinutes, puede usar una tarea AZ CLI en la canalización de versión.If you want to increase the buildTimeoutInMinutes, then you can use an AZ CLI task in the Release Pipeline. Configure la tarea para copiar una plantilla y enviarla.Configure the task to copy a template and submit it. Para obtener un ejemplo, vea esta solución o use Az PowerShell.For an example, see this solution, or use Az PowerShell.

Cuenta de almacenamientoStorage Account

Seleccione la cuenta de almacenamiento que creó en los requisitos previos.Select the storage account you created in the prerequisites. Si no la ve en la lista, Image Builder no tiene permisos para ello.If you do not see it in the list, Image Builder does not have permissions to it.

Cuando se inicia la compilación, Image Builder creará un contenedor denominado imagebuilder-vststask.When the build starts, Image Builder will create a container called imagebuilder-vststask. El contenedor es donde se almacenan los artefactos de compilación del repositorio.The container is where the build artifacts from the repo are stored.

Nota

Debe eliminar manualmente la cuenta de almacenamiento o el contenedor después de cada compilación.You need to manually delete the storage account or container after each build.

DistribuciónDistribute

Se admiten tres tipos de distribución.There are 3 distribute types supported.

Imagen administradaManaged Image

  • ResourceID:ResourceID:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/images/<imageName>
    
  • UbicacionesLocations

Shared Image Gallery ya debe existir.The Shared Image Gallery must already exist.

  • ResourceID:ResourceID:

    /subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>
    
  • Regiones: lista de regiones, separadas por comas.Regions: list of regions, comma separated. Por ejemplo, westus, eastus y centralusFor example, westus, eastus, centralus

VHDVHD

No se pueden pasar valores aquí; Image Builder emitirá el disco duro virtual al grupo de recursos de Image Builder temporal, IT_<DestinationResourceGroup>_<TemplateName>, en el contenedor vhds.You cannot pass any values to this, Image Builder will emit the VHD to the temporary Image Builder resource group, IT_<DestinationResourceGroup>_<TemplateName>, in the vhds container. Cuando se inicia la compilación de versión, Image Builder emite registros.When you start the release build, image builder emits logs. Cuando haya terminado, emitirá la dirección URL del disco duro virtual.When it has finished, it will emit the VHD URL.

Configuración opcionalOptional Settings

  • Tamaño de máquina virtual: puede reemplazar el tamaño de la máquina virtual, a partir del valor predeterminado Standard_D1_v2.VM Size - You can override the VM size, from the default of Standard_D1_v2. Puede reemplazar para reducir el tiempo total de personalización o porque desea crear las imágenes que dependen de ciertos tamaños de máquina virtual, como GPU/HPC, etc.You may override to reduce total customization time, or because you want to create the images that depend on certain VM sizes, such as GPU / HPC etc.

FuncionamientoHow it works

Al crear la versión, la tarea crea un contenedor en la cuenta de almacenamiento, denominado imagebuilder-vststask.When you create the release, the task creates a container in the storage account, named imagebuilder-vststask. Comprime y carga los artefactos de compilación y crea un token de SAS para el archivo ZIP.It zips and uploads your build artifacts and creates a SAS Token for the zip file.

La tarea utiliza las propiedades que se pasan a la tarea para crear el artefacto de plantilla de Image Builder.The task uses the properties passed to the task to create the Image Builder Template artifact. La tarea realiza lo siguiente:The task does the following:

  • Descarga el archivo ZIP del artefacto de compilación y cualquier otro script asociado.Downloads the build artifact zip file and any other associated scripts. Los archivos se guardan en una cuenta de almacenamiento en el grupo de recursos IT_<DestinationResourceGroup>_<TemplateName> de Image Builder temporal.The files are saved in a storage account in the temporary Image Builder resource group IT_<DestinationResourceGroup>_<TemplateName>.
  • Crea una plantilla con el prefijo t_ y un entero de 10 dígitos monotónico.Creates a template prefixed t_ and a 10-digit monotonic integer. La plantilla se guarda en el grupo de recursos seleccionado.The template is saved to the resource group you selected. La plantilla existe mientras dure la compilación en el grupo de recursos.The template exists for the duration of the build in the resource group.

Salida de ejemplo:Example output:

start reading task parameters...
found build at:  /home/vsts/work/r1/a/_ImageBuilding/webapp
end reading parameters
getting storage account details for aibstordot1556933914
created archive /home/vsts/work/_temp/temp_web_package_21475337782320203.zip
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
template name:  t_1556938436xxx
starting put template...

Cuando se inicia la compilación de la imagen, el estado de ejecución se muestra en los registros de versión:When the image build starts, the run status is reported in the release logs:

starting run template...

Cuando se complete la compilación de la imagen, verá un texto similar al siguiente:When the image build completes, you see output similar to following text:

2019-05-06T12:49:52.0558229Z starting run template...
2019-05-06T13:36:33.8863094Z run template:  Succeeded
2019-05-06T13:36:33.8867768Z getting runOutput for  SharedImage_distribute
2019-05-06T13:36:34.6652541Z ==============================================================================
2019-05-06T13:36:34.6652925Z ## task output variables ##
2019-05-06T13:36:34.6658728Z $(imageUri) =  /subscriptions/<subscriptionID>/resourceGroups/aibwinsig/providers/Microsoft.Compute/galleries/my22stSIG/images/winWAppimages/versions/0.23760.13763
2019-05-06T13:36:34.6659989Z ==============================================================================
2019-05-06T13:36:34.6663500Z deleting template t_1557146959485...
2019-05-06T13:36:34.6673713Z deleting storage blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip
2019-05-06T13:36:34.9786039Z blob imagebuilder-vststask\webapp/18-1/webapp_1557146958741.zip is deleted
2019-05-06T13:38:37.4884068Z delete template:  Succeeded

La plantilla de imagen y IT_<DestinationResourceGroup>_<TemplateName> se eliminan.The image template and IT_<DestinationResourceGroup>_<TemplateName> is deleted.

Puede adoptar la variable de VSTS "$(imageUri)" y usarla en la tarea siguiente o simplemente usar el valor y crear una máquina virtual.You can take the '$(imageUri)' VSTS variable and use it in the next task or just use the value and build a VM.

Variables de DevOps de salidaOutput DevOps Variables

Pub/oferta/SKU/Versión de la imagen de marketplace de origen:Pub/offer/SKU/Version of the source marketplace image:

  • $(pirPublisher)$(pirPublisher)
  • $(pirOffer)$(pirOffer)
  • $(pirSku)$(pirSku)
  • $(pirVersion)$(pirVersion)

URI de imagen: el identificador de recurso de la imagen distribuida:Image URI - The ResourceID of the distributed image:

  • $(imageUri)$(imageUri)

Preguntas más frecuentesFAQ

¿Se puede usar una plantilla de imagen existente que ya se he creado, fuera de DevOps?Can I use an existing image template I have already created, outside of DevOps?

De momento, no.Currently, not at this time.

¿Se puede especificar el nombre de la plantilla de imagen?Can I specify the image template name?

No.No. Se usa un nombre de plantilla único y luego se elimina.A unique template name is used and then deleted.

Image Builder genera un error.The image builder failed. ¿Cómo se puede solucionar el problema?How can I troubleshoot?

Si se produce un error de compilación, la tarea de DevOps no elimina el grupo de recursos de almacenamiento provisional.If there is a build failure, the DevOps task does not delete the staging resource group. Puede acceder al grupo de recursos de almacenamiento provisional que contiene el registro de personalización de compilación.You can access the staging resource group that contains the build customization log.

Verá un error en el registro de DevOps de la tarea de VM Image Builder y verá la ubicación del archivo customization.log.You will see an error in the DevOps log for the VM Image Builder task, and see the customization.log location. Por ejemplo:For example:

Ejemplo de error de la tarea de DevOps

Para más información sobre la solución de problemas, vea Solución de problemas del servicio Azure Image Builder.For more information on troubleshooting, see Troubleshoot Azure Image Builder Service.

Después de investigar el error, puede eliminar el grupo de recursos de almacenamiento provisional.After investigating the failure, you can delete the staging resource group. En primer lugar, elimine el artefacto de recurso de la plantilla de imagen.First, delete the Image Template Resource artifact. El artefacto tiene el prefijo t_ y se puede encontrar en el registro de compilación de la tarea de DevOps:The artifact is prefixed with t_ and can be found in the DevOps task build log:

...
Source for image:  { type: 'SharedImageVersion',
  imageVersionId: '/subscriptions/<subscriptionID>/resourceGroups/<rgName>/providers/Microsoft.Compute/galleries/<galleryName>/images/<imageDefName>/versions/<imgVersionNumber>' }
...
template name:  t_1556938436xxx
...

El artefacto de recurso de la plantilla de imagen está en el grupo de recursos especificado inicialmente en la tarea.The Image Template resource artifact is in the resource group specified initially in the task. Cuando haya terminado de solucionar problemas, elimine el artefacto.When you're done troubleshooting delete the artifact. Si va a realizar la eliminación desde Azure Portal, dentro del grupo de recursos, seleccione Mostrar tipos ocultos para ver el artefacto.If deleting using the Azure portal, within the resource group, select Show Hidden Types, to view the artifact.

Pasos siguientesNext steps

Para más información, vea Introducción a Azure Image Builder.For more information, see Azure Image Builder overview.