繁体   English   中英

Jenkins Package 使用 nuget.config 恢复

[英]Jenkins Package Restore with nuget.config

目前正在努力使用 Jenkins 部署新的应用程序,并遇到 package 恢复问题。 请注意......我的重点是开发,而不是 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 等有更多的依赖关系,但它也在 package 恢复过程中引入了基础设施。 就源代码控制、jenkins 等而言,基础设施和域的设置方式相同(这意味着我希望它们构建几乎相同的内容减去额外的依赖项)。 目前,infras 正在按应有的方式构建和部署,因此我知道我所拥有的流程正在运行。

过程是这样的:

  • jenkinsfile 基于 ci.build.yml 文件启动了一个容器。 此容器用于构建源代码并将 output 复制到暂存目录,以便进程的 rest 可以打包/部署它。
  • build.sh 脚本在正在运行的容器内执行,该容器正在构建代码并执行恢复依赖项的工作,启动 msbuild,然后启动 package 工件。

问题:

由于似乎缺少 package 参考,我无法获得通过 Jenkins 构建的域解决方案。 该过程引发以下错误:

Package Microsoft.EntityFrameworkCore.Analyzers,未找到版本 3.1.4。 自 NuGet 恢复后,它可能已被删除。 否则,NuGet 恢复可能仅部分完成,这可能是由于最大路径长度限制。

我知道的:

  • 我已经证明 infras 管道是端到端工作的,因为我可以通过 VS nuget UI 导航到 infras 程序集并将其安装到本地计算机上的域解决方案中。 域解决方案以这种方式按预期构建和工作。
  • 我还知道,当管道作业启动时,域的代码被下拉到 jenkins 服务器……我远程进入 /var/lib/jenkins 中的工作区文件夹进行确认。
  • 此外,当域作业运行时,我从 build.sh 脚本中看到 output 中的所有回声打印输出。 所以,这个过程就像我预期的那样运行,它只是在 package 恢复时失败。
  • Since infras is hosted on a Linux file share and not directly at nuget.org, I read that I have to use a nuget.config file next to the solution in order to configure the package sources so dotnet build knows where to restore the packages from . 我创建了那个文件,它在下面。 我尝试过使用和不使用该文件,但两种方式都失败了。
  • 我注意到 MS.EF.Analyzers DLL 正在通过 npgsql.entityframeworkcore.postgres 依赖项间接被拉入域项目。 因此,我决定将 npgsql 包含在基础架构解决方案中,并且我认为这也会破坏该构建。 然而,事实并非如此。 即使在我加入了这种依赖之后,infras 也内置在 Jenkins 中。

我试过的:

你的名字......我现在在 Jenkins 的 45 个版本......每次尝试新的东西(例如......使用 nuget.config,没有 nuget.config,等等) 我在下面的文件中发布的是当前的 state 以及我在问题中描述的内容。 我非常乐意回答任何问题,提供任何其他信息,或尝试任何解决此问题的方法……只是不确定此时 go 的位置。

詹金斯文件:

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"

构建.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。
  • 我刚刚在测试控制台应用程序中添加了对 infras 的依赖,这会以相同的错误破坏构建。 因此,它肯定会引入导致构建错误的自定义 nuget package。

所以,我在 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 没有拿起 nuget 恢复的包

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM