Caching Gitlab CI和.NET Core-Can';使用2阶段构建无法获取nuget缓存

Caching Gitlab CI和.NET Core-Can';使用2阶段构建无法获取nuget缓存,caching,.net-core,gitlab,Caching,.net Core,Gitlab,我有这样的dockerfile: FROM microsoft/aspnetcore-build:2.0 AS build-env WORKDIR /app # Copy csproj and restore as distinct layers COPY *.csproj ./ COPY *.config ./ RUN dotnet restore --configfile NuGet.config # Copy everything else and build C

我有这样的dockerfile:

FROM microsoft/aspnetcore-build:2.0 AS build-env WORKDIR /app

    # Copy csproj and restore as distinct layers 
COPY *.csproj ./ 
COPY *.config ./ 
RUN dotnet restore --configfile NuGet.config
    # Copy everything else and build 
COPY . ./ RUN dotnet publish -c Release -o out

# Build runtime image 
FROM microsoft/aspnetcore:2.0 
WORKDIR /app 
COPY --from=build-env /app/out . 
ENV ASPNETCORE_URLS http://+:5000 
ENTRYPOINT ["dotnet", "AuthService.dll"]
我无法在Gitlab build上实现这一点

整个Nuget缓存位于
~/.Nuget/packages
下的
build env
中,但Gitlab不知何故没有看到这一点(我想它只检查最后一个容器)


知道如何解决吗?由于没有NuGet缓存,构建时间太长了…

我的问题是在docker容器中使用Gitlab CI时。因此答案可能与您预期的略有不同

通过尝试许多事情,我发现了问题所在。Gitlab CI将
.nuget
文件夹放在
~/
(主页)下用户的目录。但是,当您启动CI时,您启动的文件夹不是
~/
文件夹,并且找不到
.nuget
。为了使其在
.gitlab CI.yml
中工作,我已执行以下操作:

# Some stuff before
build-dotnet: 
  image: microsoft/dotnet:2.0-sdk-jessie
  stage: build
  cache:
    paths:
      - nuget

  script: 
    - (if [ -d ./nuget ]; then mv nuget ~/.nuget; else echo "No nuget cache available"; fi); # Fail on first attempt, but will work after.
    - # etc.
    - mv ~/.nuget nuget
# Some stuff after

我希望它有帮助

dotnet restore
默认情况下,将还原的依赖项存储在用户主目录中的
.nuget/packages
目录中(
/home/user1
在Linux上或
C:\Users\user1
在Windows上).User的主目录超出GitLab缓存的范围。这就是为什么您将无法缓存存储在NuGet默认目录中的依赖项

但是!
dotnet restore
附带了一个
--packages
选项,您可以使用该选项指定还原操作期间还原的包的放置位置

dotnet restore --configfile NuGet.config --packages .nuget
将在当前目录中创建一个
.nuget
目录,从而使其可用于缓存和复制操作。您甚至不必担心告诉程序还原的依赖项存储在哪里,因为在还原过程中也会保存这些信息


我为我遇到的相关问题创建了一个关于代码的评论。你很有可能会在那里找到一些有价值的东西。

我正在用GitLab ci构建一个多阶段的.net docker映像,并通过保存中间映像来缓存nuget包。这对.net 5 asp项目有效,但应该对上面的docker文件也有效,就像这样s:

.gitlab-ci.yml:

build:
  stage: build
  script:
    # target and cache build stage
    - docker pull $CI_REGISTRY_IMAGE/build:latest || true
    - >
      docker build
      -f PathTo/Dockerfile
      -t ${CI_REGISTRY_IMAGE}/build:latest
      --cache-from ${CI_REGISTRY_IMAGE}/build:latest
      --target build-env
      .
    - docker push ${CI_REGISTRY_IMAGE}/build:latest
    # target and cache final stage
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - >
      docker build 
      -f PathTo/Dockerfile 
      -t ${CI_REGISTRY_IMAGE}:${CI_COMMIT_SHA}
      --cache-from ${CI_REGISTRY_IMAGE}:latest
      --cache-from ${CI_REGISTRY_IMAGE}/build:latest
      .
    - docker push ${CI_REGISTRY_IMAGE}:latest
  tags: 
    - docker

查看此处了解更多信息:

你找到它放在哪里了吗?我试过
~/.nuget
.nuget
但都失败了。派对有点晚了,但是否有一个实际的工作示例,我们在这个问题上绞尽脑汁已经有一段时间了。应该更简单。阅读上面链接的帖子,但仍然我不工作。如果你正在使用Docker,那么很遗憾,我没有更多的东西可以提供给你。如果只是针对GitLab上的.NET核心项目,那么请在我的项目中签出GitLab CI配置文件,例如涵盖构建、测试、打包和部署NuGet库或提供大量注释。谢谢@Prolog指向你的项目的链接似乎很有用uld将是一个巨大的帮助。不使用docker,所以这应该可以解决我们的问题。您是否可以与我共享您的构建配置,基本上就是此
--配置${build\u configuration}
${VARIABLE\u NAME}
标记一个变量,您也可以只写
$variable\u NAME
,不带花括号。所有公共变量都列在配置文件的顶部,就在映像规范之后。由于链接的配置是用于库的,因此它还带有一些私有变量,存储在项目CI/CD设置中,例如Nu获取用于发布库的API密钥。该示例可能更容易理解,因为它没有打包和部署阶段,但请注意使用的.NET核心版本不同。