Teamcity 大文件上的移动项似乎是异步执行的

Teamcity 大文件上的移动项似乎是异步执行的,teamcity,msdeploy,webdeploy,teamcity-9.0,Teamcity,Msdeploy,Webdeploy,Teamcity 9.0,我从teamcity服务器访问网络共享,并从文件夹中创建msdeploy包/zip 完成后,我创建了一个Powershell驱动器,该驱动器映射到另一台服务器的共享文件夹。这个服务器在这里被称为GATE <# CREATE DRIVE FOR GATE #> $password = ConvertTo-SecureString "MyPassword" -AsPlainText -force $credential = new-object -TypeName System.Mana

我从teamcity服务器访问网络共享,并从文件夹中创建msdeploy包/zip

完成后,我创建了一个Powershell驱动器,该驱动器映射到另一台服务器的共享文件夹。这个服务器在这里被称为GATE

<# CREATE DRIVE FOR GATE #>
$password = ConvertTo-SecureString "MyPassword" -AsPlainText -force
$credential = new-object -TypeName System.Management.Automation.PSCredential -ArgumentList "MyUsername", $password 
New-PSDrive -Credential $credential -Name GATE -PSProvider FileSystem -Root \\NetworkShare\sharedfolder


<# DEPLOY SOURCE FILE #>
Move-Item -Path $zipPath -Destination GATE:\data.zip


<# READ STATUS FILE #>
$statusContent = Get-Content GATE:\data.status.txt

$password=converttosecurestring“MyPassword”-AsPlainText-force
$credential=新对象-TypeName System.Management.Automation.PSCredential-ArgumentList“MyUsername”,$password
新建PSDrive-凭证$Credential-名称门-PSProvider文件系统-根\\网络共享\sharedfolder
移动项目-路径$zipPath-目标门:\data.zip
$statusContent=获取内容门:\data.status.txt
部署的data.zip压缩容量为1.5 GB

当我运行Move Item时,需要一段时间才能将1,5 GB的数据传输到服务器

但是我在teamcity端的代码在Move项执行后立即继续

我认为这就是问题所在,因为data.status.txt仅在文件真正移动时在GATE服务器上创建。当我开始移动文件时,data.status.txt不存在,就在文件真正移动之后


如何解决这个难题?

使用复制项,然后删除源文件

复制项将阻止脚本执行,而移动项不会

编辑:实际上,从PowerShell v 5.0开始,这两个cmdlet都将阻止进一步的脚本执行。以前不确定是否是这样


结论:如果在测试中,您发现Move Item没有阻塞,您可以始终使用Copy Item和-PassThru来代替,这将始终阻塞。

我猜执行XCopy也会阻塞脚本执行,因为我在Move Item填充之前使用了它,并且与Move Item相比它工作得更好!您是否有声明复制项目将阻止并移动项目的来源?:-)Copy Item解决了一个问题,即在GATE服务器上,当我访问一个大文件时,我没有得到一个访问IO异常,因为该文件仍在访问中,所以我不必使用愚蠢的睡眠-60秒。。。。我要解决的主要问题是teamcity在服务器上轮询data.status.txt的while循环,因为只有当GATE上的msdeploy将包zip推送到另一台服务器时,才会创建此文件。是的,非常令人困惑,但这是一个企业社区的基础架构地狱,他们会阻止所有端口…我测试并发现在PowerShell 5上,两个cmdlet都会阻止。如果您有一个早期版本,只需使用-Passthru,它将生成一个对象,在传输完成之前不会发生。有效的即时阻塞。:)所以我使用了带-passthru的移动项目和它的阻塞?我需要删除移动的文件,因为当我手动删除它时,会出现访问错误。。。它仍然处于访问异常状态。