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
Créez une Organisation Azure DevOps et un Projet si ce n’est pas déjà fait.
Créez un nouveau flux si vous n’en avez pas déjà un.
Installez PSResourceGet.
Installez les modules SecretManagement et SecretStore .
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.
Accédez à votre organisation Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Sélectionnez l’icône paramètres utilisateur, sélectionnez Jetons d’accès personnels, puis nouveau jeton.
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.
Sélectionnez Créer lorsque vous avez terminé, puis veillez à copier et stocker votre PAT dans un emplacement sûr.
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 :
Créez un dossier PowerShell-Demo. Accédez à votre dossier et créez un fichier PowerShell-Demo.psm1.
Collez le script suivant dans votre fichier PowerShell-Demo.psm1 :
Function PowerShell-Demo{ Write-Host "Hello World!" }
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
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'
La
FunctionsToExport
section spécifie les fonctions accessibles aux utilisateurs lorsqu’elles importent votre module. Incluez votre fonction PowerShell-Demo :FunctionsToExport = @('PowerShell-Demo')
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
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)
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')
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
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.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'
Installer un package
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
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éez une Organisation Azure DevOps et un Projet si ce n’est pas déjà fait.
Créez un nouveau flux si vous n’en avez pas déjà un.
Installez le fournisseur d’informations d’identification Azure Artifacts.
Installez NuGet.
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.
Accédez à votre organisation Azure DevOps
https://dev.azure.com/<ORGANIZATION_NAME>/
Sélectionnez l’icône paramètres utilisateur, sélectionnez Jetons d’accès personnels, puis nouveau jeton.
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.
Sélectionnez Créer lorsque vous avez terminé, puis veillez à copier et stocker votre PAT dans un emplacement sûr.
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 :
Créez un dossier Get-Hello. Accédez à votre dossier et créez un fichier Get-Hello.psm1.
Collez le script suivant dans votre fichier Get-Hello.psm1 :
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
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
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'
La
FunctionsToExport
section spécifie les fonctions accessibles aux utilisateurs lorsqu’elles importent votre module. Incluez votre fonction Get-Hello :FunctionsToExport = @('Get-Hello')
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
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
Exécutez la commande suivante pour empaqueter votre module :
nuget pack Get-Hello.nuspec
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>"
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 :
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)
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.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.
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
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 :
Connectez-vous à votre organisation Azure DevOps puis accédez à votre projet.
Sélectionnez Pipelines, sélectionnez votre définition de pipeline, puis sélectionnez Modifier pour modifier votre pipeline.
Sélectionnez Variables en haut à droite, puis sélectionnez Nouvelle variable.
Entrez un nom pour votre variable, puis collez votre jeton d’accès personnel dans la zone de texte Valeur .
Vérifiez que vous activez la case à cocher Conserver ce secret de valeur. Sélectionnez Ok lorsque vous avez terminé.
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 .
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'