Partager via


Utiliser un flux Azure Artifacts en tant que référentiel PowerShell privé

Azure DevOps Services

Azure Artifacts fournit une solution pratique pour partager des scripts PowerShell. En utilisant des flux Azure Artifacts, vous pouvez publier en toute transparence vos modules PowerShell à partir de la ligne de commande et contrôler l’accès à ces modules via vos paramètres de flux. Cet article vous guide tout au long de la configuration de votre flux Azure Artifacts en tant que référentiel PowerShell privé pour stocker et partager vos modules PowerShell.

Dans cet article, vous allez apprendre à :

  • Créer un jeton d’accès personnel
  • Créer un module PowerShell
  • Créer un coffre SecretStore et inscrire un référentiel
  • Publier et consommer des packages à partir d’un flux

Prérequis

Remarque

Le fournisseur d’informations d’identification Azure Artifacts n’est pas pris en charge avec PSResourceGet.

Créer un jeton d’accès personnel

Un jeton d’accès personnel agit comme votre identité numérique et sert de mot de passe alternatif pour vous authentifier auprès d’Azure DevOps.

  1. Accédez à votre organisation Azure DevOps https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Sélectionnez l’icône paramètres utilisateur, sélectionnez Jetons d’accès personnels, puis nouveau jeton.

  3. Entrez un nom pour votre PAT, définissez une date d’expiration, sélectionnez Personnalisé défini, puis sélectionnez Empaquetage>en lecture, écriture et gestion.

  4. Sélectionnez Créer lorsque vous avez terminé, puis veillez à copier et stocker votre PAT dans un emplacement sûr.

    Capture d’écran montrant comment configurer un nouveau jeton d’accès personnel.

Créer un module PowerShell

Si vous n’avez pas votre propre module, suivez les instructions de cette section pour créer un exemple de module PowerShell. Sinon, passez à l’étape suivante :

  1. Créez un dossier PowerShell-Demo. Accédez à votre dossier et créez un fichier PowerShell-Demo.psm1.

  2. Collez le script suivant dans votre fichier PowerShell-Demo.psm1 :

    Function PowerShell-Demo{
        Write-Host "Hello World!"
    }
    
  3. Générez le manifeste du module en exécutant la commande suivante dans votre répertoire PowerShell-Demo :

    New-ModuleManifest -Path .\PowerShell-Demo.psd1
    
  4. Ouvrez votre fichier PowerShell-Demo.psd1 et recherchez la RootModule variable. Ce paramètre spécifie le fichier de script principal que PowerShell charge lorsque le module est importé. Remplacez la chaîne vide par le chemin d’accès à votre fichier PowerShell-Demo.psm1 :

    RootModule = 'PowerShell-Demo.psm1'
    
  5. La FunctionsToExport section spécifie les fonctions accessibles aux utilisateurs lorsqu’elles importent votre module. Incluez votre fonction PowerShell-Demo :

    FunctionsToExport = @('PowerShell-Demo')
    
  6. Recherchez la FileList section, qui répertorie les fichiers inclus lors de l’empaquetage du module. Ajoutez le fichier que vous souhaitez empaqueter avec votre module :

    FileList = @('./PowerShell-Demo.psm1')
    

Inscrire un référentiel

  1. Exécutez la commande suivante pour créer un objet d’informations d’identification. Remplacez les espaces réservés par les informations appropriées.

    $username = "<USER_NAME>"
    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
    
  2. Vérifiez que SecretManagement et SecretStore sont installés, puis exécutez la commande suivante pour créer un coffre et ajouter un secret :

    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. Pour vérifier si le coffre et le secret ont été correctement créés, exécutez la commande suivante pour répertorier tous vos secrets :

    PS > Get-SecretInfo
    
    Name            Type         VaultName
    ----            ----         ---------
    MyCredential    PSCredential MySecretVault
    
    
  4. Exécutez la commande suivante pour inscrire votre référentiel PowerShell. Vous trouverez le SourceLocation lien en accédant à Artifacts>Connect to Feed>NuGet.exe, sous l’URL source de la section > Configuration du projet.

    • Flux à l'échelle du projet :

      Register-PSResourceRepository -Name "PowershellPSResourceRepository" `
          -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" `
          -Trusted `
          -CredentialInfo $CredentialInfo
      
    • Flux à l'échelle de l'organisation :

      Register-PSResourceRepository -Name "PowershellPSResourceRepository" `
          -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" `
          -Trusted `
          -CredentialInfo $CredentialInfo
      

    Conseil

    Certaines versions de PowerShell peuvent nécessiter le démarrage d’une nouvelle session après l’exécution de l’applet Register-PSResourceRepository de commande pour empêcher la rencontre de l’avertissement de source du package impossible.

  5. Pour vérifier si le référentiel a été correctement inscrit, exécutez la commande suivante pour récupérer tous les référentiels inscrits pour l’utilisateur actuel :

    Get-PSResourceRepository
    

Remarque

Si vous rencontrez l’erreur : le code d’état de la réponse n’indique pas la réussite : 404 (Introuvable). Assurez-vous que votre URL source pointe vers nuget/v3/index.json au lieu de nuget/v2.

Publier un package

Exécutez la commande suivante pour publier le package dans votre flux :

Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>) 

Exemple :

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'

Capture d’écran montrant le package de démonstration PowerShell publié dans le flux.

Installer un package

  1. Pour vérifier si le module est disponible dans votre référentiel, utilisez la commande suivante pour la rechercher :

    Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
    
  2. Exécutez la commande suivante pour installer la dernière version stable de votre module :

    Install-PSResource <MODULE_NAME>
    

Conseil

Si vous rencontrez l’erreur : Exception appelant « WriteObject ». Démarrez une nouvelle fenêtre PowerShell et exécutez Get-SecretInfo. Entrez votre mot de passe de coffre avant d’exécuter Find-PSResource et Install-PSResource, car la période d’expiration secretStore peut expirer. PasswordTimeout par défaut est de 900 secondes, mais vous pouvez modifier cette valeur si nécessaire. Pour plus d’informations, consultez Utiliser SecretStore dans l’automatisation .

Dans cet article, vous allez apprendre à :

  • Créer un jeton d’accès personnel
  • Créer, empaqueter et publier un module PowerShell
  • Se connecter à un flux en tant que référentiel PowerShell
  • Inscrire et installer un module PowerShell à l’aide d’Azure Pipelines

Prérequis

Créer un jeton d’accès personnel

Un jeton d’accès personnel agit comme votre identité numérique et sert de mot de passe alternatif pour vous authentifier auprès d’Azure DevOps.

  1. Accédez à votre organisation Azure DevOps https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Sélectionnez l’icône paramètres utilisateur, sélectionnez Jetons d’accès personnels, puis nouveau jeton.

  3. Entrez un nom pour votre PAT, définissez une date d’expiration, sélectionnez Personnalisé défini, puis sélectionnez Empaquetage>en lecture, écriture et gestion.

  4. Sélectionnez Créer lorsque vous avez terminé, puis veillez à copier et stocker votre PAT dans un emplacement sûr.

    Capture d’écran montrant comment configurer un nouveau jeton d’accès personnel.

Créer un module PowerShell

Si vous n’avez pas votre propre module, suivez les instructions de cette section pour créer un exemple de module PowerShell. Sinon, passez à l’étape suivante :

  1. Créez un dossier Get-Hello. Accédez à votre dossier et créez un fichier Get-Hello.psm1.

  2. Collez le script suivant dans votre fichier Get-Hello.psm1 :

    Function Get-Hello{
        Write-Host "Hello Azure DevOps!"
    }
    
  3. Générez le manifeste du module en exécutant la commande suivante dans votre répertoire Get-Hello :

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Ouvrez votre fichier Get-Hello.psd1 et recherchez la RootModule variable. Ce paramètre spécifie le fichier de script principal que PowerShell charge lorsque le module est importé. Remplacez la chaîne vide par le chemin d’accès à votre fichier Get-Hello.psm1 :

    RootModule = 'Get-Hello.psm1'
    
  5. La FunctionsToExport section spécifie les fonctions accessibles aux utilisateurs lorsqu’elles importent votre module. Incluez votre fonction Get-Hello :

    FunctionsToExport = @('Get-Hello')
    
  6. Recherchez la FileList section, qui spécifie les fichiers inclus lors de l’empaquetage du module. Ajoutez le fichier que vous souhaitez empaqueter avec votre module :

    FileList = @('./Get-Hello.psm1')
    

Empaqueter et publier un module

  1. Générez un fichier nuspec pour votre module. Cette commande crée un fichier Get-Hello.nuspec contenant les métadonnées nécessaires pour empaquetage du module :

    nuget spec Get-Hello
    
  2. Exécutez la commande suivante pour empaqueter votre module :

    nuget pack Get-Hello.nuspec
    
  3. Exécutez la commande suivante pour ajouter l’URL de votre source de flux. Vérifiez que vous utilisez V2 dans votre URL source de flux, car NuGet V3 n’est pas pris en charge.

    • Flux à l'échelle de l'organisation :

      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>"
      
    • Flux à l'échelle du projet :

      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. Publiez le package dans votre flux :

    nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
    

Important

Le numéro de version de votre manifeste de module (.psd1) doit être identique au numéro de version dans votre fichier .nuspec .

Se connecter à un flux en tant que référentiel PowerShell

Cette section vous guide tout au long de l’authentification avec un flux en tant que référentiel PowerShell et en consommant un module hébergé dans votre flux :

  1. Dans une fenêtre d’invite PowerShell, exécutez la commande suivante pour configurer vos informations d’identification. Remplacez les espaces réservés par les informations appropriées.

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  2. Inscrivez votre référentiel PowerShell. Vous trouverez le SourceLocation lien en accédant à Artifacts>Connect to Feed>NuGet.exe, sous l’URL source de la section > Configuration du projet.

    • Flux à l'échelle du projet :

      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
      
    • Flux à l'échelle de l'organisation :

      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
      

    Conseil

    Certaines versions de PowerShell peuvent nécessiter le démarrage d’une nouvelle session après l’exécution de l’applet Register-PSRepository de commande pour empêcher la rencontre de l’avertissement de source du package impossible.

  3. Inscrivez votre source de package :

    • Flux à l'échelle du projet :

      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
      
    • Flux à l'échelle de l'organisation :

      Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices 
      

    Remarque

    • Register-PSRepository : utilisé pour inscrire un référentiel PowerShell pour rechercher et installer des modules.
    • Register-PackageSource : utilisé pour inscrire une source de package pour rechercher et publier des packages.
  4. Pour vérifier si le référentiel a été correctement inscrit, exécutez la commande suivante pour récupérer tous les référentiels inscrits pour l’utilisateur actuel :

    Get-PSRepository
    
  5. Exécutez la commande suivante pour installer le module Get-Hello .

    Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
    

Remarque

Si votre organisation utilise un pare-feu ou un serveur proxy, veillez à autoriser l’accès aux URL et adresses IP du domaine Azure Artifacts.

Installer un package à partir de votre pipeline

Cet exemple vous guide tout au long de l’authentification avec un flux Azure Artifacts et l’installation d’un module PowerShell à partir de votre pipeline. Pour utiliser votre jeton d’accès personnel, ajoutez-le en tant que variable de pipeline, comme indiqué ci-dessous :

  1. Connectez-vous à votre organisation Azure DevOps puis accédez à votre projet.

  2. Sélectionnez Pipelines, sélectionnez votre définition de pipeline, puis sélectionnez Modifier pour modifier votre pipeline.

  3. Sélectionnez Variables en haut à droite, puis sélectionnez Nouvelle variable.

  4. Entrez un nom pour votre variable, puis collez votre jeton d’accès personnel dans la zone de texte Valeur .

  5. Vérifiez que vous activez la case à cocher Conserver ce secret de valeur. Sélectionnez Ok lorsque vous avez terminé.

  6. Ajoutez une deuxième variable pour votre userName. Entrez un nom pour votre variable, puis entrez votre nom d’utilisateur dans la zone de texte Valeur .

  7. Lorsque vous avez terminé, sélectionnez Enregistrer.

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'