无法使管道将Azure NuOps自定义NuGet服务器与Azure DevOps构建配合使用

时间:2018-10-29 19:42:01

标签: nuget azure-devops nuget-package-restore

我的解决方案使用来自官方NuGet服务器和私有NuGet服务器的软件包。我正在尝试配置构建管道以从这两个位置还原软件包,但是一直在尝试从公共NuGet服务器还原我的私有软件包的过程中不断收到NuGet还原构建错误,因此可以理解地失败了。

我对我应该做的事情有些茫然。看来在Azure DevOps中没有可以为NuGet还原步骤进行的设置,因为看起来现在已经在YAML文件中进行了所有配置。关于我可能做错了什么或我可以尝试做的其他任何建议,将不胜感激。

我的解决方案中的我的NuGet.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageRestore>
    <!-- Allow NuGet to download missing packages -->
    <add key="enabled" value="True" />
    <!-- Automatically check for missing packages during build in Visual Studio -->
    <add key="automatic" value="True" />
  </packageRestore>
  <packageSources>
    <add key="NuGet official package source" value="https://api.nuget.org/v3/index.json" />
    <add key="Private" value="http://privatenuget.net:8080/nuget" />
  </packageSources>
  <activePackageSource>
    <add key="All" value="(Aggregate source)" />
  </activePackageSource>
</configuration>

管道使用的我的YAML文件:

# ASP.NET
# Build and test ASP.NET projects.
# Add steps that publish symbols, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4

pool:
  vmImage: 'VS2017-Win2016'

variables:
  solution: 'MyProject.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'

steps:
- task: NuGetToolInstaller@0

- task: NuGetCommand@2
  inputs:
    nugetConfigPath: 'MyProject\NuGet.config'
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    solution: '$(solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

我在构建的NuGetCommand步骤上遇到的错误:

The nuget command failed with exit code(1) and error(Errors in packages.config projects
    NU1000: Unable to find version '1.1.5' of package 'MyPackage'.
      https://api.nuget.org/v3/index.json: Package 'MyPackage' is not found on source 'https://api.nuget.org/v3/index.json'.)
Packages failed to restore

3 个答案:

答案 0 :(得分:3)

您可以从一个空作业开始,而不使用现有的YAML。然后,您可以设置您的代理/任务(nuget restore等)来构建您的应用程序。

New build

Empty job

答案 1 :(得分:2)

您的YML文件不正确,您必须添加 feedsToUse:config

- task: NuGetCommand@2
  displayName: 'Nuget Restore'
  inputs:
    restoreSolution: '$(solution)'
    feedsToUse: config
    nugetConfigPath: nuget.config

答案 2 :(得分:0)

我只是遇到了这个问题,但是我的项目中没有要使用的NuGet.config文件,也不想添加一个文件。至少可以说,使用NuGet.config要求您以明文形式存储个人访问令牌(PAT),这至少不理想,尤其是当它与项目一起提交给您的回购协议时。

经过大量研究,我得出了一个接近完美的解决方案。使用Azure DevOps中的变量组,可以添加可用于所有管道的变量(和机密)。在我看来,我可以将整个NuGet.config放在那里(连同PAT)一起作为一个秘密,然后将其通过管道传递到实际的NuGet.config文件中。

您已经有一个NuGet.config文件,但是如果其他人落在该文件上并从头开始,则需要以下内容:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
    <add key="MyPrivateFeed" value="*** PRIVATE FEED URL HERE ***" />
  </packageSources>
  <packageSourceCredentials>
    <MyPrivateFeed>
      <add key="Username" value="anything" />      
      <add key="ClearTextPassword" value="*** PAT HERE ***" />
    </MyPrivateFeed>
  </packageSourceCredentials>
</configuration>

填写您的Feed URL和PAT,然后将其全部复制并粘贴到变量组中名为“ NuGet.config”的变量中。单击变量上的锁定图标以使其成为秘密。该变量可以命名为任意名称,但是如果使用其他变量,则需要在下面的代码中对其进行更新。

然后,您只需要包含变量组:

variables:
  - group: my-variable-group

在将使用私有供稿的其他任何步骤(例如dotnet build)之前,将以下内容添加到管道Yaml中。

- bash: echo -e '$(NuGet.config)' > NuGet.config
  displayName: Create NuGet.config