You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决无法从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的令牌替换,再传入构建上下文:

  1. 修改.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
  1. 更新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>
  1. 简化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源:

  1. 修改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"
# ... 其他代码保持不变 ...
  1. .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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 06:07:03