Condividi tramite


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

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.

  1. Passare all'organizzazione di Azure DevOps https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Selezionare l'icona delle impostazioni utente, selezionare Token di accesso personali e quindi nuovo token.

  3. 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.

  4. Al termine, selezionare Crea e assicurarsi di copiare e archiviare il pat in una posizione sicura.

    Screenshot che mostra come configurare un nuovo token di accesso personale.

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:

  1. Creare una nuova cartella PowerShell-Demo. Passare alla cartella e creare un nuovo file PowerShell-Demo.psm1.

  2. Incollare lo script seguente nel file PowerShell-Demo.psm1 :

    Function PowerShell-Demo{
        Write-Host "Hello World!"
    }
    
  3. Generare il manifesto del modulo eseguendo il comando seguente nella directory PowerShell-Demo :

    New-ModuleManifest -Path .\PowerShell-Demo.psd1
    
  4. 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'
    
  5. La FunctionsToExport sezione specifica quali funzioni sono accessibili agli utenti quando importano il modulo. Includere la funzione PowerShell-Demo :

    FunctionsToExport = @('PowerShell-Demo')
    
  6. 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

  1. 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)
    
  2. 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')
    
  3. 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
    
    
  4. 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.

  5. 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/v2origine 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'

Screenshot che mostra il pacchetto demo di PowerShell pubblicato nel feed.

Installare un pacchetto

  1. Per verificare se il modulo è disponibile nel repository, usare il comando seguente per cercarlo:

    Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
    
  2. 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.

  1. Passare all'organizzazione di Azure DevOps https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Selezionare l'icona delle impostazioni utente, selezionare Token di accesso personali e quindi nuovo token.

  3. 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.

  4. Al termine, selezionare Crea e assicurarsi di copiare e archiviare il pat in una posizione sicura.

    Screenshot che mostra come configurare un nuovo token di accesso personale.

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:

  1. Creare una nuova cartella Get-Hello. Passare alla cartella e creare un nuovo file Get-Hello.psm1.

  2. Incollare lo script seguente nel file Get-Hello.psm1 :

    Function Get-Hello{
        Write-Host "Hello Azure DevOps!"
    }
    
  3. Generare il manifesto del modulo eseguendo il comando seguente nella directory Get-Hello :

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. 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'
    
  5. La FunctionsToExport sezione specifica quali funzioni sono accessibili agli utenti quando importano il modulo. Includere la funzione Get-Hello :

    FunctionsToExport = @('Get-Hello')
    
  6. 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

  1. 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
    
  2. Eseguire il comando seguente per creare un pacchetto del modulo:

    nuget pack Get-Hello.nuspec
    
  3. 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>"
      
  4. 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:

  1. 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)
    
  2. 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.

  3. 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.
  4. Per verificare se il repository è stato registrato correttamente, eseguire il comando seguente per recuperare tutti i repository registrati per l'utente corrente:

    Get-PSRepository
    
  5. 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:

  1. Accedere all'organizzazione di Azure DevOps e passare al progetto.

  2. Selezionare Pipeline, selezionare la definizione della pipeline e quindi selezionare Modifica per modificare la pipeline.

  3. Selezionare Variabili nell'angolo in alto a destra e quindi selezionare Nuova variabile.

  4. Immettere un nome per la variabile e quindi incollare il token di accesso personale nella casella di testo Valore .

  5. Assicurarsi di selezionare la casella di controllo Mantieni il segreto del valore. Al termine, selezionare OK .

  6. Aggiungere una seconda variabile per userName. Immettere un nome per la variabile, quindi immettere userName nella casella di testo Valore .

  7. 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'