在Azure管道作业中使用for循环

时间:2019-12-18 07:46:43

标签: for-loop azure-devops azure-pipelines

我将使用一个for循环来扫描文件夹中的文件(value-f1.yaml,values-f2.yaml等),每次使用文件名作为变量并在其中运行作业Azure管道作业,用于基于该Values文件部署Helmchart。该文件夹位于GitHub存储库中。所以我在想这样的事情:

pipeline.yaml

 stages:
  - stage: Deploy
    variables:
      azureResourceGroup: ''
      kubernetesCluster: ''
      subdomain: ''
    jobs:
    ${{ each filename in /myfolder/*.yaml}}:
       valueFile: $filename 
       - template: Templates/deploy-helmchart.yaml@pipelinetemplates    

deploy-helmchart.yaml

 jobs:
    - job: Deploy
      pool:
        vmImage: 'ubuntu-latest'
      steps:
      - task: HelmInstaller@1
        displayName: 'Installing Helm'
        inputs:
          helmVersionToInstall: '2.15.1'
        condition: and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/tags/v'))  

      - task: HelmDeploy@0
        displayName: 'Initializing Helm'
        inputs:
          connectionType: 'Azure Resource Manager'
          azureSubscription: $(azureSubscription)
          azureResourceGroup: $(azureResourceGroup)
          kubernetesCluster: $(kubernetesCluster)
          command: 'init'
        condition: and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/tags/v'))  

      - task: PowerShell@2
        displayName: 'Fetching GitTag'
        inputs:
          targetType: 'inline'
          script: |
            # Write your PowerShell commands here.
            Write-Host "Fetching the latest GitTag"
            $gt = git describe --abbrev=0
            Write-Host "##vso[task.setvariable variable=gittag]$gt"
        condition: and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/tags/v'))    


      - task: Bash@3
        displayName: 'Fetching repo-tag'
        inputs:
          targetType: 'inline'
          script: |
            echo GitTag=$(gittag)
            echo BuildID=$(Build.BuildId)
            echo SourceBranchName=$(Build.SourceBranchName)
            echo ClusterName= $(kubernetesCluster)

      - task: HelmDeploy@0
        displayName: 'Upgrading helmchart'
        inputs:
          connectionType: 'Azure Resource Manager'
          azureSubscription: $(azureSubscription)
          azureResourceGroup: $(azureResourceGroup)
          kubernetesCluster: $(kubernetesCluster)
          command: 'upgrade'
          chartType: 'FilePath'
          chartPath: $(chartPath)
          install: true
          releaseName: $(releaseName)
          valueFile: $(valueFile)
          arguments: '--set image.tag=$(gittag) --set subdomain=$(subdomain)'
        condition: and(succeeded(), startsWith(variables['build.sourceBranch'], 'refs/tags/v'))  

另一件事是,如果这些作业默认情况下可以访问GitHub存储库,或者我需要在该作业级别做些什么?

在这种情况下,如何在工作中使用for循环?

任何帮助将不胜感激。

在收到@Leo的评论后更新

这是我在deploy-helmchart.yaml中添加的PowerShell任务,用于从GitHub中的文件夹中获取文件。

 - task: PowerShell@2
   displayName: 'Fetching Files'
   inputs:
     targetType: 'inline'
     script: |
       Write-Host "Fetching values files"
       cd myfolder
       $a=git ls-files
       foreach ($i in $a) {
          Write-Host "##vso[task.setvariable variable=filename]$i"
          Write-Host "printing"$i
       }

现在的问题是我该如何运行任务:使用参数为每个文件运行HelmDeploy @ 0?

1 个答案:

答案 0 :(得分:0)

  

如果这些作业默认情况下可以访问GitHub存储库,或者我需要在该作业级别做些什么?

答案是肯定的。

我们可以在作业中添加一个命令行任务,例如job1,以通过Github PAT克隆GitHub存储库,然后我们可以访问这些文件(value-f1.yamlvalues-f2.yaml。 。)在$(Build.SourcesDirectory)中:

git clone https://<GithubPAT>@github.com/XXXXX/TestProject.git
  

在这种情况下,我该如何在工作中使用for循环?

您可以创建一个模板,该模板将具有一组操作,并在构建过程中传递参数,例如:

deploy-helmchart.yaml:

parameters:
  param : []

steps:
  - ${{each filename in parameters.param}}
    - scripts: 'echo ${{ filename  }}'

pipeline.yaml:

steps:
 - template: deploy-helmchart.yaml
   parameters:
     param: ["filaname1","filaname2","filaname3"]

查看文档Solving the looping problem in Azure DevOps Pipelines,了解更多详细信息。

命令行在文件管理器中获取最新的文件名:

   FOR /F "delims=|" %%I IN ('DIR "$(Build.SourcesDirectory)\*.txt*" /B /O:D') DO SET NewestFile=%%I

   echo "##vso[task.setvariable variable=NewFileName]NewestFile"

更新

  

现在的问题是我如何运行任务:每个任务都运行HelmDeploy @ 0   文件使用参数?

s depends on whether your HelmDeploy`任务具有接受文件名参数的选项。

正如我之前所说,我们可以使用以下yaml来调用带有参数的模板yaml:

 - template: deploy-helmchart.yaml
   parameters:
     param: ["filaname1","filaname2","filaname3"]

但是,如果任务HelmDeploy没有接受参数的选项,我们将无法使用参数为每个文件运行任务HelmDeploy@0

然后我检查HelmDeploy@0,发现只有一个选项可以接受 Helm命令参数:

enter image description here

因此,此问题的答案是取决于您的文件名是否可以用作Helm命令,否则,您将无法使用以下命令为每个文件运行任务HelmDeploy@0参数。如果是,则可以。

请查看官方文档Templates,以了解更多详细信息。

希望这会有所帮助。