Ejercicio: Adición de una tarea de implementación de Bicep a la canalización

Completado

Ha creado una canalización básica y ha configurado los entornos de Azure y Azure Pipelines para que se conecten entre sí. Ahora está listo para implementar el archivo de Bicep del sitio web en Azure desde la canalización.

En este ejercicio, aprenderá a:

  • Agregue un archivo de Bicep al repositorio.
  • Agregue un paso de canalización para implementar el archivo de Bicep.
  • Vuelva a ejecutar la canalización y compruebe que se ha implementado correctamente el sitio web.

Adición del archivo de Bicep del sitio web al repositorio de Git

Ya ha preparado el archivo de Bicep del sitio web. Puede usar ese archivo para implementar diferentes configuraciones de los recursos del sitio web, en función del entorno y la configuración. Aquí, se agrega el archivo de Bicep al repositorio.

  1. Abra el Explorador de Visual Studio Code.

  2. En la carpeta deploy, cree un nuevo archivo de nombre main.bicep. Asegúrese de crear el archivo en la carpeta deploy, no en la raíz del repositorio:

    Captura de pantalla del Explorador de Visual Studio Code, con el archivo main.bicep resaltado y ubicado en la carpeta deploy.

  3. Copie el siguiente código en el archivo main.bicep:

    @description('The Azure region into which the resources should be deployed.')
    param location string = resourceGroup().location
    
    @description('The type of environment. This must be nonprod or prod.')
    @allowed([
      'nonprod'
      'prod'
    ])
    param environmentType string
    
    @description('Indicates whether to deploy the storage account for toy manuals.')
    param deployToyManualsStorageAccount bool
    
    @description('A unique suffix to add to resource names that need to be globally unique.')
    @maxLength(13)
    param resourceNameSuffix string = uniqueString(resourceGroup().id)
    
    var appServiceAppName = 'toy-website-${resourceNameSuffix}'
    var appServicePlanName = 'toy-website-plan'
    var toyManualsStorageAccountName = 'toyweb${resourceNameSuffix}'
    
    // Define the SKUs for each component based on the environment type.
    var environmentConfigurationMap = {
      nonprod: {
        appServicePlan: {
          sku: {
            name: 'F1'
            capacity: 1
          }
        }
        toyManualsStorageAccount: {
          sku: {
            name: 'Standard_LRS'
          }
        }
      }
      prod: {
        appServicePlan: {
          sku: {
            name: 'S1'
            capacity: 2
          }
        }
        toyManualsStorageAccount: {
          sku: {
            name: 'Standard_ZRS'
          }
        }
      }
    }
    
    var toyManualsStorageAccountConnectionString = deployToyManualsStorageAccount ? 'DefaultEndpointsProtocol=https;AccountName=${toyManualsStorageAccount.name};EndpointSuffix=${environment().suffixes.storage};AccountKey=${toyManualsStorageAccount.listKeys().keys[0].value}' : ''
    
    resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
      name: appServicePlanName
      location: location
      sku: environmentConfigurationMap[environmentType].appServicePlan.sku
    }
    
    resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
      name: appServiceAppName
      location: location
      properties: {
        serverFarmId: appServicePlan.id
        httpsOnly: true
        siteConfig: {
          appSettings: [
            {
              name: 'ToyManualsStorageAccountConnectionString'
              value: toyManualsStorageAccountConnectionString
            }
          ]
        }
      }
    }
    
    resource toyManualsStorageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = if (deployToyManualsStorageAccount) {
      name: toyManualsStorageAccountName
      location: location
      kind: 'StorageV2'
      sku: environmentConfigurationMap[environmentType].toyManualsStorageAccount.sku
    }
    
  4. Guarde los cambios en el archivo.

  5. En el terminal de Visual Studio Code, ejecute este código para agregar los cambios al “stage”, confirmarlos e insertarlos en el repositorio:

    git add deploy/main.bicep
    git commit -m 'Add Bicep file'
    git push
    

Reemplazo de los pasos de canalización

A continuación, actualice la definición de la canalización para implementar el archivo de Bicep en Azure usando la conexión de servicio.

  1. En Visual Studio Code, abra el archivo deploy/azure-pipelines.yml.

  2. Antes de la línea jobs:, agregue variables: para definir una variable denominada deploymentDefaultLocation:

    trigger: none
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
    - name: deploymentDefaultLocation
      value: westus3
    
    jobs:
    
  3. Para quitar el paso script de la definición de la canalización, elimine las dos últimas líneas del archivo.

    Sugerencia

    Al trabajar en Visual Studio Code después de instalar la extensión de Azure Pipelines, pruebe a usar la combinación de teclas Ctrl + Espacio. Muestra un menú contextual con elementos sugeridos para agregar en la posición actual del cursor.

  4. En la parte inferior del archivo, agregue una tarea que use la tarea AzureResourceManagerTemplateDeployment para implementar el archivo de Bicep:

    jobs:
    - job:
      steps:
    
      - task: AzureResourceManagerTemplateDeployment@3
        inputs:
          connectedServiceName: $(ServiceConnectionName)
          deploymentName: $(Build.BuildNumber)
          location: $(deploymentDefaultLocation)
          resourceGroupName: $(ResourceGroupName)
          csmFile: deploy/main.bicep
          overrideParameters: >
            -environmentType $(EnvironmentType)
            -deployToyManualsStorageAccount $(DeployToyManualsStorageAccount)
    

    Nota:

    Es recomendable que escriba este código en lugar de copiarlo y pegarlo desde este módulo. Preste atención a la sangría del archivo. Si la sangría no es correcta, el archivo YAML no será válido. Visual Studio Code indica los errores con líneas onduladas.

    En este paso, se usa la variable del sistema $(Build.BuildNumber) para dar nombre a la implementación. La variable puede ayudar a ver fácilmente a qué canalización corresponde una implementación.

    La tarea AzureResourceManagerTemplateDeployment requiere la propiedad de tarea location. Especifica la región de Azure en la que se debe crear un grupo de recursos. En este ejercicio, ya ha creado un grupo de recursos, por lo que la ubicación que especifique aquí no importa. Pero debe proporcionar el valor de todos modos. En este caso, se establece en el valor de la variable deploymentDefaultLocation que estableció en un paso anterior.

  5. Guarde los cambios en el archivo. El archivo debería tener un aspecto similar al de este ejemplo:

    trigger: none
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
    - name: deploymentDefaultLocation
      value: westus3
    
    jobs:
    - job:
      steps:
    
      - task: AzureResourceManagerTemplateDeployment@3
        inputs:
          connectedServiceName: $(ServiceConnectionName)
          deploymentName: $(Build.BuildNumber)
          location: $(deploymentDefaultLocation)
          resourceGroupName: $(ResourceGroupName)
          csmFile: deploy/main.bicep
          overrideParameters: >
            -environmentType $(EnvironmentType)
            -deployToyManualsStorageAccount $(DeployToyManualsStorageAccount)
    
  6. En el terminal de Visual Studio Code, agregue los cambios al “stage”, confírmelos en el repositorio e insértelos en Azure Repos:

    git add deploy/azure-pipelines.yml
    git commit -m 'Add deployment task to pipeline'
    git push
    

Adición de variables de canalización

  1. En el explorador, seleccione Pipelines.

    Captura de pantalla de Azure DevOps que muestra el menú, con Pipelines resaltado.

  2. Seleccione su canalización.

    Captura de pantalla de Azure DevOps que muestra la lista de canalizaciones, con la canalización toy-website resaltada.

  3. Seleccione Editar.

    Captura de pantalla de Azure DevOps que muestra la canalización, con el botón Editar resaltado.

  4. Seleccione Variables.

    Captura de pantalla de Azure DevOps que muestra el editor para la canalización, con el botón Variables resaltado.

  5. Seleccione Nueva variable.

    Captura de pantalla de Azure DevOps que muestra el editor para la canalización, con el botón “Nueva variable” resaltado.

  6. En Nombre, escriba ServiceConnectionName. En Valor, escriba ToyWebsite.

    Deje las casillas desactivadas y seleccione Aceptar.

    Captura de pantalla de Azure DevOps que muestra el editor de variables de la canalización, con el botón Aceptar resaltado.

  7. Para crear más variables, seleccione +.

    Captura de pantalla de Azure DevOps que muestra la lista de variables de la canalización, con el botón Más resaltado.

    Cree las siguientes variables de la misma manera que creó la variable ServiceConnectionName:

    Nombre de la variable Valor
    ResourceGroupName ToyWebsite
    EnvironmentType nonprod
  8. Realice los pasos de nuevo para crear una variable denominada DeployToyManualsStorageAccount con el valor true. Para esta variable, seleccione la casilla Permitir que los usuarios invaliden este valor al ejecutar esta canalización.

    Captura de pantalla de Azure DevOps que muestra el editor de variables de la canalización.

  9. Cuando haya creado las cuatro variables, seleccione Guardar.

    Captura de pantalla de Azure DevOps que muestra el editor de variables de la canalización, con el botón Guardar resaltado.

Ejecución de la canalización

Ya está listo para ejecutar la canalización.

La plantilla incluye una cuenta de almacenamiento que el equipo del sitio web utiliza para almacenar los manuales de instrucciones de los juguetes. Puesto que sigue probando el entorno, no es necesario implementar la cuenta de almacenamiento cada vez que implemente el sitio web. Por eso, ha creado un parámetro de Bicep para controlar si la cuenta de almacenamiento está implementada. En este caso se ejecuta la canalización y se invalida la implementación para no tener que implementar la cuenta de almacenamiento esta vez.

  1. Seleccione Run (Ejecutar).

    Captura de pantalla de Azure DevOps que muestra la canalización, con el botón Ejecutar resaltado.

    Aparece el panel Ejecutar canalización. En este panel, puede configurar las opciones de esta ejecución específica de la canalización.

  2. Seleccione Variables.

    Captura de pantalla de Azure DevOps que muestra la página “Ejecutar canalización”, con la opción de menú Variables resaltada.

  3. Seleccione la variable DeployToyManualsStorageAccount y cámbiele el valor a false. Después, seleccione Actualizar.

    Captura de pantalla de Azure DevOps que muestra el editor de variables para “Ejecutar canalización”, con el botón Actualizar resaltado.

  4. Seleccione la flecha atrás.

    Captura de pantalla de Azure DevOps que muestra la página “Ejecutar canalización”, con la flecha atrás resaltada.

  5. Para iniciar una nueva ejecución de la canalización, seleccione Ejecutar. La canalización puede tardar unos minutos en iniciarse. Una vez que se inicia la canalización, la implementación puede tardar unos minutos en finalizar.

  6. Para abrir el trabajo, en la sección Trabajos, seleccione Trabajo. Puede supervisar el trabajo mientras se ejecuta, o bien esperar hasta que se complete para revisar su historial.

    espere a que el trabajo finalice.

  7. Seleccione Trabajo.

    Captura de pantalla de Azure DevOps que muestra la página Trabajos con la opción de menú Trabajo resaltada.

  8. Seleccione 1 variable de tiempo de cola utilizada.

    Captura de pantalla de Azure DevOps que muestra el registro de la canalización, con el elemento

    Se muestra el valor invalidado de esta ejecución de canalización. El valor de la variable DeployToyManualsStorageAccount es false porque invalidó el valor original.

  9. Inspeccione el resto de la salida de la canalización.

    La canalización muestra una implementación correcta.

Comprobación de la implementación

  1. Vaya a Azure Portal.

  2. En el menú de la izquierda, seleccione Grupos de recursos.

  3. Seleccione ToyWebsite.

  4. Mire el estado de la implementación en Información general. Como puede ver, una implementación se ha realizado correctamente.

    Captura de pantalla de Azure Portal que muestra el grupo de recursos con una implementación correcta.

  5. Seleccione 1 correcta para ver los detalles de la implementación.

    Captura de pantalla de Azure Portal que muestra el historial de implementaciones del grupo de recursos, con la implementación resaltada.

    El nombre de la implementación es el mismo que el de la ejecución de la canalización.

  6. Para ver qué recursos se han implementado, seleccione la implementación. Para expandir la implementación y ver más detalles, seleccione Detalles de la implementación. En este caso, hay un plan de Azure App Service y una aplicación.

    Captura de pantalla de Azure Portal que muestra los detalles de la implementación del grupo de recursos, con los recursos de App Service resaltados.