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éez un coffre SecretStore et enregistrez un dépôt
  • 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. Saisissez un nom pour votre PAT, définissez une date d'expiration, sélectionnez Personnalisé, puis sélectionnez Emballage>Lire, écrire &gérer.

  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 que l'espace de stockage et le secret ont été créés avec succès, exécutez la commande suivante pour dresser la liste de 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 pouvez trouver le SourceLocation lien en accédant à Artifacts>Connect to Feed>NuGet.exe, dans la section Configuration du projet sous l'URL source.

    • Aliments pour animaux à l'échelle d'un 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 l'apparition de l'avertissement Impossible de résoudre la source du package.

  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. Remplacez les espaces réservés par le chemin d’accès de votre package, le nom du dépôt, l’objet d’informations d’identification que vous avez créé précédemment, puis saisissez n’importe quelle chaîne pour l’ApiKey.

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

Exemple :

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'

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 le délai d'expiration de 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. Saisissez un nom pour votre PAT, définissez une date d'expiration, sélectionnez Personnalisé, puis sélectionnez Emballage>Lire, écrire &gérer.

  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. Assurez-vous d'utiliser 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>"
      
    • Aliments pour animaux à l'échelle d'un 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>"
    

Importante

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 pouvez trouver le SourceLocation lien en accédant à Artifacts>Connect to Feed>NuGet.exe, dans la section Configuration du projet sous l'URL source.

    • Aliments pour animaux à l'échelle d'un 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 l'apparition de l'avertissement Impossible de résoudre la source du package.

  3. Inscrivez votre source de package :

    • Aliments pour animaux à l'échelle d'un 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.

Installez 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. Assurez-vous de sélectionner la case à cocher Garder cette valeur secrète. 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'