【问题标题】:Failed to deploy web package to IIS website. By the Self-hosted Windows agent未能将 web 包部署到 IIS 网站。通过自托管 Windows 代理
【发布时间】:2019-08-21 13:16:26
【问题描述】:

无法将 web 包部署到 IIS 网站

我创建了一个 ASP.NET Core 应用程序和 Azure DevOps 持续集成 (CI) 和持续交付 (CD) 管道。

我已在本地计算机中创建并配置自托管 Windows 代理作为服务。它按预期工作。

当我第一次运行 CI/CD 管道时,它成功运行,并且 Web 应用程序成功发布到我的本地 IIS。

问题是当我向 Azure DevOps git 存储库提交另一个更新时,无法将 web 包部署到我的本地 IIS 网站,并出现以下错误和警告

2019-08-21T10:56:59.1480862Z ##[error]Failed to deploy web package to IIS website.
2019-08-21T10:56:59.1492670Z ##[warning]Can\'t find loc string for key: Trytodeploywebappagainwithrenamefileoptionselected
2019-08-21T10:56:59.1493093Z ##[warning]Trytodeploywebappagainwithrenamefileoptionselected
2019-08-21T10:56:59.1493421Z ##[error]Error Code: ERROR_FILE_IN_USE
More Information: Web Deploy cannot modify the file 'DemoWebApp.dll' on the destination because it is locked by an external process.  In order to allow the publish operation to succeed, you may need to either restart your application to release the lock, or use the AppOffline rule handler for .Net applications on your next publish attempt.  Learn more at: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE.
Error count: 1.

我已在发布配置文件 (.pubxml) 中配置 appOffline 规则,并将 EnableMSDeployAppOffline 元素添加到 PropertyGroup,如下所示:

<PropertyGroup>
  <EnableMSDeployAppOffline>true</EnableMSDeployAppOffline>
</PropertyGroup>

如更多信息的了解更多 URL http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_FILE_IN_USE 中所述。

仍然无法将 web 包部署到我的本地 IIS 网站,并出现相同的错误和警告。

当我尝试手动重新部署几次时,它会成功运行,否则会失败并出现相同的错误和警告。因为我认为文件在我的本地机器进程中被锁定了一段时间。

当我手动删除带有锁定文件的 IIS 发布文件夹中的所有文件时,它也可以成功运行。

需要帮助,文件被任何一个本地进程锁定。我找不到那个本地进程。我无法弄清楚这个问题。我也不知道我是否发现了这个过程,然后如何找出问题所在。这只是本地问题吗?

谁能帮帮我?

【问题讨论】:

    标签: azure-devops


    【解决方案1】:

    在“部署 IIS 应用”任务之前立即回收应用程序池。 将“WinRM - IIS Web 应用管理”任务添加到您的发布管道。将配置类型设置为“IIS 应用程序池”,将“操作”设置为回收,并在“应用程序池名称”字段中输入应用程序池名称。

    回收应该解锁 dll 并允许在部署步骤中删除和替换它。

    【讨论】:

    • 这对我有用,但是我使用了 IIS Web 应用程序管理。我的猜测是 WinRM 是用于当 WinRM 用于远程管理而不是 devops 代理时?
    • 我不确定这两个任务之间有什么区别。它们的功能似乎有很大的重叠。
    【解决方案2】:

    尽管 Take App Offline 选项设置了很长时间,但我遇到了同样的错误。那不可能是解决办法。这里发生了一些幻影错误,但我确实在不重新启动服务器的情况下解决了它。

    • 在 PROCMON 中,我 searched Associated Handles 为正在使用的文件。没有。
    • 我尝试彻底删除应用程序的 DLL 文件;一条错误消息说它正在被 w3wp.exe 使用,即使该网站已离线并且应用程序池已停止。
    • 我通过打开 IIS 并查看 the worker processes panel 确认了这一点。没有任何活动的w3wp.exe PID 与我尝试更新的应用程序相关。
    • 我打开 PROCMON 并按映像名称排序,以找到任何仍在运行的 W3WP.exe 实例。有一个暂停的实例,它不会让我终止(尽管以管理员/具有提升的身份运行 PROCMON)。它只是说“访问被拒绝。”
    • 我通过“服务”窗口重新启动了服务器上的代理。

    那时,我能够从目标目录中删除应用程序 DLL 并从 DevOps 管道正常部署。

    希望这不会在生产中发生。

    【讨论】:

      【解决方案3】:

      我正在使用 IIS Web App Deploy 任务在本地 iis 上部署我的网络应用程序。我能够重现相同的错误。如果我在尝试部署新版本时访问我的网站,我发现会发生此错误。并且部署任务未能更新 .dll 文件,因为它正在使用中。

      我通过勾选“Take App Offline”选项修复了这个错误,见下图。

      如果您使用不同的任务来部署您的网络应用程序,请告诉我。

      【讨论】:

      • 即使我选中了这个选项,我也无法部署我的应用程序,作为一种解决方法,我正在使用 IIS 实用程序任务来停止和启动网站,你能指导我这里有什么问题吗?我错过了什么吗?
      • 对我来说设置 [TakeAppOfflineFlag: true] 也没有用
      猜你喜欢
      • 1970-01-01
      • 2020-05-30
      • 2015-05-28
      • 2019-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多