无法在 Azure Pipelines 中有条件地下载安全文件
Unable to download secure files conditionally in Azure Pipelines
问题
我正在使用 DownloadSecureFile@1 任务来下载安全文件。
在 Azure DevOps 中,库的安全文件部分中仅存在 file_A.txt 时会出现此问题。
当两个文件都存在时,脚本可以正常工作。
在我的例子中,用户 A 只需要 file_A.txt,用户 B 只需要 file_B.txt。
这是预期的行为吗?任何可能的解决方法来满足用例?
错误信息:
存在资源授权问题:“管道无效。作业作业:步骤文件 B 输入 secureFile 引用无法找到的安全文件 file_B.txt。安全文件不存在或未被授权使用。对于授权详情,参考https://aka.ms/yamlauthz."
代码:
parameters:
- name: file_name
type: string
default: ''
values:
- file_A.txt
- file_B.txt
pool:
vmImage: ubuntu-latest
steps:
- task: DownloadSecureFile@1
displayName: Download File A
condition: eq('${{ parameters.file_name }}', 'file_A.txt')
name: fileA
inputs:
secureFile: 'file_A.txt'
- task: DownloadSecureFile@1
displayName: Download file B
condition: eq('${{ parameters.file_name }}', 'file_B.txt')
name: fileB
inputs:
secureFile: 'file_B.txt'
如 use parameters to determine what steps run
中所述,您可以使用 if 语句环绕步骤,而不是在任务上使用条件
parameters:
- name: file_name
type: string
default: ''
values:
- file_A.txt
- file_B.txt
pool:
vmImage: ubuntu-latest
steps:
- ${{ if eq(parameters.file_name, 'file_A.txt') }}:
- task: DownloadSecureFile@1
displayName: Download File A
name: fileA
inputs:
secureFile: 'file_A.txt'
- ${{ if eq(parameters.file_name, 'file_B.txt') }}:
- task: DownloadSecureFile@1
displayName: Download file B
name: fileB
inputs:
secureFile: 'file_B.txt'
但是,如果每个用户只需要一个文件,一个常见(且更清晰)的选项是提供所需文件的名称作为参数。如果不需要安全文件(即参数默认为空),可以使用 if 语句排除该步骤
parameters:
- name: file_name
type: string
default: ''
values:
- file_A.txt
- file_B.txt
pool:
vmImage: ubuntu-latest
steps:
- ${{ if ne(parameters.file_name, '') }}:
- task: DownloadSecureFile@1
displayName: Download Secure File
name: secureFileDownload
inputs:
secureFile: '${{ parameters.file_name }}'
Is this an expected behavior?
是的,这是预期的行为。要将管道变成 运行,Azure Pipelines 按以下顺序执行几个步骤:
- 首先,展开模板并对模板表达式求值。
- 接下来,评估阶段级别的依赖关系以选择第一个
运行.
阶段
- 对于选择到 运行 的每个阶段,会发生两件事:
- 收集并验证所有作业中使用的所有资源
授权 运行.
- 评估工作级别的依赖关系以选择第一个工作
运行.
- 对于选择到 运行 的每个作业,展开多配置(策略:矩阵
或策略:在 YAML 中并行)到多个 运行 时间作业。
- 对于每个 运行time 作业,评估条件以决定该作业是否
有资格运行.
- 为每个符合条件的 运行 定时工作请求代理。
因此,您的安全文件将在评估条件之前下载。请参阅有关 Pipeline run sequence 的文档。作为解决方法,您可以参考@danielorn 分享的示例。
问题 我正在使用 DownloadSecureFile@1 任务来下载安全文件。 在 Azure DevOps 中,库的安全文件部分中仅存在 file_A.txt 时会出现此问题。 当两个文件都存在时,脚本可以正常工作。
在我的例子中,用户 A 只需要 file_A.txt,用户 B 只需要 file_B.txt。 这是预期的行为吗?任何可能的解决方法来满足用例?
错误信息: 存在资源授权问题:“管道无效。作业作业:步骤文件 B 输入 secureFile 引用无法找到的安全文件 file_B.txt。安全文件不存在或未被授权使用。对于授权详情,参考https://aka.ms/yamlauthz."
代码:
parameters:
- name: file_name
type: string
default: ''
values:
- file_A.txt
- file_B.txt
pool:
vmImage: ubuntu-latest
steps:
- task: DownloadSecureFile@1
displayName: Download File A
condition: eq('${{ parameters.file_name }}', 'file_A.txt')
name: fileA
inputs:
secureFile: 'file_A.txt'
- task: DownloadSecureFile@1
displayName: Download file B
condition: eq('${{ parameters.file_name }}', 'file_B.txt')
name: fileB
inputs:
secureFile: 'file_B.txt'
如 use parameters to determine what steps run
中所述,您可以使用 if 语句环绕步骤,而不是在任务上使用条件parameters:
- name: file_name
type: string
default: ''
values:
- file_A.txt
- file_B.txt
pool:
vmImage: ubuntu-latest
steps:
- ${{ if eq(parameters.file_name, 'file_A.txt') }}:
- task: DownloadSecureFile@1
displayName: Download File A
name: fileA
inputs:
secureFile: 'file_A.txt'
- ${{ if eq(parameters.file_name, 'file_B.txt') }}:
- task: DownloadSecureFile@1
displayName: Download file B
name: fileB
inputs:
secureFile: 'file_B.txt'
但是,如果每个用户只需要一个文件,一个常见(且更清晰)的选项是提供所需文件的名称作为参数。如果不需要安全文件(即参数默认为空),可以使用 if 语句排除该步骤
parameters:
- name: file_name
type: string
default: ''
values:
- file_A.txt
- file_B.txt
pool:
vmImage: ubuntu-latest
steps:
- ${{ if ne(parameters.file_name, '') }}:
- task: DownloadSecureFile@1
displayName: Download Secure File
name: secureFileDownload
inputs:
secureFile: '${{ parameters.file_name }}'
Is this an expected behavior?
是的,这是预期的行为。要将管道变成 运行,Azure Pipelines 按以下顺序执行几个步骤:
- 首先,展开模板并对模板表达式求值。
- 接下来,评估阶段级别的依赖关系以选择第一个 运行. 阶段
- 对于选择到 运行 的每个阶段,会发生两件事:
- 收集并验证所有作业中使用的所有资源
授权 运行. - 评估工作级别的依赖关系以选择第一个工作 运行.
- 收集并验证所有作业中使用的所有资源
- 对于选择到 运行 的每个作业,展开多配置(策略:矩阵 或策略:在 YAML 中并行)到多个 运行 时间作业。
- 对于每个 运行time 作业,评估条件以决定该作业是否 有资格运行.
- 为每个符合条件的 运行 定时工作请求代理。
因此,您的安全文件将在评估条件之前下载。请参阅有关 Pipeline run sequence 的文档。作为解决方法,您可以参考@danielorn 分享的示例。