Gitlab CI 和 .NET Core - 无法通过 2 阶段构建获取 nuget 缓存

M U*_*M U 5 caching gitlab .net-core

我有这样的 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"]
Run Code Online (Sandbox Code Playgroud)

我无法在 Gitlab 构建上得到这个。

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

知道如何解决吗?由于没有 NuGet 缓存,构建时间如此之长......

Pro*_*log 8

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

但!dotnet restore附带一个--packages选项,您可以使用该选项指定在还原操作期间将还原的包放置在何处。如果你跑

dotnet restore --configfile NuGet.config --packages .nuget
Run Code Online (Sandbox Code Playgroud)

.nuget将在当前目录中创建一个目录,从而使其可用于缓存和复制操作。您甚至不需要担心告诉程序恢复的依赖项存储在哪里,因为该信息也会在恢复过程中保存。

我在代码审查上创建了一篇关于我遇到的相关问题的帖子。您很有可能会在那里找到有价值的东西。


Nor*_*des 0

我的问题是在 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
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助