由于文件锁定(msvcr100.dll),TFS CI构建到Azure Web App(App Service)失败

Dal*_*ale 5 c# tfs azure visual-studio-2013

问题

尝试从TFS CI发布到Azure Web App时出现部署错误.文件被锁定,这会阻止构建更新.

症状

  • 手动发布(Web部署从Visual Studio内部发布)通常会成功.
  • 停止Web应用程序和发布允许它成功,但是如果我们需要每次都需要停止并启动Web App,那么这会破坏我们的CI.
  • CI发布到Web角色和工作者角色似乎没有此问题,我们只在发布到Web Apps(以前的Web站点,当前的Azure门户术语现在是App Service)时才会发布它.
  • 只有通过TFS从CI版本发布才能以这种方式一致地失败.

错误

Web部署任务失败.(Web部署无法修改目标上的文件'msvcr100.dll',因为它被外部进程锁定.为了允许发布操作成功,您可能需要重新启动应用程序以释放锁定,或者使用适用于下次发布尝试的.Net应用程序的AppOffline规则处理程序.有关详细信息,请访问:http://go.microsoft.com/fwlink/?LinkId = 221672 #ERROR_FILE_IN_USE .)

链接中的信息不是很有帮助.

ERROR_FILE_IN_USE诊断 - 无法覆盖或删除目标文件,因为它当前正在使用中.解决方案 - 确保在执行同步之前未使用目标文件.如果要将内容同步到IIS 7或更高版本上托管的网站(使用appHostConfig,iisApp或contentPath提供程序),请考虑通过启用appOffline规则在同步期间使应用程序脱机.

尝试过的决议

编辑

如何在发布时使Web应用程序脱机?处理使用EnableMSDeployAppOffline配置使应用程序脱机 - 遗憾的是,在通过Visual Studio(而不是CI)执行WebDeploy时,似乎只支持此配置.

Edd*_*SFT 2

您可以使用CI 中的Web Deploy v3来部署 Web 应用程序。

在 Web Deploy V3 中,我们添加了在发布 ASP.Net 应用程序之前自动使其脱机的支持。如果用户想要确保其应用程序不会对某个文件(例如,一次只允许一个连接到该文件的 SQL CE sdf 文件)进行覆盖锁定,或者如果他们想要确保访问者他们的网站不能影响发布过程。发布过程完成后,App_Offline.htm 文件将被删除,站点将再次上线。

或者,您可以添加如下所示的 PowerShell 脚本来将 Web 应用程序部署到 Azure:

    param($websiteName, $packOutput)

    $website = Get-AzureWebsite -Name $websiteName

    # get the scm url to use with MSDeploy.  By default this will be the second in the array
    $msdeployurl = $website.EnabledHostNames[1]


    $publishProperties = @{'WebPublishMethod'='MSDeploy';
                            'MSDeployServiceUrl'=$msdeployurl;
                            'DeployIisAppPath'=$website.Name;
                            'Username'=$website.PublishingUsername;
                            'Password'=$website.PublishingPassword}

    Write-Output "Stopping web app..."
Stop-AzureWebsite -Name $websiteName

Write-Output "Publishing web app..."
$publishScript = "${env:ProgramFiles(x86)}\Microsoft Visual Studio 14.0\Common7\IDE\Extensions\Microsoft\Web Tools\Publish\Scripts\default-publish.ps1"

. $publishScript -publishProperties $publishProperties  -packOutput $packOutput

Write-Output "Starting web app..."
Start-AzureWebsite -Name $websiteName
Run Code Online (Sandbox Code Playgroud)

参考来源:https://msdn.microsoft.com/en-us/Library/vs/alm/Build/azure/deploy-aspnet5