Caching Gitlab CI和.NET Core-Can';使用2阶段构建无法获取nuget缓存
我有这样的dockerfile: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
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核心版本不同。