【问题标题】:Azure "KuduSync.NET" error using git deployment in multiple azure websites在多个 azure 网站中使用 git 部署时出现 Azure“KuduSync.NET”错误
【发布时间】:2015-02-18 11:26:19
【问题描述】:

我有 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\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”错误的描述。

有什么想法吗?

【问题讨论】:

  • 发生这种情况时要尝试的一件事:转到 Kudu (yoursite.scm.azurewebsites.net),转到 Process Explorer,然后使用 Find Handle 工具查看是否有任何东西可以处理该文件.
  • 下次遇到这种情况我会试试的!谢谢。
  • 嗨!它又发生了。我已按照您的说明进行操作,并且我的 web.config 由 w3wp.exe 进程处理。据我所知,这是使网站正常运行的过程。我已经终止了该过程,并且部署成功。这是否意味着如果 w3sp.exe 正在运行,我无法部署我的网站?如果有帮助,我已经做了很多截图。谢谢!
  • 虽然 w3wp 确实需要读取 web.config,但它不应该保持锁定状态。网站一启动它就会被锁定吗?如果您将其与“入门”ASP.NET 站点的行为进行比较会怎样?您的应用程序(或您使用的某些库)中是否有自定义逻辑打开它并且没有正确关闭它?你在本地机器上看到的一样吗?
  • 问题是它有时会发生(可能是 10% 的时间)。我在本地机器上没有问题,并且(如果我没有遗漏任何东西)我的应用程序上没有任何东西正在打开 web.config ......但它应该是这样的,因为任何其他事情都是有意义的......我会尝试使用 de starter ASP.NET 站点。非常感谢您的宝贵时间。我会继续报道。

标签: git azure deployment


【解决方案1】:

您使用的是最新版本的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.bak 之前将其重命名为 web.config(如果有的话,删除之前的 web.config.bak)。

  1. 从 Kudu 获取您的部署脚本 (deploy.cmd):Custom Deployment to Azure Websites

    1. 访问网站的 Kudu 服务:yourwebsite.scm.azurewebsites.net
    2. 单击Tools > Download Deployment Script 并获取Azure 为您的代码生成的部署脚本。
  2. 在更新文件之前修改它以重命名web.config

  3. 将其提交到您的存储库的根目录。现在 Kudu 将使用它而不是通用的。

以下是使用 Azure 进行自定义部署的完整摘要(第 3 部分中包含分步说明):123

更新 #2:

我已按照建议的步骤修改了 deploy.cmd @beatcracker 并在 KuduSync 步骤之前添加了两行......它仍然 不工作。

叹息。 IIS 监视文件\文件夹以拦截更改并相应地重新启动 AppDomains\AppPools。 The monitoring logic is complicated,至少可以这么说。所以你有两种方法来处理这个问题:

  1. 您可以花费不确定的时间来准确调试此锁定发生的原因。上面的链接有 ASPX 页面代码示例,它将显示请求数量、AppDomain 重新启动次数和活动目录监视器的数量。这是brackets issue thread on GitHub,其中讨论了类似的行为。它可能会提供一些见解。

  2. 您可以应用快速而肮脏的解决方法,然后继续处理生活中更重要的事情。我至少能想到两个:

    1. 在部署脚本中回收应用程序池:appcmd recycle apppool YourAppPool
    2. 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:

【讨论】:

  • 我使用的是 Azure,所以我假设他们使用的是最新版本的 KuduSync
  • 我会尽力按照您所说的去做并随时通知您。非常感谢!
  • @Subgurim 不客气。如果有任何问题,请在此处发布您的脚本,我会尽力提供帮助。
  • @beatcracket 我已经按照您的步骤编辑了我的原始帖子。谢谢!
  • @Subgurim 我已经更新了我的答案,其中包含一些关于 IIS 监控逻辑的变通办法和信息的想法。这是我能做的最好的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多