Publicar pacotes NuGet com o Azure Pipelines (YAML/Classic)

Serviços de DevOps do Azure | Azure DevOps Server 2022 - Azure DevOps Server 2019

No Azure Pipelines, você pode usar o editor clássico ou as tarefas YAML para publicar seus pacotes NuGet em seu pipeline, em seu feed de Artefatos do Azure ou em registros públicos, como nuget.org.

Criar um pacote NuGet

Há várias maneiras de criar seus pacotes NuGet, como usar o Visual Studio para empacotar seus pacotes NuGet. Se você já estiver usando o MSBuild ou alguma outra tarefa para criar seus pacotes, ignore esta seção e vá para a seção Publicar pacotes NuGet.

Para criar um pacote NuGet, adicione o seguinte trecho ao arquivo YAML do pipeline. Para obter mais informações, consulte Tarefa NuGet.

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: padrão para procurar diretórios csproj para empacotar
  • packDestination: diretório onde os pacotes são criados

Controle de versão do pacote

Os pacotes NuGet distinguem-se pelos seus nomes e números de versão. Empregar o versionamento semântico é uma estratégia recomendada para gerenciar versões de pacotes de forma eficaz. As versões semânticas consistem em três componentes numéricos: Maior, Menor e Patch.

O patch é incrementado após a correção de um bug. Ao lançar um novo recurso compatível com versões anteriores, você incrementa a versão secundária e redefine a versão do patch para 0. Quando você faz uma alteração incompatível com versões anteriores, incrementa a versão principal e redefine as versões secundária e patch para 0.

Com o Controle de Versão Semântico, você também pode usar rótulos de pré-lançamento para marcar seus pacotes. Para fazer isso, insira um hífen seguido da tag de pré-lançamento: por exemplo, 1.0.0-beta. O Controle de Versão Semântico é suportado no Azure Pipelines e pode ser configurado em sua tarefa NuGet da seguinte maneira:

  • Use a data e a hora (Clássico): byPrereleaseNumber (YAML). A versão do seu pacote está no formato: Major.Minor.Patch-ci-datetime, onde você tem a flexibilidade de escolher os valores do seu Major, Minor e Patch.

  • Use uma variável de ambiente (Classic): byEnvVar (YAML). A versão do pacote é definida com o valor da variável de ambiente especificada.

  • Use o número de compilação (Clássico): byBuildNumber (YAML). A versão do pacote está definida como o número da compilação. Certifique-se de definir o formato do número de compilação em Opções de pipeline como $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). Para definir o formato em YAML, adicione uma propriedade name: na raiz do pipeline e adicione o formato.

O exemplo a seguir mostra como usar a opção de controle de versão de data e hora para gerar uma versão compatível com SemVer formatada como: 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)'

Nota

DotNetCore e DotNetStandard os pacotes devem ser empacotados com a DotNetCoreCLI@2 tarefa para evitar System.InvalidCastExceptions. Para obter mais informações, consulte Tarefa CLI do .NET Core.

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

Publicar pacotes NuGet

Para publicar pacotes em um feed de Artefatos do Azure a partir do seu pipeline, a identidade do pipeline deve ter a função de Publicador de Feed (Colaborador) no feed. Para obter mais informações, consulte Permissões de pipelines.

steps:
- task: NuGetAuthenticate@1
  displayName: 'NuGet Authenticate'
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    publishVstsFeed: '<projectName>/<feed>'
    allowPackageConflicts: true

Para publicar um pacote em um feed NuGet externo, você deve primeiro criar uma conexão de serviço para se conectar a esse feed. Para criar uma conexão de serviço:

  1. Vá para Configurações do>projeto Conexões>de serviço Nova conexão de serviço.
  2. Selecione NuGet e, em seguida, selecione Avançar.
  3. Preencha o formulário e selecione Salvar quando terminar.

Para obter mais informações, consulte Gerenciar conexões de serviço.

Nota

A tarefa NuGetAuthenticate@1 suporta uma conexão de serviço usando autenticação básica. A tarefa não oferece suporte à autenticação de chave de API NuGet. Se sua conexão de serviço usa ApiKey, você deve usar a tarefa NuGetCommand@2 e especificar a chave da API NuGet no campo argumentos . Para obter mais informações, consulte Tarefa NuGet.

Para publicar um pacote em um feed NuGet externo, adicione o seguinte trecho ao seu pipeline YAML.

Usando a tarefa de linha decomando (com NuGet.exe):

  - task: NuGetAuthenticate@1
    inputs:
      nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>

  - script: |
      nuget push <PACKAGE_PATH> -src https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json -ApiKey <ANY_STRING>
    displayName: "Push"          

Usando a tarefa de linha decomando (com dotnet):

  - task: NuGetAuthenticate@1
    inputs:
      nuGetServiceConnections: <NAME_OF_YOUR_SERVICE_CONNECTION>

  - script: |
      dotnet build <CSPROJ_PATH> --configuration <CONFIGURATION>
      dotnet pack <CSPROJ_PATH> -p:PackageVersion=<YOUR_PACKAGE_VERSION> --output <OUTPUT_DIRECTORY> --configuration <CONFIGURATION>
      dotnet nuget push <PACKAGE_PATH> --source https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json --api-key <ANY_STRING>
    displayName: "Build, pack and push"          

Nota

O ApiKey é necessário, mas você pode usar qualquer valor arbitrário ao enviar por push para feeds de Artefatos do Azure.

Publicar em NuGet.org

  1. Gere uma chave de API.

  2. Navegue até seu projeto de DevOps do Azure e selecione ícone de engrenagemConfigurações do projeto.

  3. Selecione Conexões de Serviço e, em seguida, selecione Nova conexão de serviço.

  4. Selecione NuGet e, em seguida, selecione Avançar.

  5. Selecione ApiKey como seu método de autenticação. Use o seguinte url para o URL do seu feed: https://api.nuget.org/v3/index.json.

  6. Introduza a ApiKey que gerou anteriormente e, em seguida, introduza um nome de ligação de serviço.

  7. Selecione Conceder permissão de acesso a todos os pipelines e, em seguida, selecione Salvar quando terminar. Para selecionar essa opção, você precisa da função de Administrador de conexão de serviço.

Adicione o seguinte trecho de YAML à sua definição de pipeline:

steps:
- task: NuGetCommand@2
  displayName: 'NuGet push'
  inputs:
    command: push
    nuGetFeedType: external
    publishFeedCredentials: nuget.org