Trabajo con repositorios de PowerShellGet privados

El módulo de PowerShellGet admite repositorios que no sean la Galería de PowerShell. Estos cmdlets permiten los siguientes escenarios:

  • Compatibilidad con un conjunto confiable y validado previamente de módulos de PowerShell para usar en su entorno
  • Prueba de una canalización de CI/CD que compila los módulos o scripts de PowerShell
  • Suministro de módulos y scripts de PowerShell a los sistemas que no pueden acceder a Internet
  • Entrega de scripts y módulos de PowerShell solo disponibles para su organización

En este artículo se describe cómo configurar un repositorio local de PowerShell. El artículo también trata el módulo OfflinePowerShellGetDeploy disponible en la Galería de PowerShell. Este módulo contiene cmdlets para instalar la versión más reciente de PowerShellGet en el repositorio local.

Tipos de repositorio local

Existen dos formas de crear un repositorio PSRepository local: Servidor de NuGet o recurso compartido de archivos. Cada tipo tiene ventajas y desventajas:

Servidor de NuGet

Ventajas Inconvenientes
Imita la funcionalidad de PowerShellGallery La aplicación de niveles múltiples requiere la planeación y la compatibilidad de las aplicaciones.
NuGet se integra con Visual Studio, otras herramientas. Se necesita un modelo de autenticación y administración de cuentas de NuGet.
NuGet es compatible con los metadatos en paquetes .Nupkg. La publicación requiere mantenimiento y administración de claves de API.
Proporciona búsqueda, administración de paquetes, etc.

Recurso compartido de archivos

Ventajas Inconvenientes
Fácil configuración, proceso de copia de seguridad y mantenimiento. Sin interfaz de usuario más allá del recurso compartido de archivos básico.
Modelo de seguridad simple: permisos de usuario en el recurso compartido. Seguridad limitada y ausencia de registro de quién actualiza qué.
Sin restricciones como el reemplazo de los elementos existentes.

PowerShellGet funciona con cualquier tipo y admite la búsqueda de versiones y la instalación de dependencias. Sin embargo, algunas características que funcionan para la Galería de PowerShell no están disponibles para los servidores o los recursos compartidos de archivos de NuGet básicos. No hay diferenciación de scripts, módulos, recursos de DSC ni funcionalidades de rol.

Creación de un repositorio de NuGet.Server

El siguiente artículo enumera los pasos para configurar su propio servidor de NuGet.

Siga los pasos hasta el momento de agregar los paquetes. Los pasos para publicar un paquete se tratan más adelante en este artículo.

En el caso de un repositorio basado en recursos compartidos de archivos, asegúrese de que los usuarios tienen permisos para acceder a dicho recurso.

Registro de un repositorio local

Para que un repositorio se pueda usar, debe registrarse con el comando Register-PSRepository. En los ejemplos siguientes, InstallationPolicy se establece Trusteden , en la suposición de que confía en su propio repositorio.

# 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

Observe la diferencia entre el modo en que los dos comandos controlan ScriptSourceLocation. Para repositorios basados en recursos compartidos de archivos, las propiedades SourceLocation y ScriptSourceLocation deben coincidir. En el caso de un repositorio basado en web, deben ser diferentes; por tanto, en este ejemplo se agrega "/" final a SourceLocation.

Al usar un protocolo de uso compartido de archivos, como NFS o SMB, asegúrese de seguir las instrucciones recomendadas para proteger el protocolo. Para obtener más información sobre cómo proteger SMB en Windows, vea [Mejoras de seguridad de SMB][09].

Si desea que el repositorio PSRepository recién creado sea el repositorio predeterminado, debe anular el registro de todos los demás repositorios PSRepositories. Por ejemplo:

Unregister-PSRepository -Name PSGallery

Nota

El repositorio llamado "PSGallery" está reservado para su uso por la Galería de PowerShell. Puede anular el registro de PSGallery, pero no puede reutilizar el nombre PSGallery para ningún otro repositorio.

Si necesita restaurar PSGallery, ejecute el siguiente comando:

Register-PSRepository -Default

Publicación en un repositorio local

Una vez que haya registrado la instancia local de PSRepository, puede publicar en ella. Hay dos escenarios principales de publicación: publicación de su propio módulo y publicación de un módulo desde PSGallery.

Publicación de un módulo que ha creado

Use Publish-Module y Publish-Script para publicar el módulo en su PSRepository local del mismo modo que lo hace para la Galería de PowerShell.

  • Especifique la ubicación del código.
  • Proporcione una clave de API.
  • Especifique el nombre del repositorio. Por ejemplo: -PSRepository LocalPSRepo

Nota

Debe crear una cuenta en el servidor de NuGet y luego iniciar sesión para generar y guardar la clave de API. En el caso de un recurso compartido de archivos, use cualquier cadena no vacía para el valor de clave NuGetApiKey.

Ejemplos:

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'c:\projects\MyModule'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

Importante

Para garantizar la seguridad, las claves de API no deben codificarse de forma rígida en scripts. Use un sistema de administración de claves seguro. Al ejecutar manualmente un comando, las claves de API no se deben pasar como texto sin formato para evitar que se registre, el Read-Host cmdlet se puede usar para pasar de forma segura el valor de la clave de 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

Publicación de un módulo de PSGallery

Para publicar un módulo desde PSGallery en su PSRepository local, puede usar el Save-Package cmdlet .

  • Especifique el nombre del paquete.
  • Especifique "NuGet" como proveedor.
  • Especifique la ubicación de PSGallery como origen (https://www.powershellgallery.com/api/v2)
  • Especifique la ruta de acceso al repositorio local.

Ejemplo:

# 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

Si su PSRepository local está basado en web, requiere un paso adicional que use nuget.exe para publicar. Consulte la documentación para usar nuget.exe.

Instalación de PowerShellGet en un sistema sin conexión

La implementación de PowerShellGet es difícil en entornos que necesitan que los sistemas estén desconectados de Internet. PowerShellGet ofrece un proceso de arranque que instala la versión más reciente la primera vez que se utiliza. El módulo OfflinePowerShellGetDeploy de la Galería de PowerShell proporciona cmdlets que admiten este proceso de arranque.

Para arrancar una implementación sin conexión, es preciso lo siguiente:

  • Descargar e instalar OfflinePowerShellGetDeploy en su sistema conectado a Internet y sus sistemas sin conexión
  • Descargar PowerShellGet y sus dependencias en el sistema conectado a Internet mediante el cmdlet Save-PowerShellGetForOffline
  • Copiar PowerShellGet y sus dependencias del sistema conectado a Internet al sistema sin conexión
  • Usar Install-PowerShellGetOffline en el sistema sin conexión para colocar PowerShellGet y sus dependencias en las carpetas correspondientes

Los siguientes comandos usan Save-PowerShellGetForOffline para poner todos los componentes en una carpeta 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'

En este momento, debe poner el contenido de F:\OfflinePowerShellGet a disposición de los sistemas sin conexión. Ejecute el cmdlet Install-PowerShellGetOffline para instalar PowerShellGet en el sistema sin conexión.

Nota

Es importante que no ejecute PowerShellGet en la sesión de PowerShell antes de ejecutar estos comandos. Una vez que PowerShellGet se carga en la sesión, los componentes no se pueden actualizar. Si inicia por error PowerShellGet, salga y reinicie PowerShell.

Import-Module F:\OfflinePowerShellGetDeploy
Install-PowerShellGetOffline -LocalFolder 'F:\OfflinePowerShellGet'

Después de ejecutar estos comandos, está listo para publicar PowerShellGet en el repositorio local.

# Publish to a NuGet Server repository using my NuGetAPI key
$publishModuleSplat = @{
    Path = 'F:\OfflinePowershellGet'
    Repository = 'LocalPsRepo'
    NuGetApiKey = $nuGetApiKey
}
Publish-Module @publishModuleSplat

Importante

Para garantizar la seguridad, las claves de API no deben codificarse de forma rígida en scripts. Use un sistema de administración de claves seguro. Al ejecutar manualmente un comando, las claves de API no se deben pasar como texto sin formato para evitar que se registre, el Read-Host cmdlet se puede usar para pasar de forma segura el valor de la clave de 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

Uso de soluciones de empaquetado para hospedar repositorios de PowerShellGet

También puede usar soluciones de empaquetado como Azure Artifacts para hospedar un repositorio de PowerShellGet privado o público. Para más información e instrucciones, consulte la documentación de Azure Artifacts.