【问题标题】:Jenkins Package Restore with nuget.config使用 nuget.config 恢复 Jenkins 包
【发布时间】:2021-03-08 17:11:03
【问题描述】:

目前正在努力使用 Jenkins 部署新应用,但遇到了包还原问题。 请注意......我的重点是开发,而不是 DevOps,所以很多这对我来说仍然很陌生。因此,如果需要来回澄清,我提前道歉。

该项目使用以下文件:jenkinsfile、docker-compose.bi.build.yml、build.sh 和 nuget.config。这些文件都列在下面以供参考。

简要概述:

我有 2 个 DLL,它们在 2 个单独的 VS 解决方案(和单独的 Git 存储库)中受源代码控制。这些 DLL 是:AN.Infrastructure(基础设施)和 AN.Domain.Core(域)。域取决于基础设施。 infras 是一些基本的东西......字符串扩展等,并没有很多依赖。 domain 对 EF、Postgres EF、AutoMapper 等有更多的依赖关系,但它也在包还原过程中引入了基础设施。就源代码控制、詹金斯等而言,基础设施和域的设置方式相同(这意味着我希望它们构建几乎相同的内容减去额外的依赖项)。 目前,infras 正在按应有的方式构建和部署,因此我知道我的流程正在运行。

流程如下:

  • jenkinsfile 会根据 ci.build.yml 文件启动一个容器。 该容器用于构建源代码并复制输出 到暂存目录,以便该过程的其余部分可以 打包/部署它。
  • build.sh 脚本在正在运行的容器内执行,该容器是 构建代码并正在做恢复依赖关系的工作,踢 关闭 msbuild,然后打包工件。

问题:

由于似乎缺少包引用,我无法获得通过 Jenkins 构建的域解决方案。进程抛出如下错误:

包 Microsoft.EntityFrameworkCore.Analyzers,版本 3.1.4 没有 成立。自 NuGet 还原后,它可能已被删除。除此以外, NuGet 还原可能仅部分完成,这可能已 由于最大路径长度限制。

我所知道的:

  • 我已经证明 infras 管道可以端到端工作,因为我可以导航 通过 VS nuget UI 将 infras 程序集安装到域 我的本地机器上的解决方案。域解决方案的构建和工作 正如预期的那样。
  • 我也知道域的代码被拉到詹金斯 管道作业开始时的服务器...我远程进入 /var/lib/jenkins 中的工作区文件夹进行确认。
  • 另外,我在 build.sh 的输出中看到了我所有的 echo 打印输出 域作业运行时的脚本。所以,这个过程就像我一样运行 期望,它只是在包还原时失败。
  • 因为 infras 托管在 Linux 文件共享上,而不是直接在 nuget.org,我读到我必须使用旁边的 nuget.config 文件 解决方案为了配置包源所以 dotnet build 知道从哪里恢复包。我创建了那个文件并 它在下面。我已经尝试过使用和不使用该文件,但它 双向失败。
  • 我注意到 MS.EF.Analyzers DLL 被拉入 域项目间接通过 npgsql.entityframeworkcore.postgres 依赖。所以,我决定在基础设施解决方案中包含 npgsql 以及我认为这也会破坏该构建。然而,那 事实并非如此。即使在我加入之后,詹金斯也建立了基础设施 这种依赖。

我的尝试:

你的名字......我现在在 Jenkins 中构建了 45 个版本......每次都尝试新的东西(例如......使用 nuget.config,没有 nuget.config 等)。我在下面的文件中发布的是当前状态以及我在问题中描述的内容。我非常乐意回答任何问题,提供任何其他信息,或尝试任何方法来解决这个问题……只是现在不知道该去哪里。

Jenkins 文件:

pipeline {
  agent any
  stages {
    stage('Build The Codes') {
      steps {
        sh '''sudo AN_BUILD_NUMBER=${BUILD_NUMBER} /usr/local/bin/docker-compose -f docker-compose.ci.build.yml up'''
      }
    }
    stage ('Deploy The Codes') {
      when {
        branch 'main'
      }
      steps {
        sh '''sudo cp ./src/AN.Domain.Core/bin/Release/*${BUILD_NUMBER}.nupkg /opt/nuget/development/'''            
      }
    }
    stage ('Deploy The Codes 2.0') {
      when {
        branch 'release'
      }
      steps {
        sh '''sudo cp ./src/AN.Domain.Core/bin/Release/*${BUILD_NUMBER}.nupkg /opt/nuget/production/'''            
      }
    }
  }
}

docker-compose.ci.build.yml:

version: '3.8'

volumes:
  nugetdirectory:

services:
  ci-build:
    image: mcr.microsoft.com/dotnet/sdk:3.1
    volumes:
      - .:/src:z
      - nugetdirectory:/opt/nuget/production
    working_dir: /src
    environment:
      - "AN_BUILD_NUMBER=${AN_BUILD_NUMBER}"

    command:  /bin/bash -c "sh ./build.sh"

build.sh:

echo '*** Starting build process for AN.Domain project ***'

echo 'Generate New Assembly Version'
year=$(date '+%Y')
month=$(date '+%m')
day=$(date '+%d')
version="${year}.${month}.${day}.${AN_BUILD_NUMBER}"
echo 'New Assembly Version: ' + $version

echo 'Clean previous output directory for AN.Domain project'
echo ' - Remove Docker publish directory'
rm -rf obj/Docker/publish

echo ' - Remove previous nuget packages'
rm /src/src/AN.Domain.Core/bin/Release/*.nupkg    

echo 'Clean output directory for AN.Domain project'
dotnet clean

echo 'Publish AN.Domain project'
dotnet msbuild /t:Restore -target:Publish -property:Configuration=Release -property:OutputPath=obj/Docker/publish -property:Version=$version

echo 'Copy NuGet packages to output directory'
cp /src/src/AN.Domain.Core/bin/Release/*.nupkg obj/Docker/publish

echo '*** Finishing build process for AN.Domain project ***'

nuget.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="privateRepo" value="/opt/nuget" />
  </packageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>
</configuration>

更新:

  • 我从解决方案中删除了域项目,并创建了一个全新的控制台应用程序进行测试。通过 Jenkins 运行时,该项目按预期构建。我什至添加了对 npgsql 的依赖,它也引入了导致问题的 MS.EF.Analyzers DLL。
  • 我刚刚在测试控制台应用程序中添加了对基础设施和 这会以相同的错误破坏构建。所以,肯定是 引入导致构建的自定义 nuget 包 错误。

【问题讨论】:

    标签: docker jenkins .net-core msbuild jenkins-pipeline


    【解决方案1】:

    所以,我在 build.sh 中替换了这一行:

    dotnet msbuild /t:Restore -target:Publish -property:Configuration=Release -property:OutputPath=obj/Docker/publish -property:Version=$version
    

    用这个:

    dotnet publish -c Release -o obj/Docker/publish /property:Version=$version
    

    最初我有“dotnet publish”,但我遇到了同样的错误。我从下面的 SO 问题中得到了前一个想法,但我相信我在了解 nuget.config 之前就这样做了。所以,我认为可能发生的情况是两者都是必要的,但是当我使用“dotnet publish”时我没有 nuget.config,然后我将其切换到 msbuild,并且从未返回并使用 dotnet publish 的这种组合进行测试和 nuget.config。

    Jenkins not picking up the nuget restored packages

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-26
      • 2022-06-11
      • 2018-07-06
      • 2021-04-13
      相关资源
      最近更新 更多