You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Octopus Deploy中创建步骤模板,将Artifactory NuGet包文件复制到Databricks集群

Octopus Deploy 推送文件到Databricks集群的专用步骤模板方案

一、核心优化思路

跳过「先将NuGet包部署到Octopus目标节点」的中间环节,直接在步骤模板内完成从Artifactory拉取指定包内文件 → 推送到Databricks的全流程,减少冗余操作,提升部署效率。

二、步骤模板创建流程

  1. 进入Octopus Deploy后台,导航至 Library > Step Templates > Add Step Template
  2. 填写基础信息:
    • 名称:例如「推送WHL文件至Databricks集群」
    • 描述:从Artifactory拉取NuGet包内publish目录下的指定文件,推送至Databricks指定路径
    • 分类:选择「Deploy」或自定义分类
  3. 添加可配置参数(支持绑定Octopus变量):
    • ArtifactoryNuGetRepoUrl:Artifactory的NuGet仓库基础URL(文本输入框)
    • PackageId:目标NuGet包的ID(文本输入框)
    • PackageVersion:NuGet包版本(可绑定部署流程中的#{Package.Version}变量)
    • DatabricksWorkspaceUrl:Databricks工作区的API基础URL(文本输入框)
    • DatabricksToken:Databricks访问令牌(敏感字段,勾选「Sensitive」)
    • DatabricksTargetPath:Databricks上的目标存储路径(例如/dbfs/FileStore/jars/,文本输入框)
  4. 添加执行脚本(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 14:32:08