如何在TFS 2017构建定义中推送新变更前创建Zip备份
嘿,这个需求太实用了——提前备份旧内容,回滚的时候才不会手忙脚乱!在TFS 2017的构建定义里,你只需要在xcopy推送任务之前加个备份任务就行,下面给你两种靠谱的方案,选适合你的来配置:
方案1:用命令行任务快速实现备份
如果你的需求比较简单,用命令行任务就足够了,步骤如下:
- 打开你的TFS 2017构建定义,切换到「任务」标签页。
- 点击「添加任务」,搜索并选择「命令行」任务,把它拖到xcopy推送任务的上方(一定要先备份再推送!)。
- 配置命令行参数:
- 如果你想用Windows自带的压缩工具,在「参数」框里输入:
这里的powershell -Command "Compress-Archive -Path 'D:\你的现有内容目录\*' -DestinationPath 'D:\备份存放目录\$(Build.BuildNumber)_Backup.zip' -Force"$(Build.BuildNumber)是TFS的内置变量,能自动用当前构建编号命名备份包,方便后续回滚时对应版本。-Force参数是为了如果同名备份包已存在,直接覆盖它。 - 如果你习惯用7-Zip,先确保构建代理机器上装了7-Zip,然后在「工具」框里填7-Zip的完整路径(比如
C:\Program Files\7-Zip\7z.exe),「参数」框里输入:a -tzip "D:\备份存放目录\$(Build.BuildNumber)_Backup.zip" "D:\你的现有内容目录\*"
- 如果你想用Windows自带的压缩工具,在「参数」框里输入:
- 可选:如果备份存放目录可能不存在,可以在命令开头加一句创建目录的命令:
mkdir D:\备份存放目录 && powershell -Command "Compress-Archive ..."
方案2:用PowerShell任务实现更灵活的备份
如果需要加一些逻辑判断(比如自动清理旧备份、检查目录权限),用PowerShell任务会更合适:
- 同样在xcopy任务上方添加「PowerShell任务」。
- 选择「内联脚本」,把下面的代码粘进去,记得替换成你自己的路径:
# 配置路径 $sourceFolder = "D:\你的现有内容目录" # 要备份的旧内容路径 $backupRootDir = "D:\构建备份存储" # 备份文件存放的根目录 $backupFileName = "$(Build.BuildNumber)_旧内容备份.zip" $fullBackupPath = Join-Path $backupRootDir $backupFileName # 先检查备份目录是否存在,不存在就创建 if (-not (Test-Path $backupRootDir)) { New-Item -ItemType Directory -Path $backupRootDir | Out-Null Write-Host "已创建备份目录:$backupRootDir" } # 执行压缩备份 Compress-Archive -Path "$sourceFolder\*" -DestinationPath $fullBackupPath -Force Write-Host "✅ 备份完成!备份文件路径:$fullBackupPath" # 可选:自动清理7天前的旧备份,避免磁盘爆满 $oldBackups = Get-ChildItem $backupRootDir -Filter "*.zip" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } if ($oldBackups) { $oldBackups | Remove-Item -Force Write-Host "已清理$($oldBackups.Count)个7天前的旧备份" } - 保存任务配置即可。
关键注意事项
- 任务顺序:备份任务必须放在xcopy推送任务的前面,确保是在覆盖旧内容前完成备份。
- 权限检查:TFS构建代理的服务账号需要有「备份目录的写入权限」和「源内容目录的读取权限」,否则会执行失败。
- 备份命名:用
$(Build.BuildNumber)命名备份包,能快速关联到对应的构建版本,回滚时一眼就能找到需要的备份。
内容的提问来源于stack exchange,提问作者Sheikh Junaid
相关产品推荐
相关产品推荐

