蔚蓝“;“KuduSync.NET”;在多个azure网站中使用git部署时出错

蔚蓝“;“KuduSync.NET”;在多个azure网站中使用git部署时出错,git,azure,deployment,Git,Azure,Deployment,我有4个azure网站,每个网站都有自己的“暂存”部署槽。所有这些暂存槽都是使用相同的源代码存储库(git)部署的 这是相同的解决方案,每个azure网站都使用“项目”设置(azure网站-->配置选项卡-->应用程序设置)编译自己的项目 事实上,几乎总是工作得很好,但有时(10%的时间)它会给我带来一个恼人的实现错误: KuduSync.NET从:“D:\local\Temp\a8b0a9fb-c31c-45a1-92d3-55b80315a6dc”到:“D:\home\site\wwwroo

我有4个azure网站,每个网站都有自己的“暂存”部署槽。所有这些暂存槽都是使用相同的源代码存储库(git)部署的

这是相同的解决方案,每个azure网站都使用“项目”设置(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\wwwwroot”-n“D:\home\site\deployments\6c8e6d6ba36c35d7adf1c0a2f93f5397df2600d1\manifest”--p“D:\home\site\deployments\52AA055BBB165EE2B07EC780BB11B252ED001A\manifest”-.git;.hg;.deployment;deployment.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".
它仍然不起作用。这是错误消息:

进程无法访问该文件,因为另一个进程正在使用该文件 过程

所以这不是库杜的问题。我真的不知道为什么我的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\u TARGET%”,因为如果在in语句中设置它,它将不起作用

新的问题是

关闭句柄时出错:A

我一直在谷歌上搜索,没有找到任何关于“A”错误的描述


有什么想法吗?

您使用的是最新版本的吗?因为此提交:“”应修复此问题()

更新#1:

我使用的是Azure,所以我想他们使用的是最新版本的 库杜申克

这可能是,也可能不是。因为您不能直接访问KuduSync,所以需要一些变通方法。这里有一个想法:创建自定义部署脚本,在更新到
web.config.bak
之前将其重命名为
web.config
(并删除以前的
web.config.bak
,如果有的话)

  • 从Kudu获取部署脚本(
    deploy.cmd
    ):

  • 访问网站的Kudu服务,网址为:
    yourwebsite.scm.azurewebsites.net
  • 单击
    工具
    下载部署脚本
    并获取为您的代码生成的部署脚本Azure
  • 在更新文件之前,将其修改为重命名
    web.config

  • 将其提交到回购协议的根目录中。现在Kudu将使用它而不是通用的
  • 下面是Azure自定义部署的良好总结(第3部分中有逐步说明):

    更新#2:

    我已经按照建议的步骤修改了deploy.cmd @beatcracker在KuduSync步骤之前添加了两行。。。还是 不起作用

    唉。IIS监视文件\文件夹以截获更改并相应地重新启动AppDomains\AppPool,至少可以说。所以你有两种方法来处理这个问题:

  • 您可以花费未定义的时间调试此锁定发生的确切原因。上面的链接具有ASPX页面代码示例,该示例将显示请求数、AppDomain重新启动数和active directory监视器数。这里有一个例子,我们讨论了类似的行为。它可能提供一些见解

  • 你可以采用快速而肮脏的解决方法,然后继续你生活中更重要的事情。我至少可以想到两个:

  • 在部署脚本中回收应用程序池:
    appcmd回收apppool yourappool
  • 部署到服务器,并在自定义部署脚本中使用它来:

  • 为了简化部署,您可以在git repo中包含
    handle.exe
    ,以便自动部署

    相关XKCD:


    发生这种情况时,请尝试一件事:转到Kudu(yoursite.scm.azurewebsites.net),转到Process Explorer,并使用“查找句柄”工具查看是否有任何内容具有该文件的句柄。下次发生时,我将尝试它!谢谢,嗨!事情又发生了。我已经按照您的说明进行了操作,我的web.config由w3wp.exe进程处理。据我所知,正是这个过程让网站运转起来。我已终止进程,部署成功。这是否意味着如果w3sp.exe正在运行,我无法部署我的网站?如果有帮助的话,我已经做了很多截图。谢谢虽然w3wp确实需要读取web.config,但不应将其锁定。网站一开始就被锁定了吗?如果与“初学者”ASP.NET站点的行为进行比较会怎么样?您的应用程序(或您使用的某个库)中是否有自定义逻辑打开应用程序而未正确关闭?你在电视上也看到了吗
    for /F "tokens=3,6 delims=: " %%I IN ('handle.exe -accepteula %DEPLOYMENT_TARGET%\web.config') DO handle.exe -c %%J -y -p %%I