使用 git deploy 进行 Azure 网站远程调试不起作用

Posted

技术标签:

【中文标题】使用 git deploy 进行 Azure 网站远程调试不起作用【英文标题】:Azure Website Remote Debugging with git deploy not working 【发布时间】:2013-11-21 01:28:07 【问题描述】:

我一直在尝试 Azure 网站的新远程调试功能,但我想我可能遇到了一个问题:只有使用 Web Publish 才能使其正常工作。如果我使用本地 git deploy 部署站点,调试器会附加但未加​​载调试符号(断点显示警告)。

我尝试将发布配置设置为包含 PDB 文件(因为 Azure 的 git deploy 默认使用发布配置),并使用由 azure site deploymentscript 命令详细生成的自定义部署脚本 here 并将构建命令设置为使用调试配置。在这两种情况下,我仍然遇到符号未加载的相同问题。

我觉得问题可能是以下之一:

    Azure 在 Web 发布后运行某种自定义操作,必须运行该操作才能允许远程调试 git 部署脚本使用的构建选项缺少某种标志,导致 Web 应用程序不显示 PDB 输出(我认为这不太可能) 当站点实际运行和按需编译时,Azure 不支持我在部署脚本中使用的配置

最终我希望编写一些自动化部署脚本,我更愿意使用 git 部署而不是 Web Publish 来完成此任务。真正让我感到困惑的是,即使将发布配置设置为包含 PDB 文件,它也会失败。这真的让我觉得必须在 Azure for Web Publish 上做一些额外的事情,而这不是为 git 部署做的。有没有人知道是什么导致了这里的差异?

自定义 Git 部署脚本

我包含azure site deploymentscript 生成的自定义部署脚本以供参考并显示它使用的构建标志。相关部分在:: Deployment 部分之后。

@if "%SCM_TRACE_LEVEL%" NEQ "4" @echo off

:: ----------------------
:: KUDU Deployment Script
:: Version: 0.1.5
:: ----------------------

:: Prerequisites
:: -------------

:: Verify node.js installed
where node 2>nul >nul
IF %ERRORLEVEL% NEQ 0 (
  echo Missing node.js executable, please install node.js, if already installed make sure it can be reached from current environment.
  goto error
)

:: Setup
:: -----

setlocal enabledelayedexpansion

SET ARTIFACTS=%~dp0%..\artifacts

IF NOT DEFINED DEPLOYMENT_SOURCE (
  SET DEPLOYMENT_SOURCE=%~dp0%.
)

IF NOT DEFINED DEPLOYMENT_TARGET (
  SET DEPLOYMENT_TARGET=%ARTIFACTS%\wwwroot
)

IF NOT DEFINED NEXT_MANIFEST_PATH (
  SET NEXT_MANIFEST_PATH=%ARTIFACTS%\manifest

  IF NOT DEFINED PREVIOUS_MANIFEST_PATH (
    SET PREVIOUS_MANIFEST_PATH=%ARTIFACTS%\manifest
  )
)

IF NOT DEFINED KUDU_SYNC_CMD (
  :: Install kudu sync
  echo Installing Kudu Sync
  call npm install kudusync -g --silent
  IF !ERRORLEVEL! NEQ 0 goto error

  :: Locally just running "kuduSync" would also work
  SET KUDU_SYNC_CMD=node "%appdata%\npm\node_modules\kuduSync\bin\kuduSync"
)
IF NOT DEFINED DEPLOYMENT_TEMP (
  SET DEPLOYMENT_TEMP=%temp%\___deployTemp%random%
  SET CLEAN_LOCAL_DEPLOYMENT_TEMP=true
)

IF DEFINED CLEAN_LOCAL_DEPLOYMENT_TEMP (
  IF EXIST "%DEPLOYMENT_TEMP%" rd /s /q "%DEPLOYMENT_TEMP%"
  mkdir "%DEPLOYMENT_TEMP%"
)

IF NOT DEFINED MSBUILD_PATH (
  SET MSBUILD_PATH=%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild.exe
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Deployment
:: ----------

echo Handling .NET Web Application deployment.

:: 1. Restore NuGet packages
IF /I "azure-test.sln" NEQ "" (
  call "%NUGET_EXE%" restore "%DEPLOYMENT_SOURCE%\azure-test.sln"
  IF !ERRORLEVEL! NEQ 0 goto error
)

:: 2. Build to the temporary path
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
  %MSBUILD_PATH% "%DEPLOYMENT_SOURCE%\azure-test\azure-test.csproj" /nologo /verbosity:m /t:Build /t:pipelinePreDeployCopyAllFilesToOneFolder     /p:_PackageTempDir="%DEPLOYMENT_TEMP%";AutoParameterizationWebConfigConnectionStrings=false;Configuration=Debug /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\"     %SCM_BUILD_ARGS%
) ELSE (
  %MSBUILD_PATH% "%DEPLOYMENT_SOURCE%\azure-test\azure-test.csproj" /nologo /verbosity:m /t:Build     /p:AutoParameterizationWebConfigConnectionStrings=false;Configuration=Debug /p:SolutionDir="%DEPLOYMENT_SOURCE%\.\\" %SCM_BUILD_ARGS%
)

IF !ERRORLEVEL! NEQ 0 goto error

:: 3. KuduSync
IF /I "%IN_PLACE_DEPLOYMENT%" NEQ "1" (
  call %KUDU_SYNC_CMD% -v 50 -f "%DEPLOYMENT_TEMP%" -t "%DEPLOYMENT_TARGET%" -n "%NEXT_MANIFEST_PATH%" -p "%PREVIOUS_MANIFEST_PATH%" -i ".git;.hg;.deployment;deploy.cmd"
  IF !ERRORLEVEL! NEQ 0 goto error
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: Post deployment stub
call %POST_DEPLOYMENT_ACTION%
IF !ERRORLEVEL! NEQ 0 goto error

goto end

:error
echo An error has occurred during web site deployment.
call :exitSetErrorLevel
call :exitFromFunction 2>nul

:exitSetErrorLevel
exit /b 1

:exitFromFunction
()

:end
echo Finished successfully.

【问题讨论】:

做了更多检查并在本地运行 git 部署脚本并在 IIS Express 中启动该站点,并能够将调试器附加到它。因此,没有理由不能在 Azure 上运行完全相同的输出。听起来 Azure 在 Web Publish 上采取了额外的步骤,而 git deploy 没有这样做? 【参考方案1】:

2014 年 2 月 8 日更新

在 WAWS 中进行了一些修复,现在可以在使用 git 时通过让 VS 正确加载服务器端 PDB 来进行调试。为了让它工作,你需要做两件事之一(即你不需要同时做这两件事)。它可以在 VS 2012 和 2013 中运行。

    关闭仅我的代码调试:只需在 VS 调试器设置中关闭该设置,然后尝试调试您的 Azure 网站。 在调试模式下构建:要在服务器构建中执行此操作,您可以转到 Azure 门户并添加名为 SCM_BUILD_ARGS 的 ApSetting,其值为 -p:Configuration=Debug(更多详细信息 here)。然后转到部署页面并点击重新部署按钮(对于当前部署)。然后从 VS 附加,它应该一切正常!

原答案

确实,这在今天行不通,我们正在尝试看看如何让它发挥作用。从根本上讲,问题似乎是 Visual Studio 调试器希望在客户端找到 PDB,而在 git 情况下它们只存在于服务器上。

article 讨论了调试器在 2010 年和更新版本之间的工作方式的变化,这可能会影响事情。

需要进行更多调查,但这是目前的情况。

【讨论】:

啊,我明白了。因此,我在 Tools -> Debugging -> Symbols 下为调试符号添加了本地构建输出文件夹的路径,现在我可以在进行远程调试时遇到断点。当我编写部署脚本以进行本地构建并将 PDB 输出发送到公共文件夹时,我会牢记这一点。希望将来能找到更自动化的解决方案。暂时将此标记为答案。谢谢! 哦,这很有趣。因此,即使客户端上的 PDB 不是使用服务器上的 DLL 构建的,它仍然可以工作。我认为它比那更严格。感谢分享! @BryanHelms 我和你有同样的 Git 部署问题,现在正试图“让它工作”。我不太明白你在调试符号选项中做了什么来使它工作。我不太明白我在那个对话框中在做什么? 现在可以完成这项工作。请查看我的更新答案。 好久没来看这个了。很高兴听到更新!一定要试一试。【参考方案2】:

我在 .Net Core Azure Function 项目中遇到了这个问题,使用 Cloud Explorer 右键单击​​功能进行附加。以下 github 问题说明了这一点,但解决方案并没有解决我的问题:

https://github.com/Azure/Azure-Functions/issues/872

我终于在这里偶然发现了答案:

http://dontcodetired.com/blog/post/Remote-Debugging-Azure-Functions-V2-The-breakpoint-will-not-currently-be-hit-No-symbols-have-been-loaded-for-this-document

归结为手动附加到 Azure 中的进程,而不是依赖于 Cloud Explorer 右键单击​​功能。

【讨论】:

以上是关于使用 git deploy 进行 Azure 网站远程调试不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Azure 网站上的 Kudu 部署非常慢

Azure 上的 Flask APP 给出 import cv2 ImportError: libGL.so.1: after deployment

azurew网站持续部署 - Web Deploy无法修改目标上的文件“XXX”,因为它已被外部进程锁定

更新(重新部署)现有的 azure webjob

使用 Web Deploy 在 Azure 中部署普通的 ASP.NET Core 2.2 Web 应用程序会引发错误

Capistrano使用rvm和git进行部署[git release fail]