Administración de variables en grupos de variables con la CLI de Azure DevOps

Azure DevOps Services

La administración de variables en Azure Pipelines es fundamental para mantener la flexibilidad y la seguridad en los flujos de trabajo de CI/CD. En esta guía se muestra cómo usar la CLI de Azure DevOps para crear y administrar variables secretas y no secretas dentro de un grupo de variables de Azure Pipelines. Mediante el uso de grupos de variables, puede centralizar la administración de variables y asegurarse de que la información confidencial se controla de forma segura.

Con el ejemplo de esta guía, aprenderá a:

  • Definir una canalización de Azure Pipelines mediante un archivo YAML almacenado en GitHub.
  • Crear un grupo de variables que contenga variables secretas y no secretas.
  • Ejecutar la canalización mediante la CLI de Azure DevOps y supervisar el procesamiento y la salida de la ejecución.

Nota:

En este ejemplo se muestra la funcionalidad de la CLI de Azure DevOps con grupos de variables. Para aumentar la seguridad, defina variables en grupos de variables en la interfaz de usuario de Canalizaciones o vincule un grupo de variables a secretos en Azure Key Vault.

Requisitos previos

Guardar el archivo YAML de canalización

Guarde la siguiente definición de canalización de YAML como un archivo denominado azure-pipelines.yml en el directorio raíz y la rama main del repositorio de GitHub.

parameters:
- name: image
  displayName: 'Pool image'
  default: ubuntu-latest
  values:
  - windows-latest
  - windows-latest
  - ubuntu-latest
  - ubuntu-latest
  - macOS-latest
  - macOS-latest
- name: test
  displayName: Run Tests?
  type: boolean
  default: false

variables:
- group: "Contoso Variable Group"
- name: va
  value: $[variables.a]
- name: vb
  value: $[variables.b]
- name: vcontososecret
  value: $[variables.contososecret]

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
- script: |
    echo "Hello, world!"
    echo "Pool image: ${{ parameters.image }}"
    echo "Run tests? ${{ parameters.test }}"
  displayName: 'Show runtime parameter values'

- script: |
    echo "a=$(va)"
    echo "b=$(vb)"
    echo "contososecret=$(vcontososecret)"
    echo
    echo "Count up to the value of the variable group's nonsecret variable *a*:"
    for number in {1..$(va)}
    do
        echo "$number"
    done
    echo "Count up to the value of the variable group's nonsecret variable *b*:"
    for number in {1..$(vb)}
    do
        echo "$number"
    done
    echo "Count up to the value of the variable group's secret variable *contososecret*:"
    for number in {1..$(vcontososecret)}
    do
        echo "$number"
    done
  displayName: 'Test variable group variables (secret and nonsecret)'
  env:
    SYSTEM_ACCESSTOKEN: $(System.AccessToken)

El script de ejemplo

Este código de ejemplo realiza las tareas siguientes:

  • Creación de los recursos de DevOps
  • Ejecución de la canalización
  • Modificación de los valores de variable tres veces
  • Nueva ejecución de la canalización cada vez que se cambian los valores de variable

El script crea los siguientes recursos en Azure DevOps:

  • Un proyecto en su organización de DevOps
  • Una conexión del servicio de GitHub
  • Una canalización
  • Un grupo de variables con dos variables no secretas y una variable secreta

Antes de ejecutar el script, reemplace los siguientes marcadores de posición de la siguiente manera:

  • <devops-organization> Nombre de su organización de Azure DevOps
  • <github-organization> Nombre de usuario o de su organización de GitHub
  • <github-repository> Nombre de su repositorio de GitHub
  • <pipelinename> Nombre de la canalización que tiene entre 3 y 19 caracteres y solo contiene números y letras minúsculas. El script agrega un identificador único de cinco dígitos.

Guarde el PAT de GitHub en el entorno local.

AZURE_DEVOPS_EXT_GITHUB_PAT=<your-github-pat>

Después de almacenar el archivo YAML en GitHub, ejecute el siguiente script de la CLI de Azure DevOps en un shell de Bash en Cloud Shell o localmente.

#!/bin/bash

# Provide placeholder variables.
devopsOrg="https://dev.azure.com/<devops-organization>"
githubOrg="<github-organization>"
githubRepo="<github-repository>"
pipelineName="<pipelinename>"
repoName="$githubOrg/$githubRepo"
repoType="github"
branch="main"

# Declare other variables.
uniqueId=$RANDOM
devopsProject="Contoso DevOps Project $uniqueId"
serviceConnectionName="Contoso Service Connection $uniqueId"

# Sign in to Azure CLI and follow the sign-in instructions, if necessary.
echo "Sign in."
az login

# Sign in to Azure DevOps with your Azure DevOps PAT, if necessary.
echo "Sign in to Azure DevOps."
az devops login

# Create the Azure DevOps project and set defaults.
projectId=$(az devops project create \
    --name "$devopsProject" --organization "$devopsOrg" --visibility private --query id)
projectId=${projectId:1:-1}  # Just set to GUID; drop enclosing quotes.
az devops configure --defaults organization="$devopsOrg" project="$devopsProject"
pipelineRunUrlPrefix="$devopsOrg/$projectId/_build/results?buildId="

# Create GitHub service connection.
githubServiceEndpointId=$(az devops service-endpoint github create \
    --name "$serviceConnectionName" --github-url "https://www.github.com/$repoName" --query id)
githubServiceEndpointId=${githubServiceEndpointId:1:-1}  # Just set to GUID; drop enclosing quotes.

# Create the pipeline.
pipelineId=$(az pipelines create \
    --name "$pipelineName" \
    --skip-first-run \
    --repository $repoName \
    --repository-type $repoType \
    --branch $branch \
    --service-connection $githubServiceEndpointId \
    --yml-path azure-pipelines.yml \
    --query id)

# Create a variable group with 2 non-secret variables and 1 secret variable.
# (contososecret < a < b). Then run the pipeline.
variableGroupId=$(az pipelines variable-group create \
    --name "$variableGroupName" --authorize true --variables a=12 b=29 --query id)
az pipelines variable-group variable create \
    --group-id $variableGroupId --name contososecret --secret true --value 17
pipelineRunId1=$(az pipelines run --id $pipelineId --open --query id)
echo "Go to the pipeline run's web page to view the output results of the 'Test variable group variables' job for the 1st run."
echo "If the web page doesn't automatically appear, go to:"
echo "    ${pipelineRunUrlPrefix}${pipelineRunId1}"
read -p "Press Enter to change the value of one of the variable group's nonsecret variables, then run again:"

# Change the value of one of the variable group's nonsecret variables.
az pipelines variable-group variable update \
    --group-id $variableGroupId --name a --value 22
pipelineRunId2=$(az pipelines run --id $pipelineId --open --query id)
echo "Go to the pipeline run's web page to view the output results of the 'Test variable group variables' job for the 2nd run."
echo "If the web page doesn't automatically appear, go to:"
echo "    ${pipelineRunUrlPrefix}${pipelineRunId2}"
read -p "Press Enter to change the value of the variable group's secret variable, then run once more:"

# Change the value of the variable group's secret variable.
az pipelines variable-group variable update \
    --group-id $variableGroupId --name contososecret --value 35
pipelineRunId3=$(az pipelines run --id $pipelineId --open --query id)
echo "Go to the pipeline run's web page to view the output results of the 'Test variable group variables' job for the 3rd run."
echo "If the web page doesn't automatically appear, go to:"
echo "    ${pipelineRunUrlPrefix}${pipelineRunId3}"
read -p "Press Enter to continue:"

Limpieza de recursos

Para evitar incurrir en cargos para el proyecto de Azure, puede eliminar el proyecto de ejemplo, que también elimina su recurso.

Copie el id del proyecto de ejemplo de la salida del comando siguiente:

az devops project list --org <your-organization>

Elimine el proyecto ejecutando el siguiente comando:

az devops project delete --id <project-id> --org <your-organization> --yes

Limpie el entorno local mediante la ejecución de los siguientes comandos:

export AZURE_DEVOPS_EXT_GITHUB_PAT=""
az devops configure --defaults organization="" project=""

Referencias de la CLI de Azure

En el ejemplo de este artículo se usan los siguientes comandos de la CLI de Azure: