无需复制流水线:Azure CICD部署Databricks Notebook的按需方案问询
解决方案
一、无需复制流水线实现单项目/指定文件夹部署
可以通过给PowerShell脚本添加可选参数,并在Azure发布流水线中配置运行时输入参数来实现,无需复制流水线。具体步骤如下:
1. 修改PowerShell脚本,添加目标文件夹参数
在脚本开头新增参数接收逻辑,支持手动指定要部署的文件夹,默认仍部署全量文件夹:
param( [string]$build_dir, [string]$target_ENV, [string]$TargetFolders = "" # 新增:接收逗号分隔的文件夹路径字符串 ) # 定义所有默认文件夹 $admin_dir = "/ADMIN/" $data_dir = "/DATA/" $data_project1 = "/Project 1/" $data_project2 = "/Project 2/" $data_project3 = "/Project 3/" # 确定最终要部署的文件夹列表 if (-not [string]::IsNullOrEmpty($TargetFolders)) { # 拆分逗号分隔的字符串为数组,去掉多余空格 $nb_folders = $TargetFolders -split ',' | ForEach-Object { $_.Trim() } } else { # 默认部署所有文件夹(修正原代码中重复的$data_project3) $nb_folders = @($admin_dir, $data_dir, $data_project1, $data_project2, $data_project3) } # --- 原有脚本逻辑保持不变 --- foreach ($nb_folder in $nb_folders) { if ($target_ENV -eq 'd') { Write-Host "The environment is dev, so we don't change resource names in notebooks" } else { $nb_dir = $build_dir + $nb_folder Write-Host "Changing variables in notebooks" $files = gci -File -Path $nb_dir foreach ($f in $files) { Write-Output $f.name for ($i = 0; $i -lt $replace_str.Count; $i++) { (Get-Content $nb_dir\$f).replace($replace_str[$i].Source, $replace_str[$i].Target) | Set-Content $nb_dir\$f } } if ($target_ENV -eq 'p') { foreach ($f in $files) { Write-Output $f.name for ($i = 0; $i -lt $prd_replace_str.Count; $i++) { (Get-Content $nb_dir\$f).replace($prd_replace_str[$i].Source, $prd_replace_str[$i].Target) | Set-Content $nb_dir\$f } } } } if ($target_ENV -eq 'd') { Write-Host "The environment is dev, so command for copying scripts from repo will be skipped" } else { Import-DatabricksFolder -BearerToken $DatabricksToken -Region "westeurope" -LocalPath $nb_dir -DatabricksPath $nb_folder } } #------------------------------- # Cleanup #------------------------------- #Remove-Item $nb_dir\*
2. 修改Azure流水线YAML,添加运行时参数
在流水线YAML中定义可手动输入的参数,并将其传递给PowerShell脚本:
# 定义流水线运行时参数 parameters: - name: targetFolders type: string default: "" displayName: '指定要部署的文件夹(多个路径用逗号分隔,例如"/Project 1/,/ADMIN/")' steps: - task: PowerShell@2 displayName: 'Deploy notebooks' inputs: targetType: filePath filePath: './$(drop)/Deployment Scripts/Databricks/ads_deploynotebooks.ps1' arguments: > -build_dir $(drop)/Databricks/notebooks -target_ENV $(target_ENV) -TargetFolders "${{ parameters.targetFolders }}" # 传递环境变量target_ENV到脚本 env: target_ENV: $(target_ENV)
二、UAT环境下允许用户自定义部署文件夹
针对UAT环境($target_ENV -eq 'u'),可以通过以下方式限制仅在该环境下允许用户自定义:
- 在脚本中添加逻辑校验:如果是UAT环境且未指定
TargetFolders,可提示用户输入或直接报错(根据需求调整):
# 在确定$nb_folders之前添加校验 if ($target_ENV -eq 'u' -and [string]::IsNullOrEmpty($TargetFolders)) { Write-Error "UAT环境部署必须指定要部署的文件夹,请在流水线触发时填写targetFolders参数" exit 1 }
- 在Azure流水线中配置参数可见性:利用Azure DevOps的阶段条件,仅在UAT阶段显示
targetFolders参数(需将流水线按环境拆分阶段),示例如下:
stages: - stage: DeployUAT displayName: Deploy to UAT condition: eq(variables['target_ENV'], 'u') jobs: - job: DeployNotebooks steps: - task: PowerShell@2 displayName: 'Deploy notebooks to UAT' inputs: targetType: filePath filePath: './$(drop)/Deployment Scripts/Databricks/ads_deploynotebooks.ps1' arguments: > -build_dir $(drop)/Databricks/notebooks -target_ENV $(target_ENV) -TargetFolders "${{ parameters.targetFolders }}" env: target_ENV: $(target_ENV)
手动触发UAT阶段时,用户必须填写targetFolders参数才能继续部署。
使用场景示例
- 生产环境仅部署项目1:手动触发流水线时,在
targetFolders参数中输入"/Project 1/",脚本只会同步该文件夹下的内容。 - UAT环境部署项目1+ADMIN文件夹:输入
"/Project 1/,/ADMIN/"即可批量部署指定文件夹。
内容的提问来源于stack exchange,提问作者Greencolor
相关产品推荐
相关产品推荐

