Usar um feed de Artefatos do Azure como um repositório privado do PowerShell

Azure DevOps Services

Os Artefatos do Azure fornecem uma maneira fácil de compartilhar scripts do PowerShell entre equipes para promover a colaboração e maximizar a eficácia. Ao armazenar módulos do PowerShell em um repositório privado, você pode dar aos membros de sua equipe a capacidade de baixar ou atualizar esses scripts rapidamente usando a linha de comando.

Este artigo irá guiá-lo durante a configuração do feed de Artefatos do Azure como um repositório privado do PowerShell para armazenar e compartilhar seus módulos do PowerShell. Você aprenderá a:

  • Criar um token de acesso pessoal
  • Criar um novo feed para armazenar módulos do PowerShell
  • Criar, empacotar e publicar módulos do PowerShell
  • Conectar-se a um feed com o PowerShell
  • Usar o repositório privado do PowerShell com o Azure Pipelines

Pré-requisitos

Criar um token de acesso pessoal

Usar um token de acesso pessoal (PAT) é uma ótima maneira de autenticar com o Azure DevOps sem usar suas credenciais principais. Consulte Usar tokens de acesso pessoal para obter mais detalhes.

  1. Navegue até sua organização do Azure DevOps https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Selecione o ícone de configurações do usuário e, em seguida, selecione Tokens de acesso pessoais.

    A screenshot showing how to create a personal access token.

  3. Selecionar Novo Token

  4. Insira um nome para seu PAT e escolha uma Data de validade .

  5. Selecione Personalizado definido e, em seguida, selecione Empacotando>Leitura, gravação e gerenciamento.

  6. Selecione Criar quando terminar. Copie e armazene seu PAT em um local seguro.

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

Criar um módulo

  1. Crie uma nova pasta Get-Hello. Navegue dentro de sua pasta e crie um novo arquivo 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. Cole o seguinte script no arquivo Get-Hello.psm1 :

    Function Get-Hello{
        Write-Host "Hello from my Azure DevOps Services Package."
    }
    
  3. Crie o manifesto do módulo executando o seguinte comando no caminho do diretório Get-Hello.

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Abra o arquivo Get-Hello.psd1 e localize a RootModule variável. Substitua a cadeia de caracteres vazia pelo caminho para o arquivo Get-Hello.psm1 da seguinte maneira:

    RootModule = 'Get-Hello.psm1'
    
  5. A FunctionsToExport seção destina-se a definir a lista de funções que serão exportadas deste módulo. Adicione sua função Get-Hello da seguinte maneira:

    FunctionsToExport = @('Get-Hello')
    
  6. Localize a seção e adicione a FileList seguinte lista de arquivos que devem ser empacotados com seu módulo.

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

Módulo de empacotamento e publicação

  1. Crie um arquivo nuspec para seu módulo. Esse comando criará um arquivo Get-Hello.nuspec que contém os metadados necessários para empacotar o módulo.

    nuget spec Get-Hello
    
  2. Execute o seguinte comando para empacotar seu módulo.

    nuget pack Get-Hello.nuspec
    
  3. Execute o seguinte comando para adicionar o URL de origem do feed. NuGet v3 não é suportado, certifique-se de usar v2 em seu URL de origem do feed.

    • Feed com escopo organizacional:

      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>"
      
    • Feed do projeto com escopo:

      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. Publique o pacote no seu feed.

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

    A screenshot showing the published package.

Importante

O número da versão no Manifesto do módulo (.psd1) e o arquivo .nuspec devem corresponder.

Conectar-se ao feed como um repositório do PowerShell

  1. Abra uma janela de prompt do PowerShell com privilégios elevados.

  2. Configure suas credenciais para autenticar com os Artefatos do Azure. Substitua os espaços reservados pelas informações apropriadas.

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  3. Registre seu repositório do PowerShell. O SourceLocation link pode ser encontrado navegando até Artifacts>Connect to Feed>NuGet.exe em URL de origem da configuração do projeto.

    • Feed do projeto com escopo:

      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
      
    • Feed com escopo organizacional:

      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
      

    Se você ainda estiver usando as URLs mais antigas visualstudio.com , use o seguinte comando:

    • Feed do projeto com escopo:

      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
      
    • Feed com escopo organizacional:

      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
      

    Dica

    Determinadas versões do PowerShell exigem a reinicialização de uma nova sessão após a execução do cmdlet para evitar o aviso Não é possível resolver a origem do Register-PSRepositorypacote.

  4. Registre a origem do pacote:

    • Feed do projeto com escopo:

      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
      
    • Feed com escopo organizacional:

      Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices 
      
  5. Execute o comando a seguir para confirmar se o repositório foi registrado com êxito. Este comando obtém todos os repositórios registrados para o usuário atual:

    Get-PSRepository
    
  6. Execute o comando a seguir se quiser localizar todos os módulos no repositório.

    Find-Module -Repository PowershellAzureDevopsServices
    
  7. Execute o seguinte comando se desejar instalar o módulo Get-Hello .

    Install-Module -Name Get-Hello -Repository PowershellAzureDevopsServices
    

Se o comando Install-Module estiver retornando o seguinte erro: Não é possível resolver a origem do pacote, execute o cmdlet novamente com o TrustedRegister-PackageSource sinalizador da seguinte maneira:

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

Observação

Se sua organização estiver usando um firewall ou um servidor proxy, confirme se permite URLs de domínio e endereços IP do Azure Artifacts.

Registrar e instalar módulo usando o Azure Pipelines

Este exemplo ilustra o processo de autenticação e instalação de um módulo do PowerShell usando um pipeline YAML. Para usar seu token de acesso pessoal dentro do pipeline, você deve incluí-lo como uma variável de pipeline, da seguinte maneira:

  1. Entre na sua organização do Azure DevOps e navegue até seu projeto.

  2. Selecione Pipelines, selecione seu pipeline e, em seguida, selecione Editar para editar seu pipeline.

  3. Selecione Variáveis no canto superior direito e, em seguida, selecione o + sinal para criar uma nova variável.

  4. Forneça um Nome para sua variável e cole seu token de acesso pessoal na caixa de texto Valor .

  5. Marque a caixa de seleção Manter este valor secreto. Selecione Ok quando terminar. Agora você está pronto para usar sua variável em seu pipeline.

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)