通过变量访问下载的安全文件

问题描述 投票:0回答:1

我的 Azure DevOps 管道有一个模板,它可以下载多个安全文件。在同一个模板(和同一个作业)中,执行 bash 脚本的另一个任务应该逐一访问每个安全文件下载并访问安全文件以执行操作。

但是,我在这里遇到了麻烦。假设我通过名为“downloadTask”的任务下载了一个安全文件。如果我随后通过

$(downloadTask.secureFilPath)
访问 secureFilePath,效果会很好。

但是,在我的例子中,任务名称是在 for 循环中引用的,如下所示:

for taskName in $taskNames; do
    echo $(${taskName}.secureFilePath)

当我尝试运行此命令时,出现以下错误:

downloadTask.secureFilePath: command not found
。我对导致此错误的问题感到困惑,并且没有变得更加明智。

我应该做出哪些调整来解决这个问题?

编辑 - 添加管道代码:

parameters:
  - name: credentials
    type: string
  - name: secureFileNames
    type: object
    default: []

steps:
  - ${{ each secureFileName in parameters.secureFileNames }}:
    - task: DownloadSecureFile@1
      displayName: 'Download secure file: ${{ secureFileName }}'
      name: ${{ replace(secureFileName, '.', '_') }}
      inputs:
        secureFile: '${{ secureFileName }}'

  - task: AWSShellScript@1
    displayName: 'someDisplayName'
    inputs:
      awsCredentials: ${{ parameters.credentials }}
      regionName: $(DEFAULT_REGION)
      scriptType: 'inline'
      inlineScript: |
        secureFileNames="${{ join(' ', parameters.secureFileNames) }}"
        sanitizedTaskNames=${secureFileNames//./_}
 
        for taskName in $sanitizedTaskNames; do
          echo "$(${taskName}.secureFileName)"
        done
        
bash azure-devops azure-pipelines
1个回答
0
投票

假设有以下安全文件:

Secure files

我能够创建一个动态列出文件的管道。

代码不太漂亮,但可以用。

parameters:
  - name: secureFiles
    type: object
    default:
      - name: foo
        secureFileName: foo.txt
      - name: bar
        secureFileName: bar.txt

trigger: none

pool: 
  vmImage: 'ubuntu-latest'

steps:
  - checkout: none

  - ${{ each secureFile in parameters.secureFiles }}:
    - task: DownloadSecureFile@1
      displayName: 'Download secure file: ${{ secureFile.name }}'
      name: ${{ secureFile.name }}
      inputs:
        secureFile: '${{ secureFile.secureFileName }}'

    - script: |
        cat "$(${{ secureFile.name }}.secureFilePath)"
      displayName: 'Display secure file content: ${{ secureFile.name }}'

    # This works too - secure files are download to $(Agent.TempDirectory) by default
    - script: |
        cat "$(Agent.TempDirectory)/${{ secureFile.secureFileName }}"
      displayName: 'Display secure file content: ${{ secureFile.name }}'

  - script: |
      files="${{ join(' ', parameters.secureFiles.*.secureFileName) }}"

      for file in $files; do
        echo "Path of secure file $file: $(Agent.TempDirectory)/$file"
      done
    displayName: 'Display all secure files path'

备注:

  • 我使用的是一个对象,而不是一个带有安全文件的名称和路径的简单数组,这使得在任务中使用它们变得更容易,而无需清理路径:
  - name: secureFiles
    type: object
    default:
      - name: foo
        secureFileName: foo.txt
      - name: bar
        secureFileName: bar.txt
  • 安全文件默认下载到
    $(Agent.TempDirectory)
    ,因此我们可以利用它来简化脚本
© www.soinside.com 2019 - 2024. All rights reserved.