如何参数化 Azure DevOps 部署 YAML 管道以部署到多个环境

All*_* Xu 2 azure azure-devops azure-pipelines-tasks azure-pipelines-yaml

我有一个 Azure DevOps 部署 YAML 管道,用于创建 Azure 应用服务并向其部署代码。实际的管道更复杂,但我针对这个问题将其简化。

目前,我的管道可以使用变量中定义的资源名称成功部署到特定的 Azure 订阅(服务连接器)。

我需要对管道进行参数化,以便它可以使用多个服务连接器部署到多个不同的环境(指 Azure 订阅)。每个环境都有不同的 Azure 资源命名约定。

有没有办法从 XML 或 JSON 文件读取管道变量的值?这样,我可以为每个环境拥有多个配置文件,并将它们存储为我的存储库的一部分。

这是多环境部署管道配置的正确方法吗?

Tho*_*mas 5

您可以使用变量模板。还有另一个有趣的链接:了解有关模板变量重用的更多信息

这里我有这个平面文件夹结构(为了示例的清晰度):

.
|  deploy-app.job.yaml
|  deploy-app.pipeline.yaml
|  variables.dev.yaml
|  variables.prod.yaml
Run Code Online (Sandbox Code Playgroud)

所以在这里我们尝试reusable使用不同的变量集运行作业deploy-app.job.yaml。

我在每个variable.{env}.yaml文件中定义了一些变量

.
|  deploy-app.job.yaml
|  deploy-app.pipeline.yaml
|  variables.dev.yaml
|  variables.prod.yaml
Run Code Online (Sandbox Code Playgroud)

deploy-app.job.yaml文件接受一个允许注入变量模板的参数:

# variables.dev.yaml
variables:
  vmImage: ubuntu-20.04
  serviceConnection: dev-service-connection

# variables.prod.yaml
variables:
  vmImage: ubuntu-20.04
  serviceConnection: prod-service-connection

Run Code Online (Sandbox Code Playgroud)

在主管道中,我可以创建不同的阶段并注入所需的变量:

# deploy-app.job.yaml
parameters:
- name: envVariablesTemplate
  type: string

jobs:
- deployment: deploy
  variables:
  # Inject the verianle template here
  - template: ${{ parameters.envVariablesTemplate }}
  pool:
    # Use the variable from the template
    vmImage: ${{ variables.vmImage }}
  strategy:
    runOnce:
      deploy:
        steps:
        - task: AzureCLI@2
          displayName: Hello from azure cli
          inputs:
            # Use the variable from the template
            azureSubscription: ${{ variables.serviceConnection }}
            scriptType: pscore
            scriptLocation: inlineScript
            inlineScript: echo 'Hello from azure cli'

Run Code Online (Sandbox Code Playgroud)

根据您的需要,您可以添加多个变量模板,具有命名约定等。这完全取决于您并取决于管道的复杂性。