azure-devops - Azure Devops - 在作业模板之间传递变量

标签 azure-devops azure-pipelines

Azure DevOps yaml 中的普通(非模板)作业支持作业间变量传递,如下所示:

jobs:
- job: A
  steps:
  - script: "echo ##vso[task.setvariable variable=skipsubsequent;isOutput=true]false"
    name: printvar

- job: B
  condition: and(succeeded(), ne(dependencies.A.outputs['printvar.skipsubsequent'], 'true'))
  dependsOn: A
  steps:
  - script: echo hello from B

鉴于模板不支持 dependsOn,我如何在下面做类似的事情句法?我需要从第一个模板获取输出并将其作为“environmentSlice”传递给第二个模板。
- stage: Deploy
  displayName: Deploy stage
  jobs:
  - template: build-templates/get-environment-slice.yml@templates
    parameters:
      configFileLocation: 'config/config.json'

  - template: build-templates/node-app-deploy.yml@templates
    parameters:
      # Build agent VM image name
      vmImageName: $(Common.BuildVmImage)
      environmentPrefix: 'Dev'
      environmentSlice: '-$(dependencies.GetEnvironmentSlice.outputs['getEnvironmentSlice.environmentSlice'])'

我希望将两个模板分开的原因是第二个模板是部署模板,我希望在命名第二个模板中的环境时从第一个模板输入。 IE。 node-app-deploy.yml(第二个模板)的初始部分是:
  jobs:
  - deployment: Deploy
    displayName: Deploy
    # Because we use the environmentSlice to name the environment, we have to have it passed in rather than 
    # extracting it from the config file in steps below
    environment: ${{ parameters.environmentPrefix }}${{ parameters.environmentSlice }}

更新:

接受的解决方案确实允许您在单独的模板之间传递变量,但不适用于我的特定用例。我希望能够动态命名第二个模板的“环境”部分,即 environment: ${{ parameters.environmentPrefix }}${{ parameters.environmentSlice }} ,但这只能静态命名,因为模板是在管道启动时编译的。

该解决方案的缺点是它在模板之间引入了隐藏的耦合。我更喜欢调用管道来协调模板之间的参数传递。

最佳答案

您可以申请 depend ondependency variable成模板。

请参阅以下示例:

为了让示例更清楚,这里有2个模板文件,一个是azure-pipelines-1.yml ,另一个是 azure-pipeline-1-copy.yml .

azure-pipelines-1.yml , 指定环境值作为输出变量:

parameters:
  environment: ''
jobs:
- job: preDeploy
  variables:
    EnvironmentName: preDeploy-${{ parameters.environment }}
  steps:
  - checkout: none
  - pwsh: |
      echo "##vso[task.setvariable variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"
    name: outputVars

然后,在 azure-pipeline-1-copy.yml 使用依赖来获取这个输出变量:
jobs:
- job: deployment
  dependsOn: preDeploy
  variables:
    EnvironmentNameCopy: $[dependencies.preDeploy.outputs['outputVars.EnvironmentName']]
  steps:
  - checkout: none
  - pwsh: |
      Write-Host "$(EnvironmentNameCopy)"
    name: outputVars

最后,在 YAML 管道 ,只需要传递环境值
stages:
  - stage: deployQA
    jobs:
    - template: azure-pipelines-1.yml
      parameters:
        environment: FromTemplate1
    - template: azure-pipeline-1-copy.yml

现在,您可以在第二个模板作业中看到该值成功获取:

enter image description here

关于azure-devops - Azure Devops - 在作业模板之间传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59038584/

相关文章:

.net - 如何将 .NET 标准库打包/发布到私有(private) VSTS Nuget 提要?

.net-core - VSTS 版本 : Packages failed to restore - Unable to resolve 'NETStandard.Library (>= 1.6.1)' for '.NETStandard,Version=v2.0'

c# - 错误 MSB1003 : Specify a project or solution file. 使用 azure 构建管道并且找不到 csproj 文件

tfs - VssClientCredentials 在 VSTS 身份验证中具有 accesstoken 凭据

azure-devops - 在 Visual Studio Team Services 中可以免费拥有的项目数量是否有限制?

code-coverage - 发布代码覆盖率在 TFS 2015/Visual Studio Team Services(以前是 VS Online)中不起作用

.net - Azure 管道 : Notification on Job failure

azure - 如何在 Azure DevOps 中获取 keyvault secret 输出

git - 如何从 .gitignore 中列出的存储库中删除文件而不更改空格

powershell - Azure DevOps发布管道-在括号内使用Powershell和管道变量