使用 Azure DevOps CLI 管理变量组中的变量

Azure DevOps Services

在 Azure Pipelines 中管理变量对于在 CI/CD 工作流中保持灵活性和安全性至关重要。 本指南演示如何使用 Azure DevOps CLI 在 Azure Pipelines 变量组中创建和管理机密和非机密变量。 通过使用变量组,可以集中管理变量并确保安全地处理敏感信息。

本指南中的示例介绍如何:

  • 使用存储在 GitHub 中的 YAML 文件定义 Azure Pipelines 管道。
  • 创建包含机密变量和非机密变量的变量组。
  • 使用 Azure DevOps CLI 执行管道,并监视运行处理和输出。

注意

此示例使用变量组降级 Azure DevOps CLI 的功能。 为了提高安全性,请在 Pipelines UI 中的变量组中定义变量,或将变量组链接到 Azure Key Vault 中的机密

先决条件

保存管道 YAML 文件

将以下 YAML 管道定义另存为 GitHub 存储库的根目录和 分支中名为 azure-pipelines.ymlmain 的文件。

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)

示例脚本

此示例执行以下任务:

  • 创建 DevOps 资源
  • 运行管道
  • 修改变量值三次
  • 每次更改变量值时再次运行管道

该脚本在 Azure DevOps 中创建以下资源:

  • DevOps 组织中的项目
  • GitHub 服务连接
  • 管道
  • 包含两个非机密变量和一个机密变量的变量组

在运行脚本之前,请替换以下占位符,具体如下:

  • <devops-organization> Azure DevOps 组织名称
  • <github-organization> GitHub 组织名称或用户名
  • <github-repository> GitHub 存储库名称
  • <pipelinename> 管道的名称,介于 3-19 个字符之间,仅包含数字和小写字母。 脚本会添加五位数的唯一标识符。

在本地环境中保存 GitHub PAT。

AZURE_DEVOPS_EXT_GITHUB_PAT=<your-github-pat>

将 YAML 文件存储在 GitHub 中后,在 Cloud Shell 的 Bash shell 中或本地运行以下 Azure DevOps CLI 脚本。

#!/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:"

清理资源

为了避免产生 Azure 项目费用,可以删除示例项目,该示例项目也会删除其资源。

从以下命令的输出复制示例项目的 id

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

通过运行以下命令删除项目:

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

通过运行以下命令清理本地环境:

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

Azure CLI 参考

本文中的示例使用以下 Azure CLI 命令: