Gitlab CI和.NET Core - 无法在两阶段构建中获取Nuget缓存

5

I have dockerfile like that:

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构建中找不到它。

整个Nuget缓存位于build-env下的~/.nuget/packages,但Gitlab似乎没有看到它(我想它只检查最后一个容器)。

有什么解决方法吗?由于没有NuGet缓存,构建时间很长...


你找到它存放在哪里了吗?我已经尝试了 ~/.nuget.nuget,但都失败了。 - Nordes
3个回答

8
dotnet restore默认会将恢复的依赖项存储在用户主目录下的.nuget/packages目录中(Linux上为/home/user1,Windows上为C:\Users\user1)。用户主目录不在GitLab缓存范围内,这就是为什么您无法缓存存储在NuGet默认目录中的依赖项的原因。

但是!dotnet restore带有一个--packages选项,您可以使用它指定在还原操作期间恢复软件包的位置。如果运行:

dotnet restore --configfile NuGet.config --packages .nuget

在当前目录中会创建一个名为.nuget的文件夹,以便进行缓存和复制操作。您甚至不需要担心告诉程序恢复的依赖项存储在哪里,因为该信息也会在恢复期间保存。
我在Code Review上发布了一个帖子,涉及到我的相关问题。您有很大的机会在那里找到有价值的东西。

有点晚了,但这个问题是否有实际可行的示例呢?我们一直在为此问题苦恼。应该更简单些。已阅读上面链接的帖子,但仍然无法解决。 - devtoka
1
如果您正在使用Docker,那么很遗憾我没有更多可以提供的了。如果只是针对GitLab上的.NET Core项目,请查看我的项目中的GitLab CI配置文件,例如这个,其中包括构建、测试、打包和部署NuGet库,或者使用这个.NET Core项目的示例GitLab CI模板,其中有详细的注释。 - Prolog
谢谢@Prolog,你的项目链接看起来会非常有帮助。我们不使用docker,所以这应该能解决我们的问题。 - devtoka
你能否与我分享你的构建配置,也就是传递给 --configuration ${BUILD_CONFIGURATION} 的内容? - devtoka
${VARIABLE_NAME} 标记一个变量,你也可以只写 $VARIABLE_NAME 而不需要花括号。所有公共变量都列在配置文件的顶部,紧接着图像规范。由于链接的配置是针对库的,它还带有一些私有变量,存储在项目 CI/CD 设置中,例如用于发布库的 NuGet API 密钥。这个 示例可能更容易理解,因为它没有打包和部署阶段,但请注意使用了不同的 .NET Core 版本。 - Prolog
谢谢,我熟悉变量并且认为构建配置是私有的,只是想知道是否有特定的方法来使缓存工作。我已经找到了问题所在,因为我们使用的是自托管版本,缓存没有被配置并且从未上传。不过我已经让构件正常工作了,因为我漏掉了依赖属性,而你的示例指出了这一点。再次感谢。 - devtoka

1
我正在使用GitLab-ci构建一个多阶段的.net docker镜像,并通过保存中间镜像来缓存nuget包。这对于一个.net 5 asp项目是有效的,但对于上面的docker文件也应该是有效的:
.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

更多信息请参见此处: https://github.com/moby/moby/issues/34715


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

希望它有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接