使用 Azure Pipelines 发布 NuGet 包(YAML/经典)

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

使用 Azure Pipelines,可以使用经典管道或 YAML 管道将 NuGet 包发布到你的组织或其他组织中的 Azure Artifacts 源,以及公共注册表(如 nuget.org)。 本文将指导如何进行以下操作:

  • 将包发布到内部源
  • 将包发布到其他组织中的源
  • 程序包版本控制

先决条件

将 NuGet 包发布到同一组织中的源

注意

若要使用 Azure Pipelines 将包发布到源,请确保已为项目集合生成服务和项目的生成服务标识授予已在源设置中分配的源发布者(参与者)角色。 有关更多详细信息,请参阅管理权限

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择管道,然后选择您的管道定义。

  3. 选择编辑,然后将以下代码片段添加到 YAML 管道。

steps:
- task: NuGetToolInstaller@1                            # Minimum required NuGet version: 4.8.0.5385+.
  displayName: 'NuGet Tool Installer'

- task: NuGetAuthenticate@0
  displayName: 'NuGet Authenticate'

- script: |
      nuget.exe push -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" -ApiKey az $(Build.ArtifactStagingDirectory)\*.nupkg
  displayName: Push
  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择管道,然后选择您的管道定义。

  3. 选择编辑,然后将以下代码片段添加到 YAML 管道。

steps:
- task: NuGetToolInstaller@1                            # Minimum required NuGet version: 4.8.0.5385+.
  displayName: 'NuGet Tool Installer'

- task: NuGetAuthenticate@1
  displayName: 'NuGet Authenticate'

- script: |
      nuget.exe push -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" -ApiKey az $(Build.ArtifactStagingDirectory)\*.nupkg
  displayName: Push

将 NuGet 包发布到其他组织中的源

要将您的 NuGet 包发布到其他 Azure DevOps 组织中的源,你必须首先在目标组织中创建个人访问令牌 (PAT)。 导航到托管目标源的组织,并使用打包>读取和写入范围创建个人访问令牌。 创建 PAT 后,请将其复制并存储在安全位置,因为需要在以下部分中设置服务连接。

  1. 登录到管道运行所在的 Azure DevOps 组织,然后导航到你的项目。

  2. 导航到项目设置>服务连接

  3. 依次选择新建服务连接NuGet下一步

  4. 选择外部 Azure DevOps Server 作为身份验证方法,然后输入目标源 URL。 粘贴之前创建的个人访问令牌,提供服务连接的名称,并选中授予对所有管道的访问权限(如果适用于你的方案)。

  5. 完成时选择“保存”。

    显示如何设置 NuGet 服务连接以向不同组织中的外部源进行身份验证的屏幕截图。

  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择管道,然后选择您的管道定义。

  3. 选择编辑,然后将以下代码片段添加到 YAML 管道。

    - task: NuGetToolInstaller@1                                # Minimum required NuGet version: 4.8.0.5385+.
      displayName: 'NuGet Tool Installer'
    
    - task: NuGetAuthenticate@1
      inputs:
        nuGetServiceConnections: <SERVICE_CONNECTION_NAME>
    
    - script: |
          nuget.exe push -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" -ApiKey az $(Build.ArtifactStagingDirectory)\*.nupkg
      displayName: Push       
    
  1. 登录到 Azure DevOps 组织,并导航到你的项目。

  2. 选择管道,然后选择您的管道定义。

  3. 选择编辑,然后将以下代码片段添加到 YAML 管道。

    - task: NuGetToolInstaller@1                            # Minimum required NuGet version: 4.8.0.5385+.
      displayName: 'NuGet Tool Installer'
    
    - task: NuGetAuthenticate@0
      inputs:
        nuGetServiceConnections: <SERVICE_CONNECTION_NAME>
    
    - script: |
        nuget.exe push -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" -ApiKey az $(Build.ArtifactStagingDirectory)\*.nupkg
      displayName: Push          
    

显示成功发布到其他组织中的源的包的屏幕截图。

NuGet 任务包版本控制

Azure Pipelines 支持语义版本控制,并为 NuGet 任务提供以下配置选项:

  • 使用日期和时间(经典)| byPrereleaseNumber (YAML):包版本采用以下格式:Major.Minor.Patch-ci-datetime;其中,你可随意自定义 Major、Minor 和 Patch 的值。

  • 使用环境变量(经典)| byEnvVar (YAML):包版本将设为指定环境变量的值。

  • 使用内部版本号(经典)| byBuildNumber (YAML):包版本将设为内部版本号。 请务必将管道选项中的内部版本号格式定义为 $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r)。 若要在 YAML 中设置格式,请在管道的根目录处添加 name: 属性并定义格式。

以下示例演示了如何使用日期与时间版本控制来生成符合 SemVer 且采用如下格式的包:Major.Minor.Patch-ci-datetime

variables:
  Major: '1'
  Minor: '0'
  Patch: '0'

steps:
- task: NuGetCommand@2
  inputs:
    command: pack
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'

注意

DotNetCoreDotNetStandard 包应与 DotNetCoreCLI@2 任务一起打包,以避免 System.InvalidCastExceptions。 有关更多详细信息,请参阅 .NET Core CLI 任务

task: DotNetCoreCLI@2
inputs:
    command: pack
    versioningScheme: byPrereleaseNumber
    majorVersion: '$(Major)'
    minorVersion: '$(Minor)'
    patchVersion: '$(Patch)'