从私有工件源恢复 Azure Nuget

问题描述 投票:0回答:1

我正在尝试测试 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。

我非常有信心这个错误与工件提要的身份验证有关,但到目前为止我所尝试的一切都不起作用。

这是我目前的设置:

  1. ANZ代码库的文件夹结构:rootfolder/aspnet-core。此结构是 ANZ 模板的一部分,不是我创建的。 aspnet-core 文件夹包含 aspnet 代码库中所有项目的 .sln 文件。 aspnet-core 文件夹包含一个 src 子文件夹,每个项目都分为 src 内其自己的项目特定文件夹。例如,aspnet-core/src/Test.Migrator。 Test.Migrator 文件夹包含 Test.Migrator.csproj 和项目的 dockerfile。
  2. 根文件夹包含 azure-pipeline.yml 文件。下面列出了该文件的内容。
  3. 根文件夹还包含一个 NuGet.config 文件以支持自定义 Azure Artifact feed。下面列出了该文件的内容。
  4. 下面还列出了失败的 Test.Migrator 文件夹中存在的 dockerfile。
  5. 根据其他几个 StackOverflow 问答,我将“项目集合构建服务”添加到工件提要的安全设置中,并授予其“贡献者”权限。我还将“ANZ Build Service”帐户作为“贡献者”添加到该源的安全性中。这些都没有解决问题。
  6. azureNugetServiceConnection 的类型为 Nuget,身份验证方法为“外部 Azure DevOps 服务器”。

我使用以下文档进行部分设置,特别是“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.285 {`endpointCredentials`: [{`endpoint`:`my_valid_feed_url`, `username`:`docker`, `password`:
}]} #18 完成 0.3 秒

任何帮助将不胜感激。

  • azure-pipeline.yml

  • 测试.Migrator dockerfile

  • NuGet.config

azure docker nuget azure-pipelines nuget-package-restore
1个回答
0
投票

您可以尝试检查以下事项来解决问题:

  1. 在您的 Dockerfile 中,在构建项目的步骤之前,使用“

    ENV
    ”指令设置可以访问您的 Private Artifact Feed 的有效用户名和密码。

    ENV FEED_USERNAME="{username}"
    ENV FEED_PASSWORD="{password}"
    
  2. 在您的

    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%
' 将自动使用容器内环境变量的值。

相关文档:

© www.soinside.com 2019 - 2024. All rights reserved.