我的 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
假设有以下安全文件:
我能够创建一个动态列出文件的管道。
代码不太漂亮,但可以用。
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)
,因此我们可以利用它来简化脚本