如何在Octopus Deploy中创建步骤模板,将Artifactory NuGet包文件复制到Databricks集群
Octopus Deploy 推送文件到Databricks集群的专用步骤模板方案
一、核心优化思路
跳过「先将NuGet包部署到Octopus目标节点」的中间环节,直接在步骤模板内完成从Artifactory拉取指定包内文件 → 推送到Databricks的全流程,减少冗余操作,提升部署效率。
二、步骤模板创建流程
- 进入Octopus Deploy后台,导航至 Library > Step Templates > Add Step Template
- 填写基础信息:
- 名称:例如「推送WHL文件至Databricks集群」
- 描述:从Artifactory拉取NuGet包内publish目录下的指定文件,推送至Databricks指定路径
- 分类:选择「Deploy」或自定义分类
- 添加可配置参数(支持绑定Octopus变量):
ArtifactoryNuGetRepoUrl:Artifactory的NuGet仓库基础URL(文本输入框)PackageId:目标NuGet包的ID(文本输入框)PackageVersion:NuGet包版本(可绑定部署流程中的#{Package.Version}变量)DatabricksWorkspaceUrl:Databricks工作区的API基础URL(文本输入框)DatabricksToken:Databricks访问令牌(敏感字段,勾选「Sensitive」)DatabricksTargetPath:Databricks上的目标存储路径(例如/dbfs/FileStore/jars/,文本输入框)
- 添加执行脚本(PowerShell):
以下脚本整合了包拉取、文件提取、Databricks推送及临时文件清理逻辑:# 创建临时工作目录 $tempDir = Join-Path $env:TEMP "Octo_Databricks_Push_$(Get-Random)" New-Item -ItemType Directory -Path $tempDir -Force | Out-Null try { # 从Artifactory拉取NuGet包 $packageFileName = "#{PackageId}.#{PackageVersion}.nupkg" $packagePath = Join-Path $tempDir $packageFileName $pullUrl = "#{ArtifactoryNuGetRepoUrl}/#{PackageId}/#{PackageVersion}/$packageFileName" Invoke-WebRequest -Uri $pullUrl -OutFile $packagePath # 解压NuGet包并定位publish目录下的WHL文件 Expand-Archive -Path $packagePath -DestinationPath $tempDir -Force $whlFile = Get-ChildItem -Path (Join-Path $tempDir "publish") -Recurse -Filter *.whl | Select-Object -First 1 if (-not $whlFile) { throw "未在NuGet包的publish目录中找到.whl文件" } # 构建Databricks API请求头 $headers = @{ "Authorization" = "Bearer #{DatabricksToken}" "Content-Type" = "application/json" } # 确保Databricks目标路径存在 $mkdirBody = @{ path = "#{DatabricksTargetPath}" overwrite = $false } | ConvertTo-Json Invoke-RestMethod -Uri "#{DatabricksWorkspaceUrl}/api/2.0/dbfs/mkdirs" -Method Post -Headers $headers -Body $mkdirBody | Out-Null # 推送WHL文件到Databricks $targetFilePath = Join-Path "#{DatabricksTargetPath}" $whlFile.Name $fileContent = [Convert]::ToBase64String([IO.File]::ReadAllBytes($whlFile.FullName)) $uploadBody = @{ path = $targetFilePath overwrite = $true contents = $fileContent } | ConvertTo-Json Invoke-RestMethod -Uri "#{DatabricksWorkspaceUrl}/api/2.0/dbfs/put" -Method Post -Headers $headers -Body $uploadBody | Out-Null Write-Host "文件推送成功:$targetFilePath" } catch { Write-Error "推送失败:$_" throw } finally { # 清理临时文件 Remove-Item -Path $tempDir -Recurse -Force -ErrorAction SilentlyContinue }
三、关键注意事项
- 确保执行该步骤的Octopus运行目标(或Worker)能访问Artifactory仓库和Databricks API
- Databricks令牌需具备
dbfs:write权限,避免权限不足报错 - 若NuGet包内存在多个.whl文件,可修改脚本中的
Select-Object逻辑,或新增参数指定目标文件名 - 若Artifactory需要身份验证,可添加
ArtifactoryApiKey敏感参数,并在Invoke-WebRequest中加入-Headers @{ "X-JFrog-Art-Api" = "#{ArtifactoryApiKey}" }
内容的提问来源于stack exchange,提问作者Sudama Tripathi
相关产品推荐
相关产品推荐

