Azure Devops:选择要在阶段级别使用的变量组
Azure Devops: Selecting which variable group to use at the stage level
为了代码更简洁,如果能只在需要的时候引入变量组就好了。目前在我的 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)'
我在 运行 时遇到的错误是:
Error message
这表明该组可用于所有管道,并且包含 appConfig
Variable Group Declaration
安全文件也可用于所有管道,与组相同
在Azure Pipeline中,其实我们可以使用stage下的变量。我创建了一个演示 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)"
根据您的错误信息,我们建议您可以查看以下信息:
- 请确保您的变量组中的变量仅在同一阶段使用。
- 请检查您是否在变量组中启用了选项 'Allow access to all pipelines'。
- 此外,您可以创建两个新的变量组并使用我的测试 yaml 再试一次。
问题不在于变量组,而是您在以下行中引用的安全文件:
secureFile: '$(appConfig)'
在 Azure Devops 中,导航到管道 -> 库,然后select“安全文件”选项卡。编辑 appConfig
变量引用的文件,并启用“授权在所有管道中使用”选项。
或者单击错误消息中的“授权资源”按钮,您将仅使用该管道授权安全文件。
我可以重现同样的问题。问题似乎是该变量没有被取消引用,而是被逐字地引用。似乎无法在该阶段使用范围限定的变量来引用安全文件。当管道为 运行 时,看起来安全文件下载是作为作业前步骤执行的,所以我猜它是在评估阶段变量之前执行的。
该问题似乎与此 github issue 有关。虽然这指的是经典 UI,但它似乎也是基于 YAML 的管道的问题。
我看到 3 个备选方案,它们可能适合也可能不适合,具体取决于您的用例。
- 使用全局范围的变量,这似乎有效。
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 }}
为了代码更简洁,如果能只在需要的时候引入变量组就好了。目前在我的 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)'
我在 运行 时遇到的错误是: Error message
这表明该组可用于所有管道,并且包含 appConfig Variable Group Declaration
安全文件也可用于所有管道,与组相同
在Azure Pipeline中,其实我们可以使用stage下的变量。我创建了一个演示 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)"
根据您的错误信息,我们建议您可以查看以下信息:
- 请确保您的变量组中的变量仅在同一阶段使用。
- 请检查您是否在变量组中启用了选项 'Allow access to all pipelines'。
- 此外,您可以创建两个新的变量组并使用我的测试 yaml 再试一次。
问题不在于变量组,而是您在以下行中引用的安全文件:
secureFile: '$(appConfig)'
在 Azure Devops 中,导航到管道 -> 库,然后select“安全文件”选项卡。编辑 appConfig
变量引用的文件,并启用“授权在所有管道中使用”选项。
或者单击错误消息中的“授权资源”按钮,您将仅使用该管道授权安全文件。
我可以重现同样的问题。问题似乎是该变量没有被取消引用,而是被逐字地引用。似乎无法在该阶段使用范围限定的变量来引用安全文件。当管道为 运行 时,看起来安全文件下载是作为作业前步骤执行的,所以我猜它是在评估阶段变量之前执行的。
该问题似乎与此 github issue 有关。虽然这指的是经典 UI,但它似乎也是基于 YAML 的管道的问题。
我看到 3 个备选方案,它们可能适合也可能不适合,具体取决于您的用例。
- 使用全局范围的变量,这似乎有效。
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 }}