我有4个azure网站,每个网站都有自己的“暂存”部署位置。所有这些临时插槽都使用相同的源代码存储库(git)进行部署。
这是相同的解决方案,每个azure网站使用“项目”设置(天蓝网站 - >配置选项卡 - >应用程序设置)编译自己的项目。
实际上几乎总是运行良好,但有时(10%的时间)它会引发一个烦人的实现错误:
KuduSync.NET来自:'D:\ local \ Temp \ a8b0a9fb-c31c-45a1-92d3-55b80315a6dc'到:'D:\ home \ site \ wwwroot' 错误:无法更改当前正在使用的文件“D:\ home \ site \ wwwroot \ Web.config” 复制文件:'Web.config' exitCode = 1失败,command =“kudusync”-v 50 -f“D:\ local \ Temp \ a8b0a9fb-c31c-45a1-92d3-55b80315a6dc”-t“D:\ home \ site \ wwwroot”-n“D: \ home \ site \ deployments \ 6c8e6d6ba36c35d7adf1c0a2f93f5397df2600d1 \ manifest“-p”D:\ home \ site \ deployments \ 52aaaa055bb165ee2b0b7ecbb78011b252ed001a \ manifest“-i”.git; .hg; .deployment; deploy.cmd“ 网站部署期间发生错误。
我理解这意味着什么,但对我来说没有任何意义。暂存网站几乎从不使用(仅用于测试目的),“始终可用”设置设置为false。
有关详细信息,某些暂存网站会抛出错误,而其他一些则不会。
我现在要做的是等待一点(5分钟,10分钟,15分钟......),重试部署并向比特神祈祷。
任何人都知道这是什么问题?
提前致谢。
修改
我按照@beatcracker提出的步骤修改了deploy.cmd,并在KuduSync步骤之前添加了两行:
del "%DEPLOYMENT_TARGET%\web.config.bak"
rename "%DEPLOYMENT_TARGET%\web.config" "%DEPLOYMENT_TARGET%\web.config.bak".
它仍然不起作用。这是错误消息:
该进程无法访问该文件,因为该文件正被另一个文件使用 过程
所以这不是一个kudu问题。我真的不知道为什么我的web.config被锁定了。我尝试使用调试控制台(* .scm.azurewebsites.net / DebugConsole)重命名web.config,并重复相同的错误消息。
如果我杀死了w3wp.exe进程,部署成功。
有没有办法知道为什么我的web.config被锁定(有时!!)?
**更新2 ** 我认为@beatcracker是正确的,但我仍然在努力解决这个问题。
我已将这两行添加到deploy.cmd
cd %DEPLOYMENT_TARGET%
for /F "tokens=3,6 delims=: " %%I IN ('%DEPLOYMENT_SOURCE%\Handle.exe -accepteula Web.config') DO %DEPLOYMENT_SOURCE%\Handle.exe -accepteula -c %%J -y -p %%I
请注意,我需要在DO语句中添加-accepteula参数,我需要执行“cd%DEPLOYMENT_TARGET%”,因为如果我在IN语句中设置它,它就不起作用。
新问题是......
关闭句柄时出错:A
我一直在谷歌搜索,我没有找到任何“A”错误的描述。
有什么想法吗?
答案 0 :(得分:2)
您使用的是KuduSync.Net的最新版本吗?因为这个提交:" Try to move a file to a known directory if it is locked"应该解决问题(Files locked during deploy from GitHub)。
更新#1:
我使用Azure,所以我认为他们使用的是最新版本 KuduSync
这可能是,也可能不是。由于您无法直接访问KuduSync,因此需要一些解决方法。以下是创意:创建自定义部署脚本,在更新为web.config
之前重命名web.config.bak
(如果有的话,删除之前的web.config.bak
)。
从Kudu获取部署脚本(deploy.cmd
):Custom Deployment to Azure Websites
yourwebsite.scm.azurewebsites.net
Tools
> Download Deployment Script
并获取为您的代码生成的部署脚本Azure。修改它以在更新文件之前重命名web.config
以下是Azure自定义部署的详细综述(第3部分中的分步说明):1,2,3
更新#2:
我按照提议的步骤修改了deploy.cmd @beatcracker并在KuduSync步骤之前添加了两行......它仍然存在 不起作用。
嗟。 IIS监视文件\文件夹以拦截更改并相应地重新启动AppDomains \ AppPools。 The monitoring logic is complicated,至少可以说。所以你有两种方法可以解决这个问题:
您可以花费不确定的时间来精确调试此锁定发生的原因。上面的链接具有ASPX页面代码示例,该示例将显示请求数,AppDomain重新启动次数和活动目录监视器数。这里是一个brackets issue thread on GitHub,其中讨论了类似的行为。它可能会提供一些见解。
您可以应用快速而肮脏的解决方法,并继续处理生活中更重要的事情。我至少可以想到两个:
appcmd recycle apppool YourAppPool
。将handle.exe部署到您的服务器并在自定义部署脚本中使用它unlock the file:
for /F "tokens=3,6 delims=: " %%I IN ('handle.exe -accepteula %DEPLOYMENT_TARGET%\web.config') DO handle.exe -c %%J -y -p %%I
为简化部署,您可以在git仓库中加入handle.exe
,以便自动部署。
相关的XKCD: