如何配置TFS 2017 Git构建流程仅同步变更文件至FTP服务器
实现TFS 2017构建仅同步变更文件到FTP
我刚好处理过类似的TFS 2017增量发布需求,给你分享两个靠谱的实现方法,都能搞定只同步变更文件到FTP的问题,不用再每次全量复制了:
方法一:用TFS变更集识别+FTP任务定向上传
核心思路是先找出当前构建和上一次成功构建之间的所有变更文件,再让FTP任务只上传这些文件。
1. 新增PowerShell任务获取变更文件列表
在你的构建流程里加一个PowerShell任务,用脚本抓取变更文件:
# 拿到当前构建ID $currentBuildId = $(Build.BuildId) # 获取同构建定义下上一次成功构建的ID $lastSuccessBuild = (Get-TfsBuild -BuildDefinitionName "$(Build.DefinitionName)" -Status Succeeded -Top 1).Id # 拉取两个构建之间的所有变更集 $changesets = Get-TfsChangeset -StartId $lastSuccessBuild -EndId $currentBuildId # 提取所有变更的文件路径 $changedFiles = @() foreach ($cs in $changesets) { foreach ($change in $cs.Changes) { $changedFiles += $change.Item.ServerItem } } # 转换TFS服务器路径到本地构建目录的路径 $localChangedPaths = @() foreach ($file in $changedFiles) { $localPath = $file.Replace("$/$(Build.Repository.Name)", "$(Build.SourcesDirectory)") $localChangedPaths += $localPath } # 把结果存到变量,供后续FTP任务使用 Write-Host "##vso[task.setvariable variable=ChangedLocalFiles]$($localChangedPaths -join ';')"
小贴士:如果构建代理没装TFS PowerShell模块,也可以改用TFS REST API来获取变更集,效果是一样的。
2. 配置FTP任务只传变更文件
找到你现有的FTP上传任务,修改"要复制的文件"为$(ChangedLocalFiles),同时勾选"删除目标中不存在的文件"选项——这样不仅能上传新增/修改的文件,还能同步删除服务器上已经被移除的文件。
方法二:用Robocopy做增量快照+FTP上传
如果觉得变更集的方式太麻烦,也可以用Robocopy做本地增量对比,再上传变更后的文件:
1. 新增Command Line任务生成变更文件快照
加一个Command Line任务,用Robocopy对比当前源码目录和上次构建的快照目录,把变更文件单独存到临时文件夹:
robocopy "$(Build.SourcesDirectory)" "$(Agent.TempDirectory)\LatestChanges" /MIR /XN /XO
参数说明:
/MIR是镜像同步(包含删除操作),/XN排除比目标新的文件,/XO排除比目标旧的文件,这样临时文件夹里就只有这次构建的变更文件。
2. 上传临时文件夹到FTP
配置FTP任务,把"要复制的文件"设置为$(Agent.TempDirectory)\LatestChanges\**,这样就只会上传变更后的内容。
3. 更新快照目录供下次构建使用
最后再加一个Command Line任务,把当前源码目录同步到快照目录,方便下一次构建做对比:
robocopy "$(Build.SourcesDirectory)" "$(Agent.TempDirectory)\LastBuildSnapshot" /MIR
几个要注意的细节
- 如果你的项目是需要编译的PHP项目,记得把变更文件的范围调整为编译后的输出目录,而不是源码目录,避免上传没用的源码文件。
- 构建代理需要有足够的权限访问TFS变更集(方法一),或者有足够磁盘空间存储快照目录(方法二)。
- 测试的时候可以先手动触发几次构建,验证一下是不是真的只传了变更文件,避免出现漏传或者多传的情况。
内容的提问来源于stack exchange,提问作者Elamurugan
相关产品推荐
相关产品推荐

