Azure" KuduSync.NET"在多个azure网站中使用git部署时出错

时间:2015-02-18 11:26:20

标签: git azure deployment

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

有什么想法吗?

1 个答案:

答案 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)。

  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将使用它而不是通用的。
  4. 以下是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
        
      3. 为简化部署,您可以在git仓库中加入handle.exe,以便自动部署。

        相关的XKCD:

        XKCD Strip