Uso de una fuente de Azure Artifacts como repositorio privado de PowerShell

Azure DevOps Services

Azure Artifacts proporciona una manera sencilla de compartir scripts de PowerShell entre equipos para promover la colaboración y maximizar la eficacia. Al almacenar módulos de PowerShell en un repositorio privado, puede proporcionar a los miembros de su equipo la capacidad de descargar o actualizar esos scripts rápidamente mediante la línea de comandos.

Este artículo le guiará a través de la configuración de la fuente de Azure Artifacts como un repositorio privado de PowerShell para almacenar y compartir los módulos de PowerShell. Aprenderá a:

  • Creación de un token de acceso personal
  • Creación de una nueva fuente para almacenar módulos de PowerShell
  • Creación, empaquetado y publicación de módulos de PowerShell
  • Conectar a una fuente con PowerShell
  • Uso del repositorio privado de PowerShell con Azure Pipelines

Requisitos previos

Crear un token de acceso personal

El uso de un token de acceso personal (PAT) es una excelente manera de autenticarse con Azure DevOps sin usar las credenciales principales. Consulte Uso de tokens de acceso personal para obtener más detalles.

  1. Vaya a la organización de Azure DevOps. https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Seleccione el icono de configuración de usuario y, a continuación, seleccione Tokens de acceso personal.

    A screenshot showing how to create a personal access token.

  3. Seleccione Nuevo token.

  4. Escriba un nombre para el PAT y, a continuación, elija una fecha de expiración .

  5. Seleccione Personalizado definido y, a continuación, seleccione Empaquetado>de lectura, escritura y administración.

  6. Seleccione Crear cuando haya terminado. Copie y almacene su PAT en una ubicación segura.

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

Creación de un módulo

  1. Cree una nueva carpeta Get-Hello. Navegue dentro de la carpeta y cree un nuevo archivo 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. Pegue el siguiente script en el archivo Get-Hello.psm1 :

    Function Get-Hello{
        Write-Host "Hello from my Azure DevOps Services Package."
    }
    
  3. Cree el manifiesto del módulo ejecutando el comando siguiente en la ruta de acceso del directorio Get-Hello .

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Abra el archivo Get-Hello.psd1 y busque la RootModule variable . Reemplace la cadena vacía por la ruta de acceso al archivo Get-Hello.psm1 de la siguiente manera:

    RootModule = 'Get-Hello.psm1'
    
  5. La FunctionsToExport sección está pensada para definir la lista de funciones que se exportarán desde este módulo. Agregue la función Get-Hello de la siguiente manera:

    FunctionsToExport = @('Get-Hello')
    
  6. Busque la FileList sección y agregue la siguiente lista de archivos que se deben empaquetar con el módulo.

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

Empaquetado y publicación del módulo

  1. Cree un archivo nuspec para el módulo. Este comando creará un archivo Get-Hello.nuspec que contiene los metadatos necesarios para empaquetar el módulo.

    nuget spec Get-Hello
    
  2. Ejecute el siguiente comando para empaquetar el módulo.

    nuget pack Get-Hello.nuspec
    
  3. Ejecute el siguiente comando para agregar la dirección URL del origen de la fuente. NuGet v3 no es compatible, asegúrese de usar v2 en la dirección URL del origen de la fuente.

    • Fuente con ámbito de organización:

      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>"
      
    • Fuente con ámbito de proyecto:

      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 el paquete en la fuente.

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

    A screenshot showing the published package.

Importante

El número de versión del manifiesto del módulo (.psd1) y el archivo .nuspec deben coincidir.

Conectar para alimentarse como repositorio de PowerShell

  1. Abra una ventana de símbolo del sistema de PowerShell con privilegios elevados.

  2. Configure las credenciales para autenticarse con Azure Artifacts. Reemplace los marcadores de posición por la información adecuada.

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  3. Registre el repositorio de PowerShell. Para encontrar el SourceLocation vínculo, vaya a Artifacts> Conectar to Feed>NuGet.exe (Fuente de NuGet.exe) en Dirección URL de origen del programa de instalación del proyecto.

    • Fuente con ámbito de proyecto:

      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
      
    • Fuente con ámbito de organización:

      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
      

    Si sigue usando las direcciones URL anteriores visualstudio.com , use el siguiente comando en su lugar:

    • Fuente con ámbito de proyecto:

      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
      
    • Fuente con ámbito de organización:

      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
      

    Sugerencia

    Algunas versiones de PowerShell requieren reiniciar una nueva sesión después de ejecutar el Register-PSRepository cmdlet para evitar la advertencia no se puede resolver el origen del paquete .

  4. Registre el origen del paquete:

    • Fuente con ámbito de proyecto:

      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
      
    • Fuente con ámbito de organización:

      Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices 
      
  5. Ejecute el siguiente comando para confirmar si el repositorio se registró correctamente. Este comando obtiene todos los repositorios registrados para el usuario actual:

    Get-PSRepository
    
  6. Ejecute el siguiente comando si desea buscar todos los módulos en el repositorio.

    Find-Module -Repository PowershellAzureDevopsServices
    
  7. Ejecute el siguiente comando si desea instalar el módulo Get-Hello .

    Install-Module -Name Get-Hello -Repository PowershellAzureDevopsServices
    

Si el comando Install-Module devuelve el siguiente error: No se puede resolver el origen del paquete, vuelva a ejecutar el Register-PackageSource cmdlet con la Trusted marca siguiente:

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

Nota:

Si su organización usa un firewall o un servidor proxy, asegúrese de permitir direcciones IP y direcciones URL de dominio de Azure Artifacts.

Registro e instalación del módulo mediante Azure Pipelines

En este ejemplo se muestra el proceso de autenticación e instalación de un módulo de PowerShell mediante una canalización YAML. Para usar el token de acceso personal dentro de la canalización, debe incluirlo como una variable de canalización, como se indica a continuación:

  1. Inicie sesión en su organización de Azure DevOps y vaya a su proyecto.

  2. Seleccione Canalizaciones, seleccione la canalización y, a continuación, seleccione Editar para editar la canalización.

  3. Seleccione Variables en la esquina superior derecha y, a continuación, seleccione el + signo para crear una nueva variable.

  4. Proporcione un nombre para la variable y pegue el token de acceso personal en el cuadro de texto Valor .

  5. Asegúrese de activar la casilla Mantener este secreto de valor. Seleccione Aceptar cuando haya terminado. Ya está listo para usar la variable en la canalización.

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)