Публикация пакетов NuGet с помощью Azure Pipelines (YAML/классическая модель)

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

В Azure Pipelines можно использовать классический редактор или задачи YAML для публикации пакетов NuGet в конвейере, веб-канала Артефактов Azure или общедоступных реестров, таких как nuget.org.

Создание пакета NuGet

Существуют различные способы создания пакетов NuGet, таких как использование Visual Studio для упаковки пакетов NuGet. Если вы уже используете MSBuild или какую-либо другую задачу для создания пакетов, пропустите этот раздел и перейдите к разделу публикации пакетов NuGet.

Чтобы создать пакет NuGet, добавьте следующий фрагмент кода в файл YAML конвейера. Дополнительные сведения см. в статье "Задача NuGet".

- task: NuGetCommand@2
  inputs:
    command: pack
    packagesToPack: '**/*.csproj'
    packDestination: '$(Build.ArtifactStagingDirectory)'
  • packagesToPack: шаблон для поиска каталогов csproj для упаковки
  • packDestination: каталог, в котором создаются пакеты

Управление версиями пакета

Пакеты NuGet отличаются именами и номерами версий. Использование семантического управления версиями — это рекомендуемая стратегия эффективного управления версиями пакетов. Семантические версии состоят из трех числовых компонентов: "Основной", "Дополнительный" и "Исправление".

Исправление увеличивается после исправления ошибки. При выпуске новой функции, совместимой с обратной совместимостью, вы добавите дополнительную версию и сбросите версию исправления до 0. При внесении изменения, несовместимого с обратной совместимостью, вы добавите основную версию и сбросите версии дополнительных и исправлений до 0.

С помощью семантического управления версиями можно также использовать метки предварительной версии для тегов пакетов. Для этого введите дефис, за которым следует тег предварительной версии: например, 1.0.0-beta. Семантическая версия поддерживается в Azure Pipelines и может быть настроена в задаче NuGet следующим образом:

  • Используйте дату и время (классический ): byPrereleaseNumber (YAML). Версия пакета находится в формате: Major.Minor.Patch-ci-datetime , где можно выбрать значения основного, дополнительного и исправления.

  • Используйте переменную среды (классическая модель): 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)'

Примечание.

DotNetCore и DotNetStandard пакеты следует упаковать с задачей DotNetCoreCLI@2 , чтобы избежать System.InvalidCastExceptions. Дополнительные сведения см. в статье о задаче .NET Core CLI.

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

Публикация пакетов NuGet

Чтобы опубликовать пакеты в веб-канале Azure Artifacts из конвейера, удостоверение конвейера должно иметь роль издателя веб-канала (участника). Дополнительные сведения см. в разделе "Разрешения конвейеров".

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

Чтобы опубликовать пакет во внешнем веб-канале NuGet, необходимо сначала создать подключение службы для подключения к нему. Чтобы создать подключение к службе, выполните приведенные действия.

  1. Перейдите в раздел "Параметры>службы" подключения>службы "Создать подключение службы".
  2. Выберите NuGet и нажмите кнопку "Далее".
  3. Заполните форму и нажмите кнопку "Сохранить " после завершения.

Дополнительные сведения см. в разделе "Управление подключениями к службе".

Примечание.

Задача NuGetAuthenticate@1 поддерживает подключение к службе с помощью базовой проверки подлинности. Задача не поддерживает проверку подлинности ключа API NuGet. Если подключение службы использует ApiKey, необходимо использовать задачу NuGetCommand@2 и указать ключ API NuGet в поле аргументов. Дополнительные сведения см. в статье "Задача NuGet".

Чтобы опубликовать пакет во внешнем веб-канале NuGet, добавьте следующий фрагмент кода в конвейер YAML.

Использование задачи команднойстроки (с 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"          

Использование задачи команднойстроки (с 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"          

Примечание.

Это ApiKey необходимо, но при отправке в веб-каналы Артефактов Azure можно использовать любое произвольное значение.

Публикация на NuGet.org

  1. Создайте ключ API.

  2. Перейдите к проекту Azure DevOps и выберите Значок шестеренкипараметры проекта.

  3. Выберите службы Подключение ions и выберите "Создать подключение службы".

  4. Выберите NuGet и нажмите кнопку "Далее".

  5. Выберите ApiKey в качестве метода проверки подлинности. Используйте следующий URL-адрес для URL-адреса веб-канала: https://api.nuget.org/v3/index.json

  6. Введите apiKey, созданное ранее, и введите имя подключения службы.

  7. Выберите "Предоставить разрешение на доступ ко всем конвейерам", а затем нажмите кнопку "Сохранить " после завершения. Чтобы выбрать этот параметр, требуется роль подключения службы Администратор istrator.

Добавьте следующий фрагмент кода YAML в определение конвейера:

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