Usare un feed di Azure Artifacts come repository Di PowerShell privato
Servizi di Azure DevOps
Azure Artifacts offre una soluzione pratica per la condivisione di script di PowerShell. Usando i feed di Azure Artifacts, è possibile pubblicare facilmente i moduli di PowerShell dalla riga di comando e controllare l'accesso tramite le impostazioni del feed. Questo articolo illustra come configurare il feed di Azure Artifacts come repository di PowerShell privato per archiviare e condividere i moduli di PowerShell.
In questo articolo si apprenderà come:
- Creare un token di accesso personale
- Creare un modulo di PowerShell
- Creare un insieme di credenziali secretStore e registrare un repository
- Pubblicare e utilizzare pacchetti da un feed
Prerequisiti
Creare un'organizzazione Azure DevOps e un progetto, se non è già stato fatto.
Crea un nuovo feed se non ne hai già uno.
Installare PSResourceGet.
Installare i moduli SecretManagement e SecretStore .
Nota
Il provider di credenziali di Azure Artifacts non è supportato con PSResourceGet.
Creare un token di accesso personale
Un token di accesso personale funge da identità digitale e funge da password alternativa per autenticare l'utente con Azure DevOps.
Passare all'organizzazione di Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Selezionare l'icona delle impostazioni utente, selezionare Token di accesso personali e quindi nuovo token.
Immettere un nome per il pat, impostare una data di scadenza, selezionare Personalizzato definito e quindi selezionare Creazione di pacchetti>di lettura, scrittura e gestione.
Al termine, selezionare Crea e assicurarsi di copiare e archiviare il pat in una posizione sicura.
Creare un modulo di PowerShell
Se non si ha un modulo personalizzato, seguire le istruzioni riportate in questa sezione per creare un modulo di PowerShell di esempio. In caso contrario, passare al passaggio successivo:
Creare una nuova cartella PowerShell-Demo. Passare alla cartella e creare un nuovo file PowerShell-Demo.psm1.
Incollare lo script seguente nel file PowerShell-Demo.psm1 :
Function PowerShell-Demo{ Write-Host "Hello World!" }
Generare il manifesto del modulo eseguendo il comando seguente nella directory PowerShell-Demo :
New-ModuleManifest -Path .\PowerShell-Demo.psd1
Aprire il file PowerShell-Demo.psd1 e individuare la
RootModule
variabile. Questa impostazione specifica il file di script principale caricato da PowerShell quando viene importato il modulo. Sostituire la stringa vuota con il percorso del file PowerShell-Demo.psm1 :RootModule = 'PowerShell-Demo.psm1'
La
FunctionsToExport
sezione specifica quali funzioni sono accessibili agli utenti quando importano il modulo. Includere la funzione PowerShell-Demo :FunctionsToExport = @('PowerShell-Demo')
Individuare la
FileList
sezione che elenca i file inclusi durante la creazione del pacchetto del modulo. Aggiungere il file che si vuole creare con il modulo:FileList = @('./PowerShell-Demo.psm1')
Registrare un repository
Eseguire il comando seguente per creare un oggetto credenziale. Sostituire i segnaposto con le informazioni corrette.
$username = "<USER_NAME>" $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
Assicurarsi che SecretManagement e SecretStore siano installati, quindi eseguire il comando seguente per creare un insieme di credenziali e aggiungere un segreto:
Register-SecretVault -Name "MySecretVault" -ModuleName Microsoft.PowerShell.SecretStore -DefaultVault Set-Secret -Name "MyCredential" -Secret $credentials -Vault "MySecretVault" $CredentialInfo = [Microsoft.PowerShell.PSResourceGet.UtilClasses.PSCredentialInfo]::new('MySecretVault', 'MyCredential')
Per verificare se l'insieme di credenziali e il segreto sono stati creati correttamente, eseguire il comando seguente per elencare tutti i segreti:
PS > Get-SecretInfo Name Type VaultName ---- ---- --------- MyCredential PSCredential MySecretVault
Eseguire il comando seguente per registrare il repository di PowerShell. Per trovare il
SourceLocation
collegamento, passare a Artifacts>Connect to Feed NuGet.exe (Connetti al feed>) nella sezione > Project setup source URL (URL origine dell'installazione del progetto).Feed con ambito progetto:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Feed con ambito organizzazione:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Suggerimento
Alcune versioni di PowerShell potrebbero richiedere l'avvio di una nuova sessione dopo l'esecuzione del
Register-PSResourceRepository
cmdlet per impedire che venga visualizzato l'avviso Impossibile risolvere l'origine del pacchetto.Per verificare se il repository è stato registrato correttamente, eseguire il comando seguente per recuperare tutti i repository registrati per l'utente corrente:
Get-PSResourceRepository
Nota
Se si verifica l'errore: Il codice di stato della risposta non indica l'esito positivo: 404 (Non trovato). Assicurarsi che l'URL di nuget/v2
origine punti a anziché a nuget/v3/index.json
.
Pubblicare un pacchetto
Eseguire il comando seguente per pubblicare il pacchetto nel feed:
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>)
Esempio:
PS C:\AzureDevOps\Demos\PowerShellDemo> Publish-PSResource -Path .\scripts\ -Repository FabrikamFiberFeed -ApiKey (Get-Secret MyNewCredential) -verbose
VERBOSE: Performing the operation "Publish-PSResource" on target "Publish resource
'C:\AzureDevOps\Demos\PowerShellDemo\scripts\' from the machine".
VERBOSE: The newly created nuspec is:
C:\Users\xxxx\AppData\Local\Temp\xxxxxxxxx\PowerShell-Demo.nuspec
VERBOSE: credential successfully read from vault and set for repository: FabrikamFiberFeed
VERBOSE: Successfully packed the resource into a .nupkg
VERBOSE: Successfully published the resource to
'https://pkgs.dev.azure.com/ramiMSFTDevOps/DemoProject/_packaging/FabrikamFiberFeed/nuget/v3/index.json'
VERBOSE: Deleting temporary directory 'C:\Users\xxxx\AppData\Local\Temp\xxxxxxx'
Installare un pacchetto
Per verificare se il modulo è disponibile nel repository, usare il comando seguente per cercarlo:
Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
Eseguire il comando seguente per installare la versione stabile più recente del modulo:
Install-PSResource <MODULE_NAME>
Suggerimento
Se si verifica l'errore: Eccezione che chiama "WriteObject"., avviare una nuova finestra di PowerShell ed eseguire Get-SecretInfo
. Immettere la password dell'insieme di credenziali prima di eseguire Find-PSResource e Install-PSResource, perché il periodo di timeout SecretStore può scadere. Il valore predefinito passwordTimeout è 900 secondi, ma è possibile modificare questo valore in base alle esigenze. Per altri dettagli, vedere Usare SecretStore in automazione .
In questo articolo si apprenderà come:
- Creare un token di accesso personale
- Creare, creare un pacchetto e pubblicare un modulo di PowerShell
- Connettersi a un feed come repository di PowerShell
- Registrare e installare un modulo di PowerShell con Azure Pipelines
Prerequisiti
Creare un'organizzazione Azure DevOps e un progetto, se non è già stato fatto.
Crea un nuovo feed se non ne hai già uno.
Installare il provider di credenziali di Azure Artifacts.
Installare NuGet.
Creare un token di accesso personale
Un token di accesso personale funge da identità digitale e funge da password alternativa per autenticare l'utente con Azure DevOps.
Passare all'organizzazione di Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Selezionare l'icona delle impostazioni utente, selezionare Token di accesso personali e quindi nuovo token.
Immettere un nome per il pat, impostare una data di scadenza, selezionare Personalizzato definito e quindi selezionare Creazione di pacchetti>di lettura, scrittura e gestione.
Al termine, selezionare Crea e assicurarsi di copiare e archiviare il pat in una posizione sicura.
Creare un modulo di PowerShell
Se non si ha un modulo personalizzato, seguire le istruzioni riportate in questa sezione per creare un modulo di PowerShell di esempio. In caso contrario, passare al passaggio successivo:
Creare una nuova cartella Get-Hello. Passare alla cartella e creare un nuovo file Get-Hello.psm1.
Incollare lo script seguente nel file Get-Hello.psm1 :
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
Generare il manifesto del modulo eseguendo il comando seguente nella directory Get-Hello :
New-ModuleManifest -Path .\Get-Hello.psd1
Aprire il file Get-Hello.psd1 e individuare la
RootModule
variabile. Questa impostazione specifica il file di script principale caricato da PowerShell quando viene importato il modulo. Sostituire la stringa vuota con il percorso del file Get-Hello.psm1 :RootModule = 'Get-Hello.psm1'
La
FunctionsToExport
sezione specifica quali funzioni sono accessibili agli utenti quando importano il modulo. Includere la funzione Get-Hello :FunctionsToExport = @('Get-Hello')
Trovare la
FileList
sezione , che specifica i file inclusi durante la creazione del pacchetto del modulo. Aggiungere il file che si vuole creare con il modulo:FileList = @('./Get-Hello.psm1')
Creare un pacchetto e pubblicare un modulo
Generare un file nuspec per il modulo. Questo comando crea un file Get-Hello.nuspec contenente i metadati necessari per la compressione del modulo:
nuget spec Get-Hello
Eseguire il comando seguente per creare un pacchetto del modulo:
nuget pack Get-Hello.nuspec
Eseguire il comando seguente per aggiungere l'URL dell'origine del feed. Assicurarsi di usare V2 nell'URL dell'origine del feed, perché NuGet V3 non è supportato.
Feed con ambito organizzazione:
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 con ambito progetto:
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>"
Pubblicare il pacchetto nel feed:
nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
Importante
Il numero di versione nel manifesto del modulo (con estensione psd1) deve essere identico al numero di versione nel file con estensione nuspec .
Connettersi a un feed come repository di PowerShell
Questa sezione illustra come eseguire l'autenticazione con un feed come repository di PowerShell e usare un modulo ospitato nel feed:
In una finestra del prompt di PowerShell eseguire il comando seguente per configurare le credenziali. Sostituire i segnaposto con le informazioni appropriate.
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
Registrare il repository di PowerShell. Per trovare il
SourceLocation
collegamento, passare a Artifacts>Connect to Feed NuGet.exe (Connetti al feed>) nella sezione > Project setup source URL (URL origine dell'installazione del progetto).Feed con ambito progetto:
Register-PSRepository -Name <REPOSITORY_NAME> -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 con ambito organizzazione:
Register-PSRepository -Name <REPOSITORY_NAME> -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
Suggerimento
Alcune versioni di PowerShell potrebbero richiedere l'avvio di una nuova sessione dopo l'esecuzione del
Register-PSRepository
cmdlet per impedire che venga visualizzato l'avviso Impossibile risolvere l'origine del pacchetto.Registrare l'origine del pacchetto:
Feed con ambito progetto:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Feed con ambito organizzazione:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Nota
- Register-PSRepository: usato per registrare un repository di PowerShell per trovare e installare i moduli.
- Register-PackageSource: usato per registrare un'origine del pacchetto per trovare e pubblicare pacchetti.
Per verificare se il repository è stato registrato correttamente, eseguire il comando seguente per recuperare tutti i repository registrati per l'utente corrente:
Get-PSRepository
Eseguire il comando seguente per installare il modulo Get-Hello .
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
Nota
Se l'organizzazione usa un firewall o un server proxy, assicurarsi di consentire l'accesso agli URL di dominio e agli indirizzi IP di Azure Artifacts.
Installare un pacchetto dalla pipeline
Questo esempio illustra come eseguire l'autenticazione con un feed di Azure Artifacts e installare un modulo di PowerShell dalla pipeline. Per usare il token di accesso personale, aggiungerlo come variabile della pipeline, come illustrato di seguito:
Accedere all'organizzazione di Azure DevOps e passare al progetto.
Selezionare Pipeline, selezionare la definizione della pipeline e quindi selezionare Modifica per modificare la pipeline.
Selezionare Variabili nell'angolo in alto a destra e quindi selezionare Nuova variabile.
Immettere un nome per la variabile e quindi incollare il token di accesso personale nella casella di testo Valore .
Assicurarsi di selezionare la casella di controllo Mantieni il segreto del valore. Al termine, selezionare OK .
Aggiungere una seconda variabile per userName. Immettere un nome per la variabile, quindi immettere userName nella casella di testo Valore .
Al termine, seleziona Salva.
trigger:
- main
pool:
vmImage: 'Windows-latest'
variables:
PackageFeedEndpoint: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2' ## For organization scoped feeds use'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2'
steps:
- powershell: |
$pat = ConvertTo-SecureString ${env:pat_token} -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("${env:userName}", $pat)
Register-PSRepository -Name <REPOSITORY_NAME> -SourceLocation "$(PackageFeedEndpoint)" -InstallationPolicy Trusted -Credential $credential
displayName: 'Register PSRepository'
env:
pat_token: $patToken
userName: $userName
- powershell: |
nuget install <PACKAGE_NAME> -Source "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json"
displayName: 'Install module'