Поделиться через


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

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

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

  • Создание пакета NuGet в Azure Pipelines
  • Публикация пакетов во внутренних и внешних веб-каналах
  • Публикация пакетов в NuGet.org

Необходимые компоненты

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

Существует несколько способов создания пакетов NuGet, таких как использование dotnet или nuget.exe CLI для упаковки пакетов. Если вы уже используете MSBuild или другие задачи для создания пакетов, вы можете пропустить этот раздел и перейти к следующему.

Чтобы создать пакет 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)'

Публикация пакетов во внутренних веб-каналах

Примечание.

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

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

Публикация пакетов во внешних веб-каналах

Чтобы опубликовать пакеты во внешних веб-каналах NuGet или общедоступных реестрах, таких как веб-каналы в других организациях Azure DevOps или nuget.org, необходимо сначала создать подключение к службе для проверки подлинности в соответствующей службе:

  1. В проекте Azure DevOps перейдите к подключениям >службы параметров проекта>

  2. Нажмите кнопку "Создать подключение к>службе" NuGet>Далее.

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

Примечание.

Задача NuGetAuthenticate@1 поддерживает подключения служб с базовой проверкой подлинности, но не поддерживает проверку подлинности Apikey. Чтобы использовать проверку подлинности ApiKey, вместо этого необходимо использовать задачу NuGetCommand@2.

Чтобы опубликовать пакеты 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. Войдите в учетную запись nuget.org и создайте ключ API.

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

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

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

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

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

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

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