在GitHub Runner(Ubuntu环境)中构建.NET项目时遭遇‘N/A’无效版本字符串错误的排查咨询
从你的描述来看,问题出在NuGet还原阶段的版本解析,而且只在GitHub Runner环境中出现(命令行手动执行正常),还带有“成功两次后持续失败”的奇怪现象,我们可以从以下几个方向逐步排查:
1. 先定位问题根源:找出哪个版本字符串变成了"N/A"
错误提示'N/A' is not a valid version string,但没说清楚是哪个包或项目的版本出问题。你可以修改Build步骤的命令,添加详细日志参数,获取更具体的信息:
dotnet publish --configuration Release ./Gif -v detailed
详细日志会打印出还原过程中每个包的版本解析情况,能直接找到导致N/A的来源(比如某个PackageReference的版本变量未定义,或者项目自身的Version配置有问题)。
2. 清理缓存:解决“成功两次后失败”的不稳定问题
GitHub Runner的缓存(包括NuGet缓存、构建输出缓存)很可能是导致不稳定的原因——前两次构建可能用了干净的缓存,之后缓存了错误的版本信息。你可以在构建流程中强制清理这些缓存:
- 在Setup .NET步骤前添加NuGet缓存清理:
dotnet nuget locals all --clear - 在Build步骤前添加项目清理:
dotnet clean --configuration Release ./Gif
同时,把你的Cleanup步骤改成更精准的工作目录清理(避免误删Runner系统文件):
rm -rf $GITHUB_WORKSPACE/*
3. 检查环境变量:排除变量冲突
虽然你设置了VERSION: "123",但Runner环境中可能存在其他干扰变量(比如系统级的VERSION变量,或者NuGet相关的环境变量)。你可以在Build步骤前添加一个打印环境变量的步骤,对比命令行和Runner环境的差异:
env
重点关注和版本、NuGet相关的变量(比如VERSION、NUGET_VERSION、DOTNET_VERSION等),看Runner中是否有未预期的变量值覆盖了你的配置。
4. 检查项目文件的版本配置
打开你的GifOnboarding.csproj或解决方案文件,查看是否有依赖VERSION变量的版本配置,比如:
<Version>$(VERSION)</Version>
如果有这种配置,先尝试换成固定版本(比如<Version>123</Version>)测试,看是否还会出现N/A错误。如果固定版本正常,说明是变量传递的问题——可能Runner中VERSION变量没有正确传递到MSBuild进程中。
5. 排查Root用户权限问题
你的Runner以root身份运行,可能存在缓存目录权限异常的情况:比如之前的构建残留了普通用户权限的缓存文件,导致root用户无法正确读写。你可以手动检查NuGet缓存目录的权限:
ls -ld /root/.nuget/packages
确保该目录及其子文件的所有者是root,如果不是,执行以下命令修复:
chown -R root:root /root/.nuget/packages
修改后的示例YAML配置
结合以上排查步骤,你可以更新你的构建YAML,添加必要的调试和清理步骤:
name: .NET-main on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: self-hosted steps: - name: Cleanup workspace run: rm -rf $GITHUB_WORKSPACE/* - uses: actions/checkout@v2 - name: Print environment variables run: env - name: Clean NuGet cache run: dotnet nuget locals all --clear - name: Setup .NET uses: actions/setup-dotnet@v1 with: dotnet-version: 3.1.x - name: Clean project run: dotnet clean --configuration Release ./Gif - name: Build with detailed logs env: VERSION: "123" run: dotnet publish --configuration Release ./Gif -v detailed - name: Deploy run: | cp -a ./Gif/GifOnboarding/bin/Release/netcoreapp3.1/* /var/www/dotnet/
通过以上步骤,你应该能定位到具体的问题点,解决构建不稳定的问题。
内容的提问来源于stack exchange,提问作者Vojtech B

