Publicación de paquetes NuGet con Azure Pipelines (YAML/clásico)

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

En Azure Pipelines, puede usar el editor clásico o las tareas de YAML para publicar paquetes NuGet dentro de la canalización en la fuente de Azure Artifacts o en registros públicos, como nuget.org.

Creación de un paquete NuGet

Hay varias maneras de crear paquetes NuGet, como el uso de Visual Studio para empaquetar los paquetes NuGet. Si ya usa MSBuild o alguna otra tarea para crear los paquetes, omita esta sección y vaya a la sección Publicar paquetes NuGet.

Para crear un paquete NuGet, agregue el siguiente fragmento de código al archivo YAML de canalización. Para obtener más información, vea NuGet task.

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: patrón para buscar directorios de csproj para empaquetar
  • packDestination: directorio donde se crean los paquetes

Control de versiones de paquetes

Los paquetes NuGet se distinguen por sus nombres y números de versión. El uso del Versionamiento Semántico es una estrategia recomendada para administrar eficazmente versiones de paquete. Las versiones semánticas constan de tres componentes numéricos: principal, secundaria y revisión.

El parche se incrementa después de corregir un error. Al publicar una nueva característica compatible con versiones anteriores, se incrementa la versión secundaria y se restablece la versión de revisión a 0. Cuando se realiza un cambio incompatible con versiones anteriores, se incrementa la versión principal y se restablecen las versiones Secundaria y Revisión a 0.

Con Versionamiento Semántico, también puede usar etiquetas de versión preliminar para etiquetar los paquetes. Para ello, escriba un guión seguido de la etiqueta de versión preliminar: por ejemplo, 1.0.0-beta. El Versionamiento Semántico se admite en Azure Pipelines y se puede configurar en la tarea de NuGet de la siguiente manera:

  • Use la fecha y hora (clásico): byPrereleaseNumber (YAML). La versión del paquete tiene el formato: Major.Minor.Patch-ci-datetime , donde tiene la flexibilidad de elegir los valores de Major, Minor y Revisión.

  • Use una variable de entorno (clásico): byEnvVar (YAML). La versión del paquete se establece en el valor de la variable de entorno que especifique.

  • Use el número de compilación (clásico): byBuildNumber (YAML). La versión del paquete se establece en el número de compilación. Asegúrese de establecer el formato del número de compilación en opciones de canalización en $(BuildDefinitionName)_$(Year:yyyy).$(Month).$(DayOfMonth)$(Rev:.r). Para establecer el formato en YAML, agregue una propiedad name: en la raíz de la canalización y agregue el formato.

En el ejemplo siguiente se muestra cómo usar la opción de control de versiones de fecha y hora para generar una versión compatible con SemVer con formato: 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

Los paquetes DotNetCore y DotNetStandard deben empaquetarse con la tarea DotNetCoreCLI@2 para evitar System.InvalidCastExceptions. Para obtener más información, consulte Tarea de la CLI de .NET Core.

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

Publicación de paquetes NuGet

Para publicar paquetes en una fuente de Azure Artifacts desde la canalización, la identidad de la canalización debe tener el rol de Publicador de fuentes (colaborador) en la fuente. Para obtener más información, consulte Permisos de canalizaciones.

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

Para publicar un paquete en una fuente NuGet externa, primero debe crear una conexión de servicio para conectarse a esa fuente. Crear una conexión de servicio

  1. Ir a Configuración del>proyecto Conexiones>de servicio Nueva conexión de servicio.
  2. Seleccione NuGet y después Siguiente.
  3. Rellene el formulario y seleccione Guardar cuando haya terminado.

Para obtener más información, consulte Administración de conexiones de servicio.

Nota:

La tarea NuGetAuthenticate@1 admite una conexión de servicio mediante la autenticación básica. La tarea no admite la autenticación de clave de API de NuGet. Si la conexión de servicio usa ApiKey, debe usar la tarea NuGetCommand@2 y especificar la clave de API de NuGet en el campo de argumentos . Para obtener más información, vea NuGet task.

Para publicar un paquete en una fuente NuGet externa, agregue el siguiente fragmento de código a la canalización de YAML.

Con latarea de línea de comandos (con 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"          

Con latarea de línea de comandos (con 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

ApiKey es necesario, pero puede usar cualquier valor arbitrario al insertar en fuentes de Azure Artifacts.

Publicar en NuGet.org

  1. Generación de una clave de API.

  2. Vaya al proyecto de Azure DevOps y seleccione el icono de engranajeConfiguración del proyecto.

  3. Seleccione Conexiones de servicio y, a continuación, seleccione Nueva conexión de servicio.

  4. Seleccione NuGet y después Siguiente.

  5. Seleccione ApiKey como método de autenticación. Use la siguiente dirección URL para la dirección URL de fuente: https://api.nuget.org/v3/index.json.

  6. Escriba la ApiKey que generó anteriormente y, a continuación, escriba un nombre de conexión de servicio.

  7. Seleccione Conceder permiso de acceso a todas las canalizaciones y, a continuación, seleccione Guardar cuando haya terminado. Para seleccionar esta opción, necesita el rol de administrador de conexión de servicio.

Agregue el siguiente fragmento de código YAML a la definición de la canalización:

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