如何解决无法从GitLab其他项目获取NuGet包的NU1301错误?
问题修复:GitLab CI构建Docker镜像时无法访问项目1的NuGet包注册表
问题背景
本地部署GitLab环境下,项目2依赖项目1发布在GitLab包注册表中的NuGet包,通过GitLab CI构建项目2的Docker镜像时,执行dotnet restore触发NU1301错误,无法加载项目1的NuGet源索引。尝试用sed替换nuget.config中的令牌占位符时,令牌被GitLab CI自动掩码为[MASKED],导致认证失败。项目2已通过项目1的CI/CD访问令牌配置获得权限。
修复方案1:在CI阶段预处理nuget.config(规避令牌掩码)
GitLab CI会自动对$CI_JOB_TOKEN进行掩码处理,在Docker内部替换会失效,因此先在CI环境中完成nuget.config的令牌替换,再传入构建上下文:
- 修改
.gitlab-ci.yml,在Docker构建前先替换占位符:
stages: - deploy deploy-solution: stage: deploy image: docker:20.10.16 services: - docker:20.10.16-dind before_script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY # CI阶段直接替换nuget.config中的占位符 - sed -i "s/PASSWORD/$CI_JOB_TOKEN/" nuget.config script: - docker build --pull -t $CI_REGISTRY_IMAGE --no-cache . - docker push $CI_REGISTRY_IMAGE only: - main
- 更新
nuget.config,将密码值改为占位符:
<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="gitlab" value="https://<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json" /> <add key="nuget" value="https://api.nuget.org/v3/index.json" /> </packageSources> <packageSourceCredentials> <gitlab> <add key="Username" value="gitlab-ci-token" /> <add key="ClearTextPassword" value="PASSWORD" /> </gitlab> </packageSourceCredentials> </configuration>
- 简化Dockerfile,移除令牌相关的ARG/ENV配置,直接复制预处理后的文件:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 # Build FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build ## 配置SSL证书 WORKDIR /usr/local/share/ca-certificates/ COPY ["ca.crt", "."] RUN update-ca-certificates -f ## 复制文件并构建 WORKDIR /src COPY ["nuget.config", "."] COPY ["Project2.API/Project2.API.csproj", "Project2.API/"] RUN dotnet restore "Project2.API/Project2.API.csproj" COPY . . WORKDIR "/src/Project2.API" RUN dotnet build "Project2.API.csproj" -c Release -o /app/build # Publish FROM build AS publish RUN dotnet publish "Project2.API.csproj" -c Release -o /app/publish /p:UseAppHost=false # Deploy FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "Project2.API.dll"]
修复方案2:直接在dotnet restore命令中传递令牌
不需要修改nuget.config,通过命令行参数指定带凭据的NuGet源:
- 修改Dockerfile的restore步骤,使用构建参数传入令牌:
# ... 其他代码保持不变 ... ARG TOKEN COPY ["Project2.API/Project2.API.csproj", "Project2.API/"] # 直接在restore命令中指定带认证的GitLab源 RUN dotnet restore "Project2.API/Project2.API.csproj" \ --source "https://api.nuget.org/v3/index.json" \ --source "https://gitlab-ci-token:${TOKEN}@<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json" # ... 其他代码保持不变 ...
.gitlab-ci.yml保持原有构建参数传递:
script: - docker build --pull -t $CI_REGISTRY_IMAGE --build-arg TOKEN=$CI_JOB_TOKEN --no-cache . - docker push $CI_REGISTRY_IMAGE
额外检查项
- 确认
$CI_JOB_TOKEN拥有项目1包注册表的读取权限:进入项目1 → 设置 → 包注册表 → 权限,验证项目2的CI/CD角色(或当前CI运行身份)具备读取权限。 - 测试SSL连通性:在Dockerfile的build阶段添加
curl -v https://<localdomain>/api/v4/projects/<project1_id>/packages/nuget/index.json,确认证书配置生效。 - 核实项目1的NuGet源地址:检查项目ID、域名拼写是否准确。
内容的提问来源于stack exchange,提问作者profou
相关产品推荐
相关产品推荐

