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 vault 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. Accedi alla tua 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 Impostazioni personalizzate e quindi selezionare Confezionamento>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 desidera includere nel 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 archivio 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 il deposito e il segreto sono stati creati correttamente, eseguire il comando seguente per elencare tutti i tuoi 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, navigare fino a Artifacts>Connect to Feed>NuGet.exe, nella sezione Impostazione del progetto> URL di origine.

    • Feed limitato al 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 limitato all'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/v3/index.jsonorigine punti a anziché a nuget/v2 .

Pubblicare un pacchetto

Eseguire il comando seguente per pubblicare il pacchetto nel feed. Sostituisci i segnaposto con il percorso del pacchetto, il nome del repository, l'oggetto credenziali creato in precedenza e fornisci una qualsiasi stringa per l'ApiKey.

Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -Credential $credentials -ApiKey <ANY_STRING>

Esempio:

PS C:\AzureDevOps\Demos\PowerShellDemo> Publish-PSResource -Path .\scripts\ -Repository FabrikamFiberFeed -Credential $credentials -ApiKey az -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 incontra l'errore: Eccezione che chiama "WriteObject"., avvia una nuova finestra di PowerShell ed esegui Get-SecretInfo. Inserire la password dell'insieme di credenziali prima di eseguire Find-PSResource e Install-PSResource, perché il periodo di timeout di 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, impacchettare e pubblicare un modulo di PowerShell
  • Collegati a un feed utilizzando un 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 Windows MSBuild usando una delle opzioni seguenti:

  • Installare la versione NuGet(.exe) 4.8.0.5385 o successiva.

  • Installa il runtime dotnet versione 8.0.x o successiva.

  • Installare PowerShell 6.0 o versione successiva per garantire di avere le versioni appropriate di PowerShellGet e PackageManagement.

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. Accedi alla tua 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 Impostazioni personalizzate e quindi selezionare Confezionamento>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 desidera includere nel 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 di 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 Module Manifest (.psd1) deve essere identico al numero di versione nel file .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, navigare fino a Artifacts>Connect to Feed>NuGet.exe, nella sezione Impostazione del progetto> URL di origine.

    • 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 organizzativo:

      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 a livello di 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 a livello organizzativo:

      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.

Installa 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. Assicurati di selezionare la casella di controllo Mantieni questo valore segreto. Al termine, selezionare OK .

  6. Aggiungere una seconda variabile per userName. Inserisci un Nome per la tua variabile, quindi immetti il tuo 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'