【发布时间】: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