Работа с частными репозиториями PowerShellGet

Модуль PowerShellGet поддерживает репозитории, отличные от коллекции PowerShell. Эти командлеты реализуют следующие сценарии:

  • поддержка надежного, предварительно проверенного набора модулей PowerShell для использования в вашей среде;
  • тестирование конвейера CI/CD, который создает модули или скрипты PowerShell;
  • предоставление скриптов и модулей PowerShell для систем, которые не имеют доступа к Интернету.
  • предоставление скриптов и модулей PowerShell, доступных только для вашей организации.

В этой статье описывается, как настроить локальный репозиторий PowerShell. В статье также рассматривается модуль OfflinePowerShellGetDeploy, доступный в коллекции PowerShell. Этот модуль содержит командлеты для установки последней версии PowerShellGet в локальный репозиторий.

Типы локальных репозиториев

Локальный репозиторий PSRepository можно создать в одном из двух видов: в виде сервера NuGet или файлового ресурса. У каждого типа есть свои преимущества и недостатки.

Сервер NuGet

Преимущества Недостатки
Имитация функций PowerShellGallery Многоуровневое приложение требует планирования и поддержки операций
NuGet интегрируется с Visual Studio и другими средствами Требуется модель аутентификации и управление учетными записями NuGet
NuGet поддерживает метаданные в пакетах .Nupkg Публикация требует управления ключами API и их обслуживания
Возможность поиска, администрирования пакетов и т. д.

Общая папка

Преимущества Недостатки
Простота установки, резервного копирования и обслуживания Отсутствие интерфейса пользователя за пределами основного файлового ресурса
Простая модель безопасности: разрешения пользователей задаются для файлового ресурса Ограниченная безопасность и отсутствие записей о том, кто и что обновляет
Нет ограничений, таких как замена существующих элементов

PowerShellGet работает с любыми типами элементов и поддерживает поиск версий и установку зависимостей. Однако некоторые функции, которые работают в коллекции PowerShell, недоступны для базовых серверов NuGet или файловых ресурсов. Нет различий между скриптами, модулями, ресурсами DSC или возможностями ролей.

Создание репозитория NuGet.Server

В статье по следующей ссылке перечислены действия по настройке собственного сервера NuGet.

Следуйте инструкциям до момента добавления пакетов. Действия по публикации пакета описаны далее в этой статье.

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

Регистрация локального репозитория

Прежде чем репозиторий можно будет использовать, его необходимо зарегистрировать с помощью команды Register-PSRepository. В приведенных ниже примерах для параметра InstallationPolicy задано значение , при условии, что вы доверяете собственному Trustedрепозиторию.

# Register a NuGet-based server
$registerPSRepositorySplat = @{
    Name = 'LocalPSRepo'
    SourceLocation = 'http://MyLocalNuget/Api/V2/'
    ScriptSourceLocation = 'http://MyLocalNuget/Api/V2'
    InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat

# Register a file share on my local machine
$registerPSRepositorySplat = @{
    Name = 'LocalPSRepo'
    SourceLocation = '\\localhost\PSRepoLocal\'
    ScriptSourceLocation = '\\localhost\PSRepoLocal\'
    InstallationPolicy = 'Trusted'
}
Register-PSRepository @registerPSRepositorySplat

Обратите внимание на разницу между тем, как две команды обрабатывают параметр ScriptSourceLocation. Для репозиториев на основе файлового ресурса значения параметров SourceLocation и ScriptSourceLocation должны совпадать. Для веб-репозиториев они должны отличаться, поэтому в этом примере в параметр SourceLocation добавлен завершающий символ "/".

При использовании протокола общего доступа к файлам, например NFS или SMB, обязательно следуйте рекомендуемым рекомендациям по защите протокола. Дополнительные сведения о защите SMB в Windows см. в разделе [Улучшения безопасности SMB][09].

Если вы хотите, чтобы созданный репозиторий PSRepository был репозиторием по умолчанию, необходимо отменить регистрацию всех остальных репозиториев PowerShell. Пример:

Unregister-PSRepository -Name PSGallery

Примечание

Имя репозитория PSGallery зарезервировано для использования в коллекции PowerShell. Вы можете отменить регистрацию PSGallery, но нельзя повторно использовать имя PSGallery для любого другого репозитория.

Если вам нужно восстановить регистрацию PSGallery, выполните следующую команду:

Register-PSRepository -Default

Публикация в локальном репозитории

После того, как вы зарегистрировали локальный репозиторий PSRepository, вы можете выполнять в нем публикации. Существует два основных сценария публикации: публикация собственного модуля и публикация модуля из репозитория PSGallery.

Публикация созданного вами модуля

Чтобы опубликовать свой модуль в своем локальном репозитории PSRepository так же, как вы делаете это для коллекции PowerShell, используйте командлеты Publish-Module и Publish-Script.

  • Укажите расположение для своего кода.
  • Предоставьте ключ API.
  • Укажите имя репозитория. Например -PSRepository LocalPSRepo.

Примечание

Необходимо создать учетную запись на сервере NuGet, а затем войти в систему, чтобы создать и сохранить ключ API. При использовании файлового ресурса для значения NuGetApiKey укажите любую непустую строку.

Примеры:

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

Важно!

Чтобы обеспечить безопасность, ключи API не должны быть жестко запрограммированы в скриптах. Используйте безопасную систему управления ключами. При выполнении команды вручную ключи API не должны передаваться в виде обычного текста, чтобы избежать записи в журнал. Read-Host Командлет можно использовать для безопасной передачи значения ключа API.

# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat

Публикация модуля из PSGallery

Чтобы опубликовать модуль из PSGallery в локальном репозитории PSRepository, можно использовать Save-Package командлет .

  • Укажите имя пакета.
  • Укажите NuGet в качестве поставщика.
  • Укажите расположение PSGallery в качестве источника (https://www.powershellgallery.com/api/v2).
  • Укажите путь к вашему локальному репозиторию.

Пример.

# Publish from the PSGallery to your local Repository
$savePackageSplat = @{
    Name = 'PackageName'
    ProviderName = 'NuGet'
    Source = 'https://www.powershellgallery.com/api/v2'
    Path = '\\localhost\PSRepoLocal\'
}
Save-Package @savePackageSplat

Если локальный psRepository работает через Интернет, требуется дополнительный шаг, который используется nuget.exe для публикации. См. документацию по использованию nuget.exe.

Установка PowerShellGet в отключенной системе

Развертывание PowerShellGet затруднено в средах, где требуется отключение систем от Интернета. PowerShellGet имеет процесс начальной загрузки, который устанавливает последнюю версию при первом использовании. Модуль OfflinePowerShellGetDeploy в коллекции PowerShell предоставляет командлеты, которые поддерживают этот процесс начальной загрузки.

Чтобы выполнить начальную загрузку автономного развертывания, необходимо следующее:

  • Скачайте и установите OfflinePowerShellGetDeploy в вашей подключенной к Интернету и отключенных системах.
  • Скачайте PowerShellGet и его зависимости на подключенную к Интернету систему с помощью командлета Save-PowerShellGetForOffline.
  • Скопируйте PowerShellGet и его зависимости из подключенной к Интернету системы в отключенную систему.
  • Чтобы поместить PowerShellGet и его зависимости в соответствующие папки, используйте командлет Install-PowerShellGetOffline в отключенной системе.

Следующие команды используют Save-PowerShellGetForOffline, чтобы поместить все компоненты в папку f:\OfflinePowerShellGet.

# Requires -RunAsAdministrator
#Download the OfflinePowerShellGetDeploy to a location that can be accessed
# by both the connected and disconnected systems.
Save-Module -Name OfflinePowerShellGetDeploy -Path 'F:\' -Repository PSGallery
Import-Module F:\OfflinePowerShellGetDeploy

# Put PowerShellGet somewhere locally
Save-PowerShellGetForOffline -LocalFolder 'F:\OfflinePowerShellGet'

На этом этапе необходимо сделать содержимое F:\OfflinePowerShellGet доступным для ваших отключенных систем. Запустите командлет Install-PowerShellGetOffline, чтобы установить PowerShellGet в отключенной системе.

Примечание

Важно не запускать PowerShellGet в сеансе PowerShell перед выполнением этих команд. После загрузки PowerShellGet в сеанс невозможно обновить компоненты. Если вы по ошибке запустили PowerShellGet, закройте и перезапустите PowerShell.

Import-Module F:\OfflinePowerShellGetDeploy
Install-PowerShellGetOffline -LocalFolder 'F:\OfflinePowerShellGet'

После выполнения этих команд вы сможете опубликовать модуль PowerShellGet в своем локальном репозитории.

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'F:\OfflinePowershellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

Важно!

Чтобы обеспечить безопасность, ключи API не должны быть жестко заданы в скриптах. Используйте безопасную систему управления ключами. При выполнении команды вручную ключи API не должны передаваться в виде обычного текста, чтобы избежать регистрации. Read-Host Командлет можно использовать для безопасной передачи значения ключа API.

# Publish to a file share repo - the NuGet API key must be a non-blank string
$publishModuleSplat = @{
    Path = 'F:\OfflinePowerShellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = 'AnyStringWillDo'
}
Publish-Module @publishModuleSplat

Использование решений упаковки для размещения репозиториев PowerShellGet

Вы также можете использовать такие решения упаковки, как Azure Artifacts, для размещения частного или общедоступного репозитория PowerShellGet. Дополнительные сведения и инструкции см. в документации по Azure Artifacts.