Trabalhar com Repositórios PowerShellGet Privados

O módulo PowerShellGet suporta repositórios que não o Galeria do PowerShell. Estes cmdlets ativam os seguintes cenários:

  • Suportar um conjunto de módulos fidedignos e pré-validados do PowerShell para utilização no seu ambiente
  • Testar um pipeline CI/CD que cria módulos ou scripts do PowerShell
  • Entregar scripts e módulos do PowerShell a sistemas que não conseguem aceder à Internet
  • Entregar scripts e módulos do PowerShell apenas disponíveis para a sua organização

Este artigo descreve como configurar um repositório do PowerShell local. O artigo também abrange o módulo OfflinePowerShellGetDeploy disponível no Galeria do PowerShell. Este módulo contém cmdlets para instalar a versão mais recente do PowerShellGet no seu repositório local.

Tipos de repositório local

Existem duas formas de criar um PSRepository local: servidor NuGet ou partilha de ficheiros. Cada tipo tem vantagens e desvantagens:

Servidor NuGet

Vantagens Desvantagens
Imita a funcionalidade PowerShellGallery A aplicação de várias camadas requer o planeamento de operações & suporte
O NuGet integra-se com o Visual Studio, outras ferramentas Modelo de autenticação e gestão de contas NuGet necessária
O NuGet suporta metadados em .Nupkg pacotes A publicação requer a gestão da Chave de API & manutenção
Fornece pesquisa, administração de pacotes, etc.

Partilha de ficheiros

Vantagens Desvantagens
Fácil configurar, fazer cópias de segurança e manter Nenhuma IU além da partilha de ficheiros básica
Modelo de segurança simples – permissões de utilizador na partilha Segurança limitada e nenhuma gravação de quem atualiza o quê
Sem restrições, como substituir itens existentes

O PowerShellGet funciona com qualquer tipo e suporta a localização de versões e instalação de dependências. No entanto, algumas funcionalidades que funcionam para o Galeria do PowerShell não estão disponíveis para servidores NuGet base ou partilhas de ficheiros. Não existe nenhuma diferenciação de scripts, módulos, recursos do DSC ou capacidades de função.

Criar um repositório NuGet.Server

O artigo seguinte lista os passos para configurar o seu próprio Servidor NuGet.

Siga os passos até ao ponto de adicionar pacotes. Os passos para publicar um pacote são abordados mais adiante neste artigo.

Para um repositório baseado em partilha de ficheiros, certifique-se de que os seus utilizadores têm permissões para aceder à partilha de ficheiros.

Registar um repositório local

Antes de poder utilizar um repositório, tem de ser registado com o Register-PSRepository comando . Nos exemplos abaixo, InstallationPolicy está definido como Trusted, partindo do princípio de que confia no seu próprio repositório.

# 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

Tome nota da diferença entre a forma como os dois comandos processam ScriptSourceLocation. Para repositórios baseados em partilhas de ficheiros, o SourceLocation e o ScriptSourceLocation têm de corresponder. Para um repositório baseado na Web, estes têm de ser diferentes, pelo que, neste exemplo, é adicionado um "/" à origemLocation.

Ao utilizar um protocolo de partilha de ficheiros, como NFS ou SMB, certifique-se de que segue as orientações recomendadas para proteger o protocolo. Para obter mais informações sobre como proteger o SMB no Windows, consulte [Melhorias de segurança SMB][09].

Se quiser que o PSRepository recentemente criado seja o repositório predefinido, tem de anular o registo de todos os outros PSRepositórios. Por exemplo:

Unregister-PSRepository -Name PSGallery

Nota

O nome do repositório "PSGallery" está reservado para utilização pelo Galeria do PowerShell. Pode anular o registo de PSGallery, mas não pode reutilizar o nome PSGallery para qualquer outro repositório.

Se precisar de restaurar a PSGallery, execute o seguinte comando:

Register-PSRepository -Default

Publicar num repositório local

Depois de registar o PSRepository local, pode publicar no seu PSRepository local. Existem dois cenários de publicação principais: publicar o seu próprio módulo e publicar um módulo a partir da PSGallery.

Publicar um módulo que criou

Utilize Publish-Module e Publish-Script publique o módulo no seu PSRepository local da mesma forma que faz para o Galeria do PowerShell.

  • Especifique a localização do código
  • Fornecer uma chave de API
  • Especifique o nome do repositório. Por exemplo, -PSRepository LocalPSRepo

Nota

Tem de criar uma conta no servidor NuGet e, em seguida, iniciar sessão para gerar e guardar a chave de API. Para uma partilha de ficheiros, utilize qualquer cadeia não em branco para o valor NuGetApiKey.

Exemplos:

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

Importante

Para garantir a segurança, as chaves de API não devem ser codificadas em scripts. Utilize um sistema de gestão de chaves segura. Ao executar um comando manualmente, as chaves de API não devem ser transmitidas como texto simples para evitar que seja registado, o Read-Host cmdlet pode ser utilizado para transmitir em segurança o valor da chave 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

Publicar um módulo a partir da PSGallery

Para publicar um módulo da PSGallery no seu PSRepository local, pode utilizar o Save-Package cmdlet.

  • Especificar o Nome do Pacote
  • Especifique "NuGet" como Fornecedor
  • Especifique a localização PSGallery como a origem (https://www.powershellgallery.com/api/v2)
  • Especifique o caminho para o repositório local

Exemplo:

# 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

Se o seu PSRepository local for baseado na Web, é necessário um passo adicional que utilize nuget.exe para publicar. Veja a documentação para utilizar nuget.exe.

Instalar o PowerShellGet num sistema desligado

A implementação do PowerShellGet é difícil em ambientes que exigem que os sistemas sejam desligados da Internet. O PowerShellGet tem um processo de bootstrap que instala a versão mais recente da primeira vez que é utilizado. O módulo OfflinePowerShellGetDeploy no Galeria do PowerShell fornece cmdlets que suportam este processo de bootstrap.

Para iniciar uma implementação offline, tem de:

  • Transferir e instalar o OfflinePowerShellGetDeploy o seu sistema ligado à Internet e os seus sistemas desligados
  • Transferir o PowerShellGet e as respetivas dependências no sistema ligado à Internet com o Save-PowerShellGetForOffline cmdlet
  • Copiar o PowerShellGet e as respetivas dependências do sistema ligado à Internet para o sistema desligado
  • Utilize o no sistema desligado para colocar o Install-PowerShellGetOffline PowerShellGet e as respetivas dependências nas pastas adequadas

Os seguintes comandos são utilizados Save-PowerShellGetForOffline para colocar todos os componentes numa pasta 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'

Neste momento, tem de disponibilizar o conteúdo dos F:\OfflinePowerShellGet seus sistemas desligados. Execute o Install-PowerShellGetOffline cmdlet para instalar o PowerShellGet no sistema desligado.

Nota

É importante que não execute o PowerShellGet na sessão do PowerShell antes de executar estes comandos. Assim que o PowerShellGet for carregado para a sessão, os componentes não podem ser atualizados. Se iniciar o PowerShellGet por engano, saia e reinicie o PowerShell.

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

Depois de executar estes comandos, está pronto para publicar o PowerShellGet no seu repositório local.

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

Importante

Para garantir a segurança, as chaves de API não devem ser codificadas em scripts. Utilize um sistema de gestão de chaves segura. Ao executar um comando manualmente, as chaves de API não devem ser transmitidas como texto simples para evitar que seja registado, o Read-Host cmdlet pode ser utilizado para transmitir em segurança o valor da chave 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

Utilizar soluções de Empacotamento para alojar repositórios do PowerShellGet

Também pode utilizar soluções de empacotamento, como Artefactos do Azure, para alojar um repositório privado ou público do PowerShellGet. Para obter mais informações e instruções, veja a documentação dos Artefactos do Azure.