【发布时间】:2021-04-29 22:15:23
【问题描述】:
我有一个脚本可以将所有工件 dotnet 复制到远程服务器(从 Jenkins 服务器到远程服务器上的 IIS 文件夹),用于部署阶段,如下所示:
#Parameters
param($userName, $passWord, $serverName, $deployFolder, $destinationFolder, $iisName)
$passwd = ConvertTo-SecureString $passWord -AsPlainText -Force
$creds = New-Object -typename System.Management.Automation.PSCredential -argumentlist $userName, $passwd
$session = New-PSSession -ComputerName $serverName -Credential $creds
#Stop IIS Application
Invoke-Command -Session $session -ScriptBlock { Import-Module IISAdministration; Stop-Website $args[0];} -ArgumentList $iisName
Start-Sleep -s 200
#Copy new build to deploy folder
Copy-Item -Recurse -Force -Path $deployFolder -Destination $destinationFolder -ToSession $session
#Start IIS Application
Invoke-Command -Session $session -ScriptBlock { Import-Module IISAdministration; Start-Website $args[0];} -ArgumentList $iisName
但有时我遇到问题Copy-Item : The process cannot access the file 'dll' because it is being used by another process.
有什么想法吗?请告诉我!
谢谢
【问题讨论】:
-
好吧,你可能已经知道原因了。为什么添加
Start-Sleepcmdlet?您如何断言您的 Web 服务在替换文件时不再运行? -
使用 Robocopy 复制文件,它具有内置的重试逻辑。在复制之前尝试测试文件是否被锁定是没有用的,因为这很容易出现竞争条件。
-
@Thomas 我不确定如何在复制之前停止我的网络服务的所有文件。所以我使用了 Sleep cmdlet。我知道这种方式不好。但我不知道有什么方法可以做到这一点。有时这个问题仍然会发生。
-
如果要停止web服务,可以stop website和stop app pool,这样dll就不会被其他进程使用了。
-
除了网站外,还需要停止应用池,应用池会将应用缓存预加载到本地。
标签: .net powershell iis web-deployment