Azure 管道 foreach 循环
Azure pipeline foreach loop
我在找出这个管道中的问题时遇到了一些问题。
我有一个 GitHub 存储库,其中包含一个名为 dist
的文件夹。这个文件夹里面有多个文件和文件夹。这是我的 git 集线器的结构:
├── README.md
├── client_pipeline.yaml
├── client_template.yaml
└── dist
├── ReportPhishingOutlookAddIn.xml
└── ReportPhishingOutlookAddInWeb
├── Content
├── Dialog.html
├── Functions
├── Images
└── Scripts
我想做的是,当我在此存储库中创建一个新文件夹时,我的管道应该触发并上传此新文件夹中的 dist 文件夹内容并将其保存在 azure 存储中。
所以我决定先使用 Azure 管道模板来定义管道的逻辑:
Client_template.yaml
parameters:
storageaccount: ''
client: []
steps:
- ${{ each client in parameters.client }}:
- task: AzureCLI@2
displayName: 'Azure CLI'
inputs:
AzureSubscription: '<mysubscription>'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az storage blob upload-batch --source dist --destination '$web/${client}' --account-name ${{ parameters.storageaccount}} --output table --no-progress
然后我创建了另一个管道来调用这个模板。
client_pipeline.yaml
variables:
- name: storageaccount
value: <mystorageaccount>
steps:
- template: client_template.yaml
parameters:
storageaccount: ${{ variables.storageaccount }}
client: ["folder","folder1"]
我使用它的第二个管道让我可以自由添加任意数量的客户端,管道应该只在 azure 存储帐户中创建它们。
当我 运行 我的管道时,它可以毫无问题地构建所有内容,但是当我进入我的存储帐户时,我遇到了 2 个问题。
第一个是文件夹名称是${client}
而不是我在数组中指定的名称的实际名称。
第二个问题是上传,只上传主文件夹和子文件夹none。
请大家帮忙?
编辑:
我解决了问题 1,现在我可以创建多个文件夹。
但它仍然没有复制 dist
内文件夹中的所有子文件夹和文件
参考这个话题:https://github.com/Azure/azure-cli/issues/5420#issuecomment-487169413,
az storage azcopy blob upload
-c containerName
--account-name accountName
-s directory/path
-d upload/path
如果需要上传子文件夹,可以加上标志--recursive
。
因此,您可以有一个递归标志,设置后将上传子目录。在 az storage blob upload-batch 中包含 --recursive
标志会上传子目录。例如 az storage blob upload-batch -d <container name> -s <path/to/directory> --recursive
。不包括递归标志将只上传特定目录的文件。
更新>>
由于 Nayden 已通过使用上传批处理解决了此问题。如果子文件夹为空,它将被忽略并且不会被复制。一旦我们将一些文件放入所有子文件夹中,上传批处理就会在没有任何额外标志的情况下进行递归复制。
在此发帖,以便遇到相同问题的其他社区成员可以快速找到答案。
我在找出这个管道中的问题时遇到了一些问题。
我有一个 GitHub 存储库,其中包含一个名为 dist
的文件夹。这个文件夹里面有多个文件和文件夹。这是我的 git 集线器的结构:
├── README.md
├── client_pipeline.yaml
├── client_template.yaml
└── dist
├── ReportPhishingOutlookAddIn.xml
└── ReportPhishingOutlookAddInWeb
├── Content
├── Dialog.html
├── Functions
├── Images
└── Scripts
我想做的是,当我在此存储库中创建一个新文件夹时,我的管道应该触发并上传此新文件夹中的 dist 文件夹内容并将其保存在 azure 存储中。
所以我决定先使用 Azure 管道模板来定义管道的逻辑:
Client_template.yaml
parameters:
storageaccount: ''
client: []
steps:
- ${{ each client in parameters.client }}:
- task: AzureCLI@2
displayName: 'Azure CLI'
inputs:
AzureSubscription: '<mysubscription>'
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az storage blob upload-batch --source dist --destination '$web/${client}' --account-name ${{ parameters.storageaccount}} --output table --no-progress
然后我创建了另一个管道来调用这个模板。
client_pipeline.yaml
variables:
- name: storageaccount
value: <mystorageaccount>
steps:
- template: client_template.yaml
parameters:
storageaccount: ${{ variables.storageaccount }}
client: ["folder","folder1"]
我使用它的第二个管道让我可以自由添加任意数量的客户端,管道应该只在 azure 存储帐户中创建它们。
当我 运行 我的管道时,它可以毫无问题地构建所有内容,但是当我进入我的存储帐户时,我遇到了 2 个问题。
第一个是文件夹名称是${client}
而不是我在数组中指定的名称的实际名称。
第二个问题是上传,只上传主文件夹和子文件夹none。
请大家帮忙?
编辑: 我解决了问题 1,现在我可以创建多个文件夹。 但它仍然没有复制 dist
内文件夹中的所有子文件夹和文件参考这个话题:https://github.com/Azure/azure-cli/issues/5420#issuecomment-487169413,
az storage azcopy blob upload
-c containerName
--account-name accountName
-s directory/path
-d upload/path
如果需要上传子文件夹,可以加上标志--recursive
。
因此,您可以有一个递归标志,设置后将上传子目录。在 az storage blob upload-batch 中包含 --recursive
标志会上传子目录。例如 az storage blob upload-batch -d <container name> -s <path/to/directory> --recursive
。不包括递归标志将只上传特定目录的文件。
更新>> 由于 Nayden 已通过使用上传批处理解决了此问题。如果子文件夹为空,它将被忽略并且不会被复制。一旦我们将一些文件放入所有子文件夹中,上传批处理就会在没有任何额外标志的情况下进行递归复制。
在此发帖,以便遇到相同问题的其他社区成员可以快速找到答案。