Работа с частными репозиториями 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.
PowerShell Gallery