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

Azure DevOps发布流水线:向AWS EC2 Windows 2019高效复制文件的最优方案

Azure DevOps 仅复制单个制品到 AWS EC2 的优化方案

改用代理作业是否可行且更优?

完全可行,而且是更优的选择。部署组作业的默认行为会拉取全量构建制品到目标EC2实例的工作目录,这正是你现在遇到的冗余问题。而代理作业可以通过两种方式规避这个问题:

1. 基于EC2实例的自托管代理

在目标Windows 2019 EC2上部署Azure DevOps自托管代理,直接在代理上执行任务:

  • 代理本身运行在EC2上,无需远程传输文件
  • 可以精准控制仅下载需要的单个制品文件,避免全量拉取

2. Microsoft托管代理

用Azure托管的代理先下载单个制品,再通过安全的远程传输工具(如AWS SSM)把文件传到EC2,同样不会把全量制品下载到EC2实例上。

两种方式都能解决全量下载的问题,其中自托管代理的方式效率更高,省去了跨机器传输的步骤。

替代Windows Machine File Copy的任务方案

以下是几种可以实现仅复制单个文件的方案,按推荐度排序:

方案1:自托管代理 + Download Build Artifacts + Copy File

这是最直接高效的方案:

  • Download Build Artifacts任务:在配置中指定Artifact name为你的构建制品名称,然后在Item pattern里填写单个文件的路径(比如**/MyApp.exe),这样只会下载目标文件到代理的工作目录。
  • Copy File任务:将下载好的文件直接复制到EC2上的指定目录(比如C:\Production\Apps\),无需远程复制操作。

方案2:托管代理 + Download Build Artifacts + AWS SSM Run Command

适合不想在EC2上部署自托管代理的场景:

  • Download Build Artifacts任务:同样指定单个文件路径,把文件下载到托管代理本地。
  • AWS SSM Run Command任务:选择AWS-RunPowerShellScript文档,编写脚本将托管代理上的文件上传到EC2。或者利用SSM的文件传输功能,直接将单个文件推送至EC2的目标路径(需确保EC2已启用SSM代理,且Azure DevOps的AWS服务连接权限足够)。

方案3:PowerShell脚本直接调用Azure DevOps API

如果需要更灵活的控制,可以用PowerShell脚本直接从Azure DevOps制品库下载单个文件:

  1. 在脚本中使用Azure DevOps REST API获取单个制品文件的下载链接
  2. 用Invoke-WebRequest下载文件到本地(代理或EC2)
  3. 复制到目标目录

示例脚本片段:

$pat = "$(System.AccessToken)"
$headers = @{ Authorization = "Bearer $pat" }
$downloadUrl = "https://dev.azure.com/[Org]/[Project]/_apis/build/builds/$(Build.BuildId)/artifacts?artifactName=[ArtifactName]&fileId=[FileId]&fileName=[FileName]&api-version=7.1-preview.5"
Invoke-WebRequest -Uri $downloadUrl -Headers $headers -OutFile "C:\temp\TargetFile.exe"
Copy-Item "C:\temp\TargetFile.exe" "C:\Deploy\Target\"

注意事项

  • 若使用自托管代理,需确保EC2实例能访问Azure DevOps组织,且代理已完成注册和权限配置。
  • 使用AWS SSM时,EC2实例必须已安装SSM代理,且AWS服务连接拥有ssm:SendCommand等相关权限。

内容的提问来源于stack exchange,提问作者jaykzoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:20:06