如何通过Azure DevOps YAML流水线将文件部署至本地服务器
问题
我需要用Azure DevOps YAML流水线将文件(比如.NET二进制文件、配置文件、资源等)部署到本地服务器。这些文件已通过构建流水线的publish步骤保存为工件,可通过download步骤获取。目标机器已注册至environment中,用deployment job应该是可行方案,但我卡在了最后一步:
trigger: none resources: pipelines: - pipeline: tp source: Test_Publish jobs: - deployment: environment: Test strategy: runOnce: deploy: steps: - script: cat $(Pipeline.Workspace)/tp/output1/test.txt ???
工件已在代理上成功获取,cat命令能正常显示文件内容,但???处该填什么?我曾尝试使用CopyFiles@2任务,但由于源和目标文件夹不在同一机器上,无法正常工作(奇怪的是复制命令显示“成功”):
CopyFiles@2 inputs: SourceFolder: '$(Pipeline.Workspace)/tp/output1' Contents: '**' TargetFolder: 'C:\TestAzureDevOps\Deployment'
解决方案
核心问题说明
你之前用CopyFiles@2看似成功,实际是因为这个任务只能在当前运行的代理机器上复制文件,它把文件复制到了代理机器的C:\TestAzureDevOps\Deployment路径下,而非你要部署的本地服务器。而deployment job的优势就是能直接在environment注册的目标机器上执行步骤,所以要利用这一点来部署。
正确实现方式
方法1:直接在目标机器上执行复制(推荐)
确保你的environment中的目标机器是部署组代理,这样deployment job的步骤会直接在目标机器上运行,此时源文件(下载的工件)和目标文件夹都在同一机器,CopyFiles@2就能正常工作:
trigger: none resources: pipelines: - pipeline: tp source: Test_Publish jobs: - deployment: DeployToLocalServer environment: Test strategy: runOnce: deploy: steps: # 先将构建工件下载到目标机器的工作目录 - download: tp artifact: output1 path: $(Pipeline.Workspace)/tp/output1 # 在目标机器上执行本地复制 - task: CopyFiles@2 inputs: SourceFolder: '$(Pipeline.Workspace)/tp/output1' Contents: '**' TargetFolder: 'C:\TestAzureDevOps\Deployment' CleanTargetFolder: true # 可选:复制前清空目标文件夹
方法2:跨机器文件复制(代理与目标机器分离时用)
如果你的流水线代理和目标服务器是两台不同的机器,需要跨机器传输文件,可以用WindowsMachineFileCopy@2任务,前提是两台机器网络连通,且你有目标机器的管理员权限:
trigger: none resources: pipelines: - pipeline: tp source: Test_Publish jobs: - deployment: DeployToLocalServer environment: Test strategy: runOnce: deploy: steps: # 先将工件下载到代理机器的工作目录 - download: tp artifact: output1 path: $(Pipeline.Workspace)/tp/output1 # 从代理机器复制文件到目标本地服务器 - task: WindowsMachineFileCopy@2 inputs: SourcePath: '$(Pipeline.Workspace)/tp/output1/**' MachineName: '你的目标机器名称或IP' # 替换为实际值 AdminUserName: '目标机器管理员账号' # 替换为实际值 AdminPassword: '目标机器管理员密码' # 建议用Azure DevOps变量组存储敏感信息 TargetPath: 'C:\TestAzureDevOps\Deployment' CleanTargetFolder: true # 可选:清空目标文件夹
内容的提问来源于stack exchange,提问作者Pragmateek
相关产品推荐
相关产品推荐

