Publicar pacotes NuGet com o Azure Pipelines (YAML/Clássico)

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

No Azure Pipelines, é possível usar o editor clássico ou as tarefas YAML para publicar os pacotes NuGet no pipeline para o feed do Azure Artifacts ou para os registros públicos, como o 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, pule esta seção e vá para a seção Publicar pacotes NuGet.

Para criar um pacote NuGet, adicione o snippet a seguir 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 pesquisar diretórios csproj para empacotar
  • packDestination: diretório onde os pacotes são criados

Controle de versão do pacote

Os pacotes NuGet são diferenciados por seus nomes e números de versão. Empregar o controle de versão semântico é uma estratégia recomendada para gerenciar efetivamente as versões do pacote. As versões semânticas consistem em três componentes numéricos: Principal, Secundária 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 como 0. Quando você faz uma alteração incompatível com versões anteriores, você incrementa a versão secundária e redefine as versões secundária e do patch como 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 marca de pré-lançamento: por exemplo, 1.0.0-beta. O controle de versão semântico tem suporte no Azure Pipelines e pode ser configurado na tarefa do NuGet da seguinte maneira:

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

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

  • Use o número de build (Clássico): byBuildNumber (YAML). A versão do pacote é definida como o número da compilação. Defina o formato do número de build em Opções de pipeline como $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). Para definir o formato no 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)'

Observação

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

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

Publicar pacotes do NuGet

Para publicar pacotes em um feed de Artefatos do Azure a partir de seu pipeline, a identidade do pipeline deve ter a função Publicador de Feed (Colaborador) no feed. Para obter mais informações, veja 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 externo do NuGet, primeiro você deve criar uma conexão de serviço para se conectar a esse feed. Para criar uma conexão de serviço:

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

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

Observação

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

Para publicar um pacote em um feed externo do NuGet, adicione o snippet a seguir ao pipeline do YAML.

Usando atarefa Linha de comando (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 atarefa Linha de comando (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"          

Observação

O ApiKey é necessário, mas você pode usar qualquer valor arbitrário ao enviar para os feeds do Azure Artifacts.

Publicar no NuGet.org

  1. Gere uma chave de API.

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

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

  4. Selecione NuGet e selecione Avançar.

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

  6. Insira a ApiKey que você gerou anteriormente e insira um nome de conexão de serviço.

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

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

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