如何在Azure Pipeline中动态构建两级参数:一级文件夹及对应文件
Azure Pipeline 动态构建两级依赖参数实现方案
方案1:启动管道前选择(Runtime Parameters)
这种方式让用户在启动管道时就能选择文件夹和对应的文件,需要借助脚本预生成参数选项:
步骤1:创建参数生成脚本
在仓库根目录新建generate-params.ps1,内容如下:
# 获取当前目录下的一级文件夹 $folders = Get-ChildItem -Directory -Path $PSScriptRoot -Depth 1 | Select-Object -ExpandProperty Name # 生成参数YAML内容 $paramContent = @" parameters: - name: targetFolder type: string default: '$($folders[0])' values: "@ foreach ($folder in $folders) { $paramContent += "`n - '$folder'" } $paramContent += @" - name: targetFile type: string default: '' values: "@ # 如果有传入选中的文件夹,生成对应文件列表 if ($env:SELECTED_FOLDER) { $files = Get-ChildItem -File -Path "$PSScriptRoot/$env:SELECTED_FOLDER" | Select-Object -ExpandProperty Name foreach ($file in $files) { $paramContent += "`n - '$file'" } } else { $paramContent += "`n - '请先选择文件夹'" } # 写入参数文件 $paramContent | Out-File -Path "$PSScriptRoot/params.yaml" -Encoding utf8
步骤2:主管道YAML配置
# 引用当前仓库资源 resources: repositories: - repository: self type: git ref: main # 加载生成的参数文件 extends: template: params.yaml parameters: targetFolder: ${{ parameters.targetFolder }} steps: - script: echo 选中的文件夹: ${{ parameters.targetFolder }} displayName: 输出选中文件夹 - script: echo 选中的文件: ${{ parameters.targetFile }} displayName: 输出选中文件
注意事项
- 首次运行时,第二个参数会显示"请先选择文件夹",选择文件夹并重新运行管道后,第二个参数会自动加载对应文件夹内的文件列表。
- 确保管道服务账号有仓库文件的读取权限,脚本才能正常获取目录内容。
方案2:管道运行中交互式选择
如果不需要在启动前选择,可在管道运行过程中动态获取列表并让用户选择,步骤更简单:
steps: # 1. 获取一级文件夹列表并设置为输出变量 - task: PowerShell@2 name: FetchFolders displayName: 获取一级文件夹列表 inputs: targetType: inline script: | $folders = Get-ChildItem -Directory -Path $(System.DefaultWorkingDirectory) -Depth 1 | Select-Object -ExpandProperty Name $folderStr = $folders -join ',' Write-Host "##vso[task.setvariable variable=availableFolders;isOutput=true]$folderStr" Write-Host "检测到的文件夹:$folderStr" # 2. 让用户选择目标文件夹 - task: ManualValidation@0 name: SelectTargetFolder displayName: 选择目标文件夹 inputs: instructions: | 请在下方注释中输入要选择的文件夹名称(可选值:$(FetchFolders.availableFolders)) onTimeout: reject # 3. 提取用户选择的文件夹并获取对应文件列表 - task: PowerShell@2 name: FetchFiles displayName: 获取目标文件夹内的文件列表 inputs: targetType: inline script: | # 从ManualValidation的注释中提取用户输入的文件夹名称 $selectedFolder = "$(SelectTargetFolder.Comments)" Write-Host "用户选中的文件夹:$selectedFolder" $files = Get-ChildItem -File -Path "$(System.DefaultWorkingDirectory)/$selectedFolder" | Select-Object -ExpandProperty Name $fileStr = $files -join ',' Write-Host "##vso[task.setvariable variable=availableFiles;isOutput=true]$fileStr" Write-Host "检测到的文件:$fileStr" # 4. 让用户选择目标文件 - task: ManualValidation@0 name: SelectTargetFile displayName: 选择目标文件 inputs: instructions: | 请在下方注释中输入要选择的文件名称(可选值:$(FetchFiles.availableFiles)) onTimeout: reject # 5. 使用选中的文件夹和文件执行后续操作 - script: | echo 最终选中的文件夹:$(SelectTargetFolder.Comments) echo 最终选中的文件:$(SelectTargetFile.Comments) displayName: 输出选中结果
注意事项
ManualValidation任务需要用户手动在注释中输入选择的名称,适合需要人工确认的场景。- 如果需要更友好的下拉选择界面,可以安装Azure DevOps市场中的
Input Task扩展。
内容的提问来源于stack exchange,提问作者Alessandro Bocchi
相关产品推荐
相关产品推荐

