Использование веб-канала Артефактов Azure в качестве частного репозитория PowerShell

Azure DevOps Services

Azure Artifacts предоставляет простой способ совместного использования сценариев PowerShell между командами для повышения совместной работы и повышения эффективности. Сохраняя модули PowerShell в частном репозитории, вы можете предоставить участникам команды возможность быстро загружать или обновлять эти скрипты с помощью командной строки.

В этой статье описано, как настроить веб-канал Azure Artifacts в качестве частного репозитория PowerShell для хранения и совместного использования модулей PowerShell. Вы изучите следующие темы:

  • Создание личного маркера доступа
  • Создание веб-канала для хранения модулей PowerShell
  • Создание, упаковка и публикация модулей PowerShell
  • Подключение в веб-канал с помощью PowerShell
  • Использование частного репозитория PowerShell с Azure Pipelines

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

Создание личного маркера доступа

Использование личного маркера доступа (PAT) — отличный способ проверки подлинности с помощью Azure DevOps без использования основных учетных данных. Дополнительные сведения см. в разделе "Использование личных маркеров доступа".

  1. Перейдите в организацию Azure DevOps https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Щелкните значок параметров пользователя и выберите личные маркеры доступа.

    A screenshot showing how to create a personal access token.

  3. Выбор нового маркера

  4. Введите имя для PAT и выберите дату окончания срока действия.

  5. Выберите "Настраиваемый", а затем выберите "Упаковка>чтения", "Запись" и "Управление".

  6. После завершения работы выберите Создать. Скопируйте и сохраните PAT в безопасном расположении.

    A screenshot showing how to set up a new personal access token.

Создание модуля

  1. Создайте новую папку Get-Hello. Перейдите в папку и создайте файл Get-Hello.psm1.

    |--- Get-Hello               // Parent folder     
        |--- Get-Hello.psm1     // This will become our PowerShell Module
        |--- Get-Hello.psd1    // This will become our module manifest
    
  2. Вставьте следующий скрипт в файл Get-Hello.psm1 :

    Function Get-Hello{
        Write-Host "Hello from my Azure DevOps Services Package."
    }
    
  3. Создайте манифест модуля, выполнив следующую команду в пути к каталогу Get-Hello .

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Откройте файл Get-Hello.psd1 и найдите RootModule переменную. Замените пустую строку путем к файлу Get-Hello.psm1 следующим образом:

    RootModule = 'Get-Hello.psm1'
    
  5. Этот FunctionsToExport раздел предназначен для определения списка функций, которые будут экспортированы из этого модуля. Добавьте функцию Get-Hello следующим образом:

    FunctionsToExport = @('Get-Hello')
    
  6. FileList Найдите раздел и добавьте следующий список файлов, которые следует упаковать с помощью модуля.

    FileList = @('./Get-Hello.psm1')
    

Пакет и модуль публикации

  1. Создайте nuspec-файл для модуля. Эта команда создаст файл Get-Hello.nuspec , содержащий метаданные, необходимые для упаковки модуля.

    nuget spec Get-Hello
    
  2. Выполните следующую команду, чтобы упаковать модуль.

    nuget pack Get-Hello.nuspec
    
  3. Выполните следующую команду, чтобы добавить URL-адрес источника веб-канала. NuGet версии 3 не поддерживается, убедитесь, что вы используете версию 2 в URL-адресе источника веб-канала.

    • Веб-канал область организации:

      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>"
      
    • Веб-канал Project-область d:

      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>"
      
  4. Опубликуйте пакет в веб-канале.

    nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
    

    A screenshot showing the published package.

Важно!

Номер версии в манифесте модуля (PSD1) и nuspec-файле должен соответствовать.

Подключение для веб-канала в качестве репозитория PowerShell

  1. Откройте окно командной строки PowerShell с повышенными привилегиями.

  2. Настройте учетные данные для проверки подлинности с помощью Артефактов Azure. Замените заполнители соответствующими сведениями.

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  3. Зарегистрируйте репозиторий PowerShell. Ссылку SourceLocation можно найти, перейдя к артефактам> Подключение веб-канал>NuGet.exe в url-адресе источника установки проекта.

    • Веб-канал Project-область d:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -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 "PowershellAzureDevopsServices" -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
      

    Если вы по-прежнему используете старые visualstudio.com URL-адреса, используйте следующую команду:

    • Веб-канал Project-область d:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -SourceLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
      
    • Веб-канал область организации:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -SourceLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
      

    Совет

    Для некоторых версий PowerShell требуется перезапуск нового сеанса после выполнения командлета Register-PSRepository , чтобы избежать предупреждения источника пакета не удалось.

  4. Зарегистрируйте источник пакета:

    • Веб-канал Project-область d:

      Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
      
    • Веб-канал область организации:

      Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices 
      
  5. Выполните следующую команду, чтобы подтвердить успешность регистрации репозитория. Эта команда получает все зарегистрированные репозитории для текущего пользователя:

    Get-PSRepository
    
  6. Выполните следующую команду, если вы хотите найти все модули в репозитории.

    Find-Module -Repository PowershellAzureDevopsServices
    
  7. Выполните следующую команду, если вы хотите установить модуль Get-Hello .

    Install-Module -Name Get-Hello -Repository PowershellAzureDevopsServices
    

Если команда Install-Module возвращает следующую ошибку: не удается разрешить источник пакета, выполните Register-PackageSource командлет еще раз с флагом Trusted следующим образом:

Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -Trusted -SkipValidate -Credential $credsAzureDevopsServices

Примечание.

Если ваша организация использует брандмауэр или прокси-сервер, убедитесь, что вы разрешаете URL-адреса и IP-адреса домена Azure Artifacts.

Регистрация и установка модуля с помощью Azure Pipelines

В этом примере показан процесс проверки подлинности и установки модуля PowerShell с помощью конвейера YAML. Чтобы использовать личный маркер доступа в конвейере, необходимо включить его в качестве переменной конвейера, как показано ниже.

  1. Войдите в организацию Azure DevOps и перейдите к проекту.

  2. Выберите конвейер, выберите конвейер, а затем нажмите кнопку "Изменить ", чтобы изменить конвейер.

  3. Выберите переменные в правом верхнем углу и выберите + знак, чтобы создать новую переменную.

  4. Укажите имя переменной и вставьте личный маркер доступа в текстовое поле "Значение".

  5. Убедитесь, что выбран флажок "Сохранить этот секрет значения" проверка box. Нажмите кнопку "ОК " после завершения. Теперь вы готовы использовать переменную в конвейере.

trigger:
- main

pool:
  vmImage: 'Windows-latest'

variables:
  PackageFeedEndpoint: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2'  ## For project scoped feeds use: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2'
  PackageFeedEndpointCredential: '{"endpointCredentials": [{"endpoint":"$(PackageFeedEndpoint)", "username":"Admin", "password":"$(AZURE_DEVOPS_PAT)"}]}'

steps:
- powershell: |
    Register-PSRepository -Name "psRepoPipeline" -SourceLocation '$(PackageFeedEndpoint)' -InstallationPolicy Trusted
  displayName: 'Register Azure Artifacts Feed as PSRepository'
  env:
    VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: $(PackageFeedEndpointCredential)

- powershell: |
     echo (Get-PSRepository)
  displayName: 'Get all module repositories'

- powershell: |
    Find-Module -Name "Get-Hello" | Install-Module -Confirm:$false -Force
  displayName: 'Install the Get-Hello PowerShell module'
  env:
    VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: $(PackageFeedEndpointCredential)