无法在 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 按以下顺序执行几个步骤:

  1. 首先,展开模板并对模板表达式求值。
  2. 接下来,评估阶段级别的依赖关系以选择第一个 运行.
  3. 阶段
  4. 对于选择到 运行 的每个阶段,会发生两件事:
    • 收集并验证所有作业中使用的所有资源
      授权 运行.
    • 评估工作级别的依赖关系以选择第一个工作 运行.
  5. 对于选择到 运行 的每个作业,展开多配置(策略:矩阵 或策略:在 YAML 中并行)到多个 运行 时间作业。
  6. 对于每个 运行time 作业,评估条件以决定该作业是否 有资格运行.
  7. 为每个符合条件的 运行 定时工作请求代理。

因此,您的安全文件将在评估条件之前下载。请参阅有关 Pipeline run sequence 的文档。作为解决方法,您可以参考@danielorn 分享的示例。