Azure Devops:选择要在阶段级别使用的变量组

Azure Devops:选择要在阶段级别使用的变量组,azure,azure-devops,continuous-integration,Azure,Azure Devops,Continuous Integration,为了使代码更简洁,如果我只在需要时引入变量组,那就太好了。目前在我的yaml文件中,我有3个阶段,每个阶段都附带一个条件(每个构建只运行1个阶段)。每个阶段都有自己的变量组,该变量组仅与该阶段相关。当我试图在每个阶段定义变量组时,它都不起作用,我得到一个错误,即无法访问该变量。当我在根级别定义所有组时,这就消失了 我有没有办法定义在阶段级别使用哪些变量组 基本上这就是我现在所拥有的: variables: - group: variable-group-1 - group: variable-

为了使代码更简洁,如果我只在需要时引入变量组,那就太好了。目前在我的yaml文件中,我有3个阶段,每个阶段都附带一个条件(每个构建只运行1个阶段)。每个阶段都有自己的变量组,该变量组仅与该阶段相关。当我试图在每个阶段定义变量组时,它都不起作用,我得到一个错误,即无法访问该变量。当我在根级别定义所有组时,这就消失了

我有没有办法定义在阶段级别使用哪些变量组

基本上这就是我现在所拥有的:

variables:
- group: variable-group-1 
- group: variable-group-2
- group: variable-group-3
- name: some-other-variable
  value: some-value

stages: 
- stage: A
  condition: ...
  jobs:
  - job: A1
  - job: A2

- stage: B
  condition: ...
  jobs:
  - job: B1
  - job: B2

- stage: C
  condition: ...
  jobs:
  - job: C1
  - job: C2
这就是我想要的:

variables:
- name: some-other-variable
  value: some-value

stages: 
- stage: A
  condition: ...
  variables:
  - group: variable-group-1 
  jobs:
  - job: A1
  - job: A2

- stage: B
  condition: ...
  variables:
  - group: variable-group-2
  jobs:
  - job: B1
  - job: B2

- stage: C
  condition: ...
  variables:
  - group: variable-group-3
  jobs:
  - job: C1
  - job: C2
编辑

这是我的yaml的一个简单版本,但仍然失败:

trigger:
- '*'

pool:
  vmImage: macOS-latest

variables:
  - name: sdk
    value: 'iphoneos'
  - name: signingIdentity
    value: 'iPhone Distribution'

stages:
- stage: dev_stage
  variables:
  - group: iOS-dev-pipeline
  - name: configuration
    value: 'Debug'
  jobs:
  - job: dev_build_sign
    steps:
    - task: DownloadSecureFile@1
      name: debugConfig
      displayName: 'Download debug config'
      inputs:
        secureFile: '$(appConfig)'
运行此操作时出现的错误是:

这表明该组可用于所有管道,并包含appConfig


安全文件也可用于所有管道,与Azure管道中的组相同,事实上我们可以在阶段下使用变量。我创建了一个演示yaml,效果很好:

trigger: none

pool:
  name: default

variables:
- name: Test_For_ABC
  value: ABC

stages:
  - stage: A
    variables:
    - group: cmt
    jobs:
      - job: A1
        steps:
        - task: PowerShell@2
          inputs:
            targetType: 'inline'
            script: |
              Write-Host "$(dockerhubuser)"
              Write-Host "$(Test_For_ABC)"
  - stage: B
    variables:
    - group: TestGroup
    jobs:
      - job: B1     
        steps:
        - task: PowerShell@2
          inputs:
            targetType: 'inline'
            script: |
              Write-Host "$(ServiceConnection)"
              Write-Host "$(Test_For_ABC)"

根据您的错误信息,我们建议您可以检查以下信息:

  • 请确保变量组中的变量仅在同一阶段使用
  • 请检查是否在变量组中启用了“允许访问所有管道”选项
  • 此外,您还可以创建两个新的变量组,并使用my test yaml重试

  • 问题不在于变量组,而在于您在以下行中引用的安全文件:

    secureFile: '$(appConfig)'
    
    在Azure Devops中,导航到管道->库,然后选择“安全文件”选项卡。编辑
    appConfig
    变量引用的文件,并启用“授权在所有管道中使用”选项


    或点击“授权资源”“错误消息中的按钮,表示您正在使用该管道授权安全文件。

    我可以重新创建相同的问题。问题似乎在于变量并没有被取消引用,而是被逐字逐句地理解。似乎不可能在引用安全文件的阶段使用范围限定的变量。管道运行时,安全文件下载似乎是作为作业前步骤执行的,因此我猜它是在评估阶段变量之前执行的

    这个问题似乎与此有关。尽管这涉及到经典UI,但基于YAML的管道似乎也存在问题

    我看到了3个备选方案,它们可能合适,也可能不合适,这取决于您的用例

  • 使用一个全局范围的变量,这似乎是可行的
  • 使用文本值作为安全文件名
  • 将安全文件名作为参数传入。如果管道自动触发,则使用有限

  • 谢谢你的回答,但我仍然有同样的问题。我已经用我所做的信息更新了我的问题,并且我已经遵循了你的步骤,但它们仍然不起作用。你看到我遗漏的东西了吗?谢谢你的回答。正如我在问题中所说,appConfig安全文件可用于所有管道。单击“授权资源”按钮似乎只是一次又一次地抛出相同的错误。对不起,是的,您提到安全文件可用于所有管道。我太关注你的截图了。我已经发布了一个备选答案,希望能解释这个问题。谢谢!!!是的,我开始认为我最好的办法是把一切都保持在全球水平。可能会有点混乱,但至少它起作用了
    pool:
      vmImage: ubuntu-latest
    
    variables:
      - name: secureFileName
        value: test.txt
    
    stages:
    - stage: testSecureFileDownload
      variables:
      - group: SecureFileTest
      jobs:
      - job: testSecureFileDownload
        steps:
        - task: DownloadSecureFile@1
          name: secureFileTest
          inputs:
            secureFile: '$(secureFileName)'
    
    pool:
      vmImage: ubuntu-latest
    
    stages:
    - stage: testSecureFileDownload
      variables:
      - group: SecureFileTest
      jobs:
      - job: testSecureFileDownload
        steps:
        - task: DownloadSecureFile@1
          name: secureFileTest
          inputs:
            secureFile: 'test.txt'
    
    parameters:
      - name: secureFileName
        type: string
    
    pool:
      vmImage: ubuntu-latest
    
    variables:
      - name: secureFileName
        value: test.txt
    
    stages:
    - stage: testSecureFileDownload
      variables:
      - group: SecureFileTest
      jobs:
      - job: testSecureFileDownload
        steps:
        - task: DownloadSecureFile@1
          name: secureFileTest
          inputs:
            secureFile: ${{ parameters.secureFileName }}