我正在尝试测试 AspNetZero (ANZ) 模板(Angular 16 风格),并且我正在尝试将代码构建为 Azure 管道中的 docker 映像。我需要使用一组为其他目的而构建的自定义 DLL,这些 DLL 已被“nugetized”并放置在 Azure Artifact Feed 中。这些 DLL 项目存在于一个单独的 Azure 存储库中,我们将其称为“共享”。项目源是“共享”Azure 项目中的项目范围的源。此源已配置,并且这些 DLL 的 nuget 包已在“共享”存储库中构建并成功推送到单独的 Azure 管道中。在 Visual Studio 中,我可以通过我的 Azure 用户帐户与该工件源进行通信,并且可以将这些 DLL 安装到 ANZ 项目中。在本地,ANZ 的代码构建并运行良好。
我遇到的问题是,当我尝试在 Azure 管道内构建 ANZ 代码时,从我的 dockerfile 执行的“dotnet build”命令继续抛出以下错误:
错误 NU1301:无法加载源的服务索引 https://my_valid_feed_url。
我非常有信心这个错误与工件提要的身份验证有关,但到目前为止我所尝试的一切都不起作用。
这是我目前的设置:
我使用以下文档进行部分设置,特别是“Azure Pipelines”部分。 https://github.com/dotnet/dotnet-docker/blob/main/documentation/scenarios/nuget-credentials.md
旁注 1:我的故障排除步骤之一在作业中的 NuGetAuthenticate@1 和 Docker@2 步骤之间也有以下内容。此任务成功,并且根据 Azure 中的输出日志,似乎已连接到源。从那时起我就迈出了这一步。
task: NuGetCommand@2
displayName: Restore NuGet packages
inputs:
restoreSolution: '$(Build.SourcesDirectory)/aspnet-core/src/Test.All.sln'
feedsToUse: 'config'
nugetConfigPath: '$(Build.SourcesDirectory)/NuGet.config'
externalFeedCredentials: $(azureNugetServiceConnection)
旁注 2:dockerfile 中的 RUN echo $VSS_NUGET_EXTERNAL_FEED_ENDPOINTS 命令确实回显了变量的结果,但密码似乎为空。不确定这是否是 Azure 对其进行了编辑,或者这是否是问题所在。这是日志输出:
#18 [构建 10/11] RUN echo {
: [{endpointCredentials
:endpoint
,my_valid_feed_url
:username
,docker
:password
}]} #18 完成 0.3 秒}]} #18 0.285 {`endpointCredentials`: [{`endpoint`:`my_valid_feed_url`, `username`:`docker`, `password`:
任何帮助将不胜感激。
您可以尝试检查以下事项来解决问题:
在您的 Dockerfile 中,在构建项目的步骤之前,使用“
ENV
”指令设置可以访问您的 Private Artifact Feed 的有效用户名和密码。
ENV FEED_USERNAME="{username}"
ENV FEED_PASSWORD="{password}"
在您的
NuGet.config
文件中,您可以使用“<packageSourceCredentials>
”节点来设置您的私有工件源的凭据,如下所示。
. . .
<packageSourceCredentials>
<CustomFeed>
<add key="Username" value="%FEED_USERNAME%" />
<add key="Password" value="%FEED_PASSWORD%" />
</CustomFeed>
</packageSourceCredentials>
通过上述方法,构建 Docker 镜像时,会将提供的
username
和 password
映射为 Docker 容器内的两个环境变量(FEED_USERNAME
和 FEED_PASSWORD
)。然后,当后续步骤从您的 Private Artifact Feed 恢复包时,它将引用 packageSourceCredentials
文件中设置的 NuGet.config
。表达式 '%FEED_USERNAME%
' 和 '%FEED_USERNAME%
' 将自动使用容器内环境变量的值。
相关文档: