自承载代理(用于Azure管道)使用不正确的MSBuild版本

bmvo0sr5  于 2022-12-14  发布在  其他
关注(0)|答案(1)|浏览(114)

当使用Azure的自托管构建代理构建解决方案时,我会显式设置要使用的MSBuild版本,既可以在管道中的MSBuild任务中使用,也可以作为构建参数的一部分使用。
然而,当构建正在执行时,它使用的是一个旧得多的MSBuild版本,但我无法确定原因。

我还验证了它 * 是 * v12.0,它正在运行,正如我在diagnostic mode中的日志中看到的那样;

39>GenerateTargetFrameworkMonikerAttribute:
   Skipping target "GenerateTargetFrameworkMonikerAttribute" because all 
   output files are up-to-date with respect to the input files.
   CoreCompile:
     C:\Program Files (x86)\MSBuild\12.0\bin\Csc.exe 
     /noconfig /nowarn:1701,1702 
     /nostdlib+ /platform:x86 
     /errorreport:prompt /warn:4 
     /highentropyva+ 
     /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\mscorlib.dll" 
     /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Configuration.dll" 
     /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.Core.dll" 
     /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.8\System.dll" 
     /reference:C:\Users\<user>\Files\BuildAgents\ProdAgent1\_work\12\s\src\packages\Thinktecture.IdentityModel.Owin.ResourceAuthorization.1.1.0\lib\net45\Thinktecture.IdentityModel.Owin.ResourceAuthorization.dll 
     /debug:pdbonly /filealign:512 
     /optimize+ /out:obj\Release\Common.Security.dll 
     /subsystemversion:6.00 
     /target:library 
     /utf8output Authorization\CoreAuthorizationManager.cs 
                 Configuration\FrameworkMode.cs 
                 Configuration\IdentityConstants.cs                      
                 Configuration\LoggingConfig.cs                      
                 Configuration\SecurityConfig.cs                      
                 Configuration\Settings\ConfigFileLoggingSettingsProvider.cs                      
                 Configuration\Settings\ConfigFileSecuritySettingsProvider.cs                      
                 Configuration\Settings\ILoggingSettingsProvider.cs                      
                 Configuration\Settings\ISecuritySettingsProvider.cs                      
                 Configuration\Settings\LoggingSettings.cs                      
                 Configuration\Settings\SecuritySettings.cs                      
                 Configuration\Settings\SettingsHelper.cs                      
                 Configuration\TokenClientConfig.cs                      
                 Configuration\WebClientConfig.cs                      
                 Diagnostics\ILogger.cs                      
                 Diagnostics\Logger.cs                      
                 Diagnostics\LogHelper.cs                      
                 Diagnostics\LogHelper.Exceptions.cs                      
                 Extensions\ClaimsExtensions.cs                      
                 Extensions\ResourceAuthorizationContextExtensions.cs                      
                 Properties\AssemblyInfo.cs                      
                 SecurityFrameworkException.cs "C:\Users\{user}\AppData\Local\Temp\.NETFramework,Version=v4.8.AssemblyAttributes.cs"

我还检查了用户和系统环境变量,以查看是否设置了显式引用MSBuild版本12.0的任何内容,并且(在代码或环境中)找不到任何内容。如何强制代理使用17.0
MSBuild任务的yaml为:

steps:
- task: MSBuild@1
  displayName: 'MSBuild solution src/{sln}.sln'
  inputs:
    solution: src/{sln}.sln
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'
    msbuildArguments: '/verbosity:normal/p:VisualStudioVersion=17.0 /m:1 /p:GenerateSerializationAssemblies=Off /p:Platform="Auto"'
    clean: true
    createLogFile: true

更新

我已经在评论中应用了下面的几个建议,并得到了以下结果;

1尝试的内容

安装新的生成代理

1个结果

使用最新版本的Azure代理并将其安装到同一Azure池中,仍会导致代理选择MSBuild V 12,而不是管道任务中配置的设置。

2尝试的内容

将生成任务更改为Visual Studio生成。

2个结果

组建仍会选择MSBuild V 12来自行进行组建。

3尝试的内容

指定msbuild.exe的位置,而不是指定版本。

3个结果

这 * 确实 * 在指定的位置选取了正确的msbuild.exe,但现在生成在v 12 MSBuild文件夹中查找targets文件...时中断。错误消息为;

C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(67,3): 
Error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.NETFramework.props" was not found. 
Confirm that the expression in the Import declaration "Microsoft.NETFramework.props" is correct, and that the file exists on disk.

4尝试的内容

在Visual Studio版本上运行修复

4个结果

没有效果。仍在挑选msbuild.exe的错误版本

5尝试的内容

针对代理下载的解决方案手动运行正确版本的msbuild.exe

5个结果

生成失败...但实际上生成了大多数项目。解决方案中有9/~60个项目失败。每个失败项目的消息如下所示;

"C:\agent\_work\1\s\src\{sln}.sln" (default target) (1) ->
"C:\agent\_work\1\s\src\Tools\MakeTestSmartCard\MakeTestSmartCard.csproj" (default target) (133) ->
  C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets(67,3): 
error MSB4019: The imported project "C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.NETFramework.props" was 
   not found. Confirm that the expression in the Import declaration "Microsoft.NETFramework.props" 
   is correct, and that the file exists on disk. 
[C:\agent\_work\1\s\src\Tools\MakeTestSmartCard\MakeTestSmartCard.csproj]

它 * 几乎 * 工作。但仍然有一些东西重定向部分的建设。

bvjveswy

bvjveswy1#

此虚拟机上安装了哪些版本的Visual Studio?一位客户遇到了类似的问题,他们重新安装了Visual Studio。
您是否可以检查在“代理功能:
https://stackoverflow.com/a/52828794/8843952
此外,这看起来有点相同:
https://developercommunity.visualstudio.com/t/azure-pipelines-msbuild-vstest-cannot-find-msbuild/937549

更新

由于您认为VS2022安装已经打乱了您的虚拟机,这些链接在搜索MSBuild时可能很有用:

升级到vsbuild:https://learn.microsoft.com/en-us/azure/devops/pipelines/tasks/reference/vsbuild-v1?view=azure-pipelines
仅供参考,我刚刚检查了客户,我们在那里做了重新安装,为所有的yaml管道,他们正在使用的vsbuild现在。这可能做的伎俩,你也。

相关问题