Azure Pipeline中csproj构建阶段间歇性失败(DotNetCoreCLI@2)
问题现象
用DotNetCoreCLI@2任务构建基于Microsoft.NET.Sdk.Functions 4.2.0的csproj项目时,经常出现间歇性构建失败:
- 偶尔重试构建步骤就能成功,但有时会反复报错
- 核心错误是文件被其他进程占用,具体日志如下:
[warning]C:\Users\VssAdministrator.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(70,5): Warning MSB3026: Could not copy "D:\a\1\s\publish_output\RectangularChamber\Microsoft.AspNetCore.Http.dll" to "D:\a\1\s\publish_output\RectangularChamber\bin\Microsoft.AspNetCore.Http.dll". Beginning retry 1 in 1000ms. The process cannot access the file 'D:\a\1\s\publish_output\RectangularChamber\bin\Microsoft.AspNetCore.Http.dll' because it is being used by another process.
C:\Users\VssAdministrator.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(70,5): warning MSB3026: Could not copy "D:\a\1\s\publish_output\RectangularChamber\Microsoft.AspNetCore.Http.dll" to "D:\a\1\s\publish_output\RectangularChamber\bin\Microsoft.AspNetCore.Http.dll". Beginning retry 1 in 1000ms. The process cannot access the file 'D:\a\1\s\publish_output\RectangularChamber\bin\Microsoft.AspNetCore.Http.dll' because it is being used by another process. [D:\a\1\s_Assets\AccessCover\src\AccessCover.csproj]
##[error]C:\Users\VssAdministrator.nuget\packages\microsoft.net.sdk.functions\4.2.0\build\Microsoft.NET.Sdk.Functions.Build.targets(32,5): Error : System.IO.IOException: The process cannot access the file 'D:\a\1\s\publish_output\RectangularChamber\Register\function.json' because it is being used by another process.
这个问题没有稳定的复现步骤,同类问题已有记录但未得到彻底解决。
解决方案尝试
1. 升级Microsoft.NET.Sdk.Functions包
4.2.0版本存在已知的文件锁竞争问题,升级到4.3.0及以上版本,后续版本优化了构建时的文件访问逻辑,能有效缓解这类问题。
2. 强制清理+禁用增量构建
在构建任务前加一个命令行任务执行清理:
dotnet clean --verbosity normal
同时在DotNetCoreCLI@2任务的参数里加上--no-incremental,禁用增量构建,避免缓存文件引发锁冲突:
- task: DotNetCoreCLI@2 displayName: 'Build project' inputs: command: 'build' projects: '**/*.csproj' arguments: '--configuration Release --no-incremental'
3. 修改发布输出目录
别用默认的相对输出目录,指定一个独立的、每次构建都会清空的目录,减少文件复用带来的锁竞争。可以在csproj里加配置:
<PropertyGroup> <PublishDir>$(Build.ArtifactStagingDirectory)/publish/$(AssemblyName)</PublishDir> </PropertyGroup>
或者在构建任务的参数里指定--output:
arguments: '--configuration Release --output $(Build.ArtifactStagingDirectory)/publish'
4. 给构建任务加自动重试
在Azure Pipeline里给构建任务配置自动重试,用重试策略覆盖间歇性失败:
- task: DotNetCoreCLI@2 displayName: 'Build project' inputs: command: 'build' projects: '**/*.csproj' arguments: '--configuration Release' retryCountOnTaskFailure: 3
5. 排除构建目录的系统扫描(自托管代理)
如果用的是自托管代理,检查代理机器上的Windows搜索索引、杀毒软件是否在扫描构建输出目录,这些进程可能会锁定文件。临时禁用扫描或者把构建目录加入排除列表,验证是否解决问题。
内容的提问来源于stack exchange,提问作者MonkeyFace

