我将使用一个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?
答案 0 :(得分:0)
如果这些作业默认情况下可以访问GitHub存储库,或者我需要在该作业级别做些什么?
答案是肯定的。
我们可以在作业中添加一个命令行任务,例如job1
,以通过Github PAT克隆GitHub存储库,然后我们可以访问这些文件(value-f1.yaml
,values-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命令参数:
因此,此问题的答案是取决于您的文件名是否可以用作Helm命令,否则,您将无法使用以下命令为每个文件运行任务HelmDeploy@0
参数。如果是,则可以。
请查看官方文档Templates,以了解更多详细信息。
希望这会有所帮助。