【问题标题】:Unable to download secure files conditionally in Azure Pipelines无法在 Azure Pipelines 中有条件地下载安全文件
【发布时间】:2021-01-18 15:45:56
【问题描述】:

问题 我正在使用 DownloadSecureFile@1 任务下载安全文件。 在 Azure DevOps 中,库的安全文件部分中仅存在 file_A.txt 时会出现此问题。 当两个文件都存在时,脚本可以正常工作。

在我的例子中,用户 A 只需要 file_A.txt,用户 B 只需要 file_B.txt。 这是预期的行为吗?任何可能的解决方法来满足用例?

错误信息: 存在资源授权问题:“管道无效。作业作业:步骤 fileB 输入安全文件引用安全文件 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'    

【问题讨论】:

    标签: azure-devops azure-pipelines azure-pipelines-tasks


    【解决方案1】:

    这是预期的行为吗?

    是的,这是预期的行为。要将管道转变为运行,Azure Pipelines 按以下顺序执行多个步骤:

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

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

    【讨论】:

      【解决方案2】:

      您可以使用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 }}'          
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-05
        • 2020-11-06
        • 2021-02-06
        • 2012-06-05
        • 1970-01-01
        • 2020-12-05
        相关资源
        最近更新 更多