Использование веб-канала Артефактов Azure в качестве частного репозитория PowerShell
Azure DevOps Services
Артефакты Azure предоставляют удобное решение для совместного использования сценариев PowerShell. С помощью веб-каналов Azure Artifacts можно легко публиковать модули PowerShell из командной строки и управлять доступом к ним с помощью параметров веб-канала. В этой статье описано, как настроить веб-канал Azure Artifacts в качестве частного репозитория PowerShell для хранения и совместного использования модулей PowerShell.
В этой статье вы узнаете, как выполнять следующие задачи.
- Создание личного маркера доступа
- Создание модуля PowerShell
- Создание хранилища SecretStore и регистрация репозитория
- Публикация и использование пакетов из веб-канала
Необходимые компоненты
Создайте организацию Azure DevOps и проект, если вы еще не сделали этого.
Создайте веб-канал, если у вас еще нет.
Установите PSResourceGet.
Примечание.
Поставщик учетных данных Azure Artifacts не поддерживается в PSResourceGet.
Создание личного маркера доступа
Личный маркер доступа выступает в качестве цифрового удостоверения и служит альтернативным паролем для проверки подлинности пользователей в Azure DevOps.
Перейдите в организацию Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Щелкните значок параметров пользователя, выберите личные маркеры доступа и выберите новый маркер.
Введите имя для PAT, задайте дату окончания срока действия, выберите "Настраиваемый", а затем выберите "Упаковка>чтения", "Запись" и "Управление".
Нажмите кнопку "Создать " по завершении и убедитесь, что вы копируете и храните PAT в безопасном расположении.
Создание модуля PowerShell
Если у вас нет собственного модуля, следуйте инструкциям в этом разделе, чтобы создать пример модуля PowerShell. В противном случае перейдите к следующему шагу:
Создайте новую папку PowerShell-Demo. Перейдите в папку и создайте файл PowerShell-Demo.psm1.
Вставьте следующий скрипт в файл PowerShell-Demo.psm1 :
Function PowerShell-Demo{ Write-Host "Hello World!" }
Создайте манифест модуля, выполнив следующую команду в каталоге PowerShell-Demo :
New-ModuleManifest -Path .\PowerShell-Demo.psd1
Откройте файл PowerShell-Demo.psd1 и найдите
RootModule
переменную. Этот параметр указывает основной файл скрипта, который PowerShell загружает при импорте модуля. Замените пустую строку путем к файлу PowerShell-Demo.psm1 :RootModule = 'PowerShell-Demo.psm1'
В
FunctionsToExport
разделе указывается, какие функции доступны пользователям при импорте модуля. Включите функцию PowerShell-Demo:FunctionsToExport = @('PowerShell-Demo')
FileList
Найдите раздел, в котором перечислены файлы, включенные в упаковку модуля. Добавьте файл, который вы хотите упаковать с помощью модуля:FileList = @('./PowerShell-Demo.psm1')
Регистрация репозитория
Выполните следующую команду, чтобы создать объект учетных данных. Замените заполнители правильными сведениями.
$username = "<USER_NAME>" $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
Убедитесь, что установлены SecretManagement и SecretStore , а затем выполните следующую команду, чтобы создать хранилище и добавить секрет:
Register-SecretVault -Name "MySecretVault" -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault Set-Secret -Name "MyCredential" -Secret $credentials -Vault "MySecretVault" $CredentialInfo = [Microsoft.PowerShell.PSResourceGet.UtilClasses.PSCredentialInfo]::new('MySecretVault', 'MyCredential')
Чтобы проверить успешность создания хранилища и секрета, выполните следующую команду, чтобы получить список всех секретов:
PS > Get-SecretInfo Name Type VaultName ---- ---- --------- MyCredential PSCredential MySecretVault
Выполните следующую команду, чтобы зарегистрировать репозиторий PowerShell. Вы можете найти
SourceLocation
ссылку, перейдя по ссылке Artifacts>Connect to Feed>NuGet.exe, в разделе "Исходный URL-адрес раздела > установки проекта".Веб-канал с областью действия проекта:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Веб-канал с областью действия организации:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Совет
Для некоторых версий PowerShell может потребоваться запуск нового сеанса после выполнения командлета
Register-PSResourceRepository
, чтобы предотвратить возникновение предупреждения источника пакета.Чтобы проверить успешность регистрации репозитория, выполните следующую команду, чтобы получить все зарегистрированные репозитории для текущего пользователя:
Get-PSResourceRepository
Примечание.
Если возникла ошибка: код состояния ответа не указывает на успех: 404 (Не найдено).Убедитесь, что исходный URL-адрес указывает nuget/v3/index.json
вместо nuget/v2
него.
Публикация пакета
Выполните следующую команду, чтобы опубликовать пакет в веб-канале:
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>)
Пример:
PS C:\AzureDevOps\Demos\PowerShellDemo> Publish-PSResource -Path .\scripts\ -Repository FabrikamFiberFeed -ApiKey (Get-Secret MyNewCredential) -verbose
VERBOSE: Performing the operation "Publish-PSResource" on target "Publish resource
'C:\AzureDevOps\Demos\PowerShellDemo\scripts\' from the machine".
VERBOSE: The newly created nuspec is:
C:\Users\xxxx\AppData\Local\Temp\xxxxxxxxx\PowerShell-Demo.nuspec
VERBOSE: credential successfully read from vault and set for repository: FabrikamFiberFeed
VERBOSE: Successfully packed the resource into a .nupkg
VERBOSE: Successfully published the resource to
'https://pkgs.dev.azure.com/ramiMSFTDevOps/DemoProject/_packaging/FabrikamFiberFeed/nuget/v3/index.json'
VERBOSE: Deleting temporary directory 'C:\Users\xxxx\AppData\Local\Temp\xxxxxxx'
Установка пакета
Чтобы убедиться, что модуль доступен в репозитории, используйте следующую команду для поиска:
Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
Выполните следующую команду, чтобы установить последнюю стабильную версию модуля:
Install-PSResource <MODULE_NAME>
Совет
Если возникла ошибка: вызов исключения "WriteObject". Запустите новое окно PowerShell и запустите его Get-SecretInfo
. Введите пароль хранилища перед запуском Find-PSResource и Install-PSResource, так как срок ожидания SecretStore может истекать. Значение PasswordTimeout по умолчанию составляет 900 секунд, но это значение можно изменить по мере необходимости. Дополнительные сведения см. в статье "Использование SecretStore в службе автоматизации ".
В этой статье вы узнаете, как выполнять следующие задачи.
- Создание личного маркера доступа
- Создание, упаковка и публикация модуля PowerShell
- Подключение к веб-каналу в качестве репозитория PowerShell
- Регистрация и установка модуля PowerShell с помощью Azure Pipelines
Необходимые компоненты
Создайте организацию Azure DevOps и проект, если вы еще не сделали этого.
Создайте веб-канал, если у вас еще нет.
Установите поставщик учетных данных Azure Artifacts.
Установите NuGet.
Создание личного маркера доступа
Личный маркер доступа выступает в качестве цифрового удостоверения и служит альтернативным паролем для проверки подлинности пользователей в Azure DevOps.
Перейдите в организацию Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Щелкните значок параметров пользователя, выберите личные маркеры доступа и выберите новый маркер.
Введите имя для PAT, задайте дату окончания срока действия, выберите "Настраиваемый", а затем выберите "Упаковка>чтения", "Запись" и "Управление".
Нажмите кнопку "Создать " по завершении и убедитесь, что вы копируете и храните PAT в безопасном расположении.
Создание модуля PowerShell
Если у вас нет собственного модуля, следуйте инструкциям в этом разделе, чтобы создать пример модуля PowerShell. В противном случае перейдите к следующему шагу:
Создайте новую папку Get-Hello. Перейдите в папку и создайте файл Get-Hello.psm1.
Вставьте следующий скрипт в файл Get-Hello.psm1 :
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
Создайте манифест модуля, выполнив следующую команду в каталоге Get-Hello :
New-ModuleManifest -Path .\Get-Hello.psd1
Откройте файл Get-Hello.psd1 и найдите
RootModule
переменную. Этот параметр указывает основной файл скрипта, который PowerShell загружает при импорте модуля. Замените пустую строку путем к файлу Get-Hello.psm1 :RootModule = 'Get-Hello.psm1'
В
FunctionsToExport
разделе указывается, какие функции доступны пользователям при импорте модуля. Включите функцию Get-Hello:FunctionsToExport = @('Get-Hello')
FileList
Найдите раздел, который указывает файлы, включенные при упаковке модуля. Добавьте файл, который вы хотите упаковать с помощью модуля:FileList = @('./Get-Hello.psm1')
Упаковка и публикация модуля
Создайте nuspec-файл для модуля. Эта команда создает файл Get-Hello.nuspec , содержащий необходимые метаданные для упаковки модуля:
nuget spec Get-Hello
Выполните следующую команду, чтобы упаковать модуль:
nuget pack Get-Hello.nuspec
Выполните следующую команду, чтобы добавить URL-адрес источника веб-канала. Убедитесь, что вы используете версию 2 в URL-адресе источника веб-канала, так как NuGet версии 3 не поддерживается.
Веб-канал с областью действия организации:
nuget sources Add -Name "<FEED_NAME>" -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -username "<USER_NAME>" -password "<PERSONAL_ACCESS_TOKEN>"
Веб-канал с областью действия проекта:
nuget sources Add -Name "<FEED_NAME>" -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -username "<USER_NAME>" -password "<PERSONAL_ACCESS_TOKEN>"
Опубликуйте пакет в веб-канале:
nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
Внимание
Номер версии в манифесте модуля (PSD1) должен совпадать с номером версии в nuspec-файле .
Подключение к веб-каналу в качестве репозитория PowerShell
В этом разделе описывается проверка подлинности с помощью веб-канала в качестве репозитория PowerShell и использование модуля, размещенного в веб-канале:
В окне командной строки PowerShell выполните следующую команду, чтобы настроить учетные данные. Замените заполнители соответствующими сведениями.
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
Зарегистрируйте репозиторий PowerShell. Вы можете найти
SourceLocation
ссылку, перейдя по ссылке Artifacts>Connect to Feed>NuGet.exe, в разделе "Исходный URL-адрес раздела > установки проекта".Веб-канал с областью действия проекта:
Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
Веб-канал с областью действия организации:
Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
Совет
Для некоторых версий PowerShell может потребоваться запуск нового сеанса после выполнения командлета
Register-PSRepository
, чтобы предотвратить возникновение предупреждения источника пакета.Зарегистрируйте источник пакета:
Веб-канал с областью действия проекта:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Веб-канал с областью действия организации:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Примечание.
- Register-PSRepository: используется для регистрации репозитория PowerShell для поиска и установки модулей.
- Register-PackageSource: используется для регистрации источника пакета для поиска и публикации пакетов.
Чтобы проверить успешность регистрации репозитория, выполните следующую команду, чтобы получить все зарегистрированные репозитории для текущего пользователя:
Get-PSRepository
Выполните следующую команду, чтобы установить модуль Get-Hello .
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
Примечание.
Если в вашей организации используется брандмауэр или прокси-сервер, убедитесь, что вы разрешаете доступ к URL-адресам домена и IP-адресам домена Azure Artifacts.
Установка пакета из конвейера
В этом примере показано, как выполнить проверку подлинности с помощью веб-канала Артефактов Azure и установить модуль PowerShell из конвейера. Чтобы использовать личный маркер доступа, добавьте его в качестве переменной конвейера, как показано ниже:
Войдите в организацию Azure DevOps и перейдите к проекту.
Выберите конвейеры, выберите определение конвейера и нажмите кнопку "Изменить ", чтобы изменить конвейер.
Выберите переменные в правом верхнем углу и нажмите кнопку "Создать переменную".
Введите имя переменной и вставьте личный маркер доступа в текстовое поле "Значение".
Убедитесь, что установите флажок "Сохранить этот секрет значения". Нажмите кнопку "ОК " после завершения.
Добавьте вторую переменную для имени пользователя. Введите имя переменной, а затем введите имя пользователя в текстовое поле "Значение".
Выберите Сохранить, когда вы закончите.
trigger:
- main
pool:
vmImage: 'Windows-latest'
variables:
PackageFeedEndpoint: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2' ## For organization scoped feeds use'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2'
steps:
- powershell: |
$pat = ConvertTo-SecureString ${env:pat_token} -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("${env:userName}", $pat)
Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "$(PackageFeedEndpoint)" -InstallationPolicy Trusted -Credential $credential
displayName: 'Register PSRepository'
env:
pat_token: $patToken
userName: $userName
- powershell: |
nuget install <PACKAGE_NAME> -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json"
displayName: 'Install module'