Verwenden eines Azure Artifacts-Feeds als privates PowerShell-Repository
Azure DevOps Services
Azure Artifacts bietet eine bequeme Lösung zum Freigeben von PowerShell-Skripts. Mithilfe von Azure Artifacts-Feeds können Sie Ihre PowerShell-Module nahtlos über die Befehlszeile veröffentlichen und den Zugriff auf diese über Ihre Feedeinstellungen steuern. Dieser Artikel führt Sie durch das Einrichten Ihres Azure Artifacts-Feeds als privates PowerShell-Repository zum Speichern und Freigeben Ihrer PowerShell-Module.
In diesem Artikel lernen Sie Folgendes:
- Erstellen eines persönlichen Zugriffstokens
- Erstellen eines PowerShell-Moduls
- Erstellen eines SecretStore-Tresors und Registrieren eines Repositorys
- Veröffentlichen und Nutzen von Paketen aus einem Feed
Voraussetzungen
Erstellen Sie eine Azure DevOps-Organisation und ein Projekt, falls noch nicht geschehen.
Erstellen Sie einen neuen Feed, wenn Sie noch keinen haben.
Installieren Sie PSResourceGet.
Installieren Sie die Module "SecretManagement" und "SecretStore ".
Hinweis
Der Azure Artifacts-Anmeldeinformationsanbieter wird mit PSResourceGet nicht unterstützt.
Erstellen eines persönlichen Zugriffstokens
Ein persönliches Zugriffstoken fungiert als Ihre digitale Identität und dient als alternatives Kennwort zur Authentifizierung bei Azure DevOps.
Navigieren Sie zu Ihrer Azure DevOps-Organisation
https://dev.azure.com/<ORGANIZATION_NAME>/
Wählen Sie das Symbol "Benutzereinstellungen" aus, wählen Sie "Persönliche Zugriffstoken" und dann "Neues Token" aus.
Geben Sie einen Namen für Ihren PAT ein, legen Sie ein Ablaufdatum fest, wählen Sie "Benutzerdefiniert" aus, und wählen Sie dann "Verpacken>lesen", "Schreiben" und "Verwalten" aus.
Wählen Sie " Erstellen " aus, wenn Sie fertig sind, und stellen Sie sicher, dass Sie Ihren PAT an einem sicheren Ort kopieren und speichern.
Erstellen eines PowerShell-Moduls
Wenn Sie nicht über Ihr eigenes Modul verfügen, befolgen Sie die Anweisungen in diesem Abschnitt, um ein PowerShell-Beispielmodul zu erstellen. Fahren Sie andernfalls mit dem nächsten Schritt fort:
Erstellen Sie einen neuen Ordner powerShell-Demo. Navigieren Sie zu Ihrem Ordner, und erstellen Sie eine neue Datei PowerShell-Demo.psm1.
Fügen Sie das folgende Skript in die Datei "PowerShell-Demo.psm1 " ein:
Function PowerShell-Demo{ Write-Host "Hello World!" }
Generieren Sie das Modulmanifest, indem Sie den folgenden Befehl in Ihrem PowerShell-Demo-Verzeichnis ausführen:
New-ModuleManifest -Path .\PowerShell-Demo.psd1
Öffnen Sie Ihre PowerShell-Demo.psd1-Datei , und suchen Sie die
RootModule
Variable. Diese Einstellung gibt die Hauptskriptdatei an, die PowerShell lädt, wenn das Modul importiert wird. Ersetzen Sie die leere Zeichenfolge durch den Pfad zu Ihrer PowerShell-Demo.psm1-Datei :RootModule = 'PowerShell-Demo.psm1'
Der
FunctionsToExport
Abschnitt gibt an, auf welche Funktionen Benutzer zugreifen können, wenn sie Ihr Modul importieren. Schließen Sie Ihre PowerShell-Demo-Funktion ein:FunctionsToExport = @('PowerShell-Demo')
Suchen Sie den
FileList
Abschnitt, in dem die Dateien aufgelistet werden, die beim Verpacken des Moduls enthalten sind. Fügen Sie die Datei hinzu, die Sie mit Ihrem Modul verpacken möchten:FileList = @('./PowerShell-Demo.psm1')
Registrieren eines Repositorys
Führen Sie den folgenden Befehl aus, um ein Anmeldeinformationsobjekt zu erstellen. Ersetzen Sie die Platzhalter durch die richtigen Informationen.
$username = "<USER_NAME>" $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
Stellen Sie sicher, dass SecretManagement und SecretStore installiert sind, und führen Sie dann den folgenden Befehl aus, um einen Tresor zu erstellen und einen geheimen Schlüssel hinzuzufügen:
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')
Um zu überprüfen, ob der Tresor und der geheime Schlüssel erfolgreich erstellt wurden, führen Sie den folgenden Befehl aus, um alle geheimen Schlüssel auflisten zu können:
PS > Get-SecretInfo Name Type VaultName ---- ---- --------- MyCredential PSCredential MySecretVault
Führen Sie den folgenden Befehl aus, um Ihr PowerShell-Repository zu registrieren. Sie finden den
SourceLocation
Link, indem Sie zu Artifacts>Connect to Feed>NuGet.exe navigieren, unter der Quell-URL des Project-Setupabschnitts. >Projektbezogener Feed:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Organisationsbezogener Feed:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
Tipp
Einige Versionen von PowerShell erfordern möglicherweise das Starten einer neuen Sitzung nach dem Ausführen des
Register-PSResourceRepository
Cmdlets, um zu verhindern, dass die Paketquellwarnung nicht aufgelöst werden kann.Um zu überprüfen, ob das Repository erfolgreich registriert wurde, führen Sie den folgenden Befehl aus, um alle registrierten Repositorys für den aktuellen Benutzer abzurufen:
Get-PSResourceRepository
Hinweis
Wenn der Fehler auftritt: Der Antwortstatuscode weist nicht auf Erfolg hin: 404 (Nicht gefunden)., stellen Sie sicher, dass die Quell-URL nuget/v3/index.json
anstelle von nuget/v2
.
Veröffentlichen eines Pakets
Führen Sie den folgenden Befehl aus, um das Paket in Ihrem Feed zu veröffentlichen:
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>)
Beispiel:
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'
Installieren eines Pakets
Um zu bestätigen, ob das Modul in Ihrem Repository verfügbar ist, verwenden Sie den folgenden Befehl, um danach zu suchen:
Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
Führen Sie den folgenden Befehl aus, um die neueste stabile Version Ihres Moduls zu installieren:
Install-PSResource <MODULE_NAME>
Tipp
Wenn der Fehler auftritt: Ausnahmeaufruf "WriteObject"., starten Sie ein neues PowerShell-Fenster, und führen Sie es aus Get-SecretInfo
. Geben Sie Ihr Tresorkennwort ein, bevor Sie "Find-PSResource" und "Install-PSResource" ausführen, da der Timeoutzeitraum "SecretStore" ablaufen kann. Der Standardwert "PasswordTimeout " beträgt 900 Sekunden, Sie können diesen Wert jedoch bei Bedarf ändern. Weitere Details finden Sie unter Verwenden des SecretStore in der Automatisierung .
In diesem Artikel lernen Sie Folgendes:
- Erstellen eines persönlichen Zugriffstokens
- Erstellen, Packen und Veröffentlichen eines PowerShell-Moduls
- Herstellen einer Verbindung mit einem Feed als PowerShell-Repository
- Registrieren und Installieren eines PowerShell-Moduls mithilfe von Azure Pipelines
Voraussetzungen
Erstellen Sie eine Azure DevOps-Organisation und ein Projekt, falls noch nicht geschehen.
Erstellen Sie einen neuen Feed, wenn Sie noch keinen haben.
Installieren Sie den Azure Artifacts-Anmeldeinformationsanbieter.
Installieren Sie NuGet.
Erstellen eines persönlichen Zugriffstokens
Ein persönliches Zugriffstoken fungiert als Ihre digitale Identität und dient als alternatives Kennwort zur Authentifizierung bei Azure DevOps.
Navigieren Sie zu Ihrer Azure DevOps-Organisation
https://dev.azure.com/<ORGANIZATION_NAME>/
Wählen Sie das Symbol "Benutzereinstellungen" aus, wählen Sie "Persönliche Zugriffstoken" und dann "Neues Token" aus.
Geben Sie einen Namen für Ihren PAT ein, legen Sie ein Ablaufdatum fest, wählen Sie "Benutzerdefiniert" aus, und wählen Sie dann "Verpacken>lesen", "Schreiben" und "Verwalten" aus.
Wählen Sie " Erstellen " aus, wenn Sie fertig sind, und stellen Sie sicher, dass Sie Ihren PAT an einem sicheren Ort kopieren und speichern.
Erstellen eines PowerShell-Moduls
Wenn Sie nicht über Ihr eigenes Modul verfügen, befolgen Sie die Anweisungen in diesem Abschnitt, um ein PowerShell-Beispielmodul zu erstellen. Fahren Sie andernfalls mit dem nächsten Schritt fort:
Erstellen Sie einen neuen Ordner "Get-Hello". Navigieren Sie zu Ihrem Ordner, und erstellen Sie eine neue Datei "Get-Hello.psm1".
Fügen Sie das folgende Skript in die Datei "Get-Hello.psm1 " ein:
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
Generieren Sie das Modulmanifest, indem Sie den folgenden Befehl in Ihrem Get-Hello-Verzeichnis ausführen:
New-ModuleManifest -Path .\Get-Hello.psd1
Öffnen Sie die Datei "Get-Hello.psd1 ", und suchen Sie die
RootModule
Variable. Diese Einstellung gibt die Hauptskriptdatei an, die PowerShell lädt, wenn das Modul importiert wird. Ersetzen Sie die leere Zeichenfolge durch den Pfad zur Datei "Get-Hello.psm1 ":RootModule = 'Get-Hello.psm1'
Der
FunctionsToExport
Abschnitt gibt an, auf welche Funktionen Benutzer zugreifen können, wenn sie Ihr Modul importieren. Fügen Sie Ihre Get-Hello-Funktion ein:FunctionsToExport = @('Get-Hello')
Suchen Sie den
FileList
Abschnitt, der die Beim Verpacken des Moduls enthaltenen Dateien angibt. Fügen Sie die Datei hinzu, die Sie mit Ihrem Modul verpacken möchten:FileList = @('./Get-Hello.psm1')
Packen und Veröffentlichen eines Moduls
Generieren Sie eine Nuspec-Datei für Ihr Modul. Mit diesem Befehl wird eine Get-Hello.nuspec-Datei erstellt, die die erforderlichen Metadaten zum Packen des Moduls enthält:
nuget spec Get-Hello
Führen Sie den folgenden Befehl aus, um Ihr Modul zu verpacken:
nuget pack Get-Hello.nuspec
Führen Sie den folgenden Befehl aus, um Die Feedquell-URL hinzuzufügen. Stellen Sie sicher, dass Sie V2 in Ihrer Feedquell-URL verwenden, da NuGet V3 nicht unterstützt wird.
Organisationsbezogener Feed:
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>"
Projektbezogener Feed:
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>"
Veröffentlichen Sie das Paket in Ihrem Feed:
nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
Wichtig
Die Versionsnummer im Modulmanifest (PSD1) muss mit der Versionsnummer in Ihrer NUSPEC-Datei identisch sein.
Herstellen einer Verbindung mit einem Feed als PowerShell-Repository
Dieser Abschnitt führt Sie durch die Authentifizierung mit einem Feed als PowerShell-Repository und das Verwenden eines moduls, das in Ihrem Feed gehostet wird:
Führen Sie in einem PowerShell-Eingabeaufforderungsfenster den folgenden Befehl aus, um Ihre Anmeldeinformationen einzurichten. Ersetzen Sie die Platzhalter durch die entsprechenden Informationen.
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
Registrieren Sie Ihr PowerShell-Repository. Sie finden den
SourceLocation
Link, indem Sie zu Artifacts>Connect to Feed>NuGet.exe navigieren, unter der Quell-URL des Project-Setupabschnitts. >Projektbezogener Feed:
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
Organisationsbezogener Feed:
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
Tipp
Einige Versionen von PowerShell erfordern möglicherweise das Starten einer neuen Sitzung nach dem Ausführen des
Register-PSRepository
Cmdlets, um zu verhindern, dass die Paketquellwarnung nicht aufgelöst werden kann.Registrieren Sie Ihre Paketquelle:
Projektbezogener Feed:
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
Organisationsbezogener Feed:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Hinweis
- Register-PSRepository: Wird zum Registrieren eines PowerShell-Repositorys verwendet, um Module zu suchen und zu installieren.
- Register-PackageSource: Dient zum Registrieren einer Paketquelle zum Suchen und Veröffentlichen von Paketen.
Um zu überprüfen, ob das Repository erfolgreich registriert wurde, führen Sie den folgenden Befehl aus, um alle registrierten Repositorys für den aktuellen Benutzer abzurufen:
Get-PSRepository
Führen Sie den folgenden Befehl aus, um das Get-Hello-Modul zu installieren.
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
Hinweis
Wenn Ihre Organisation eine Firewall oder einen Proxyserver verwendet, stellen Sie sicher, dass Sie den Zugriff auf UrLs und IP-Adressen der Azure Artifacts-Domäne zulassen.
Installieren eines Pakets aus Ihrer Pipeline
In diesem Beispiel werden Sie durch die Authentifizierung mit einem Azure Artifacts-Feed und installieren ein PowerShell-Modul aus Ihrer Pipeline. Um Ihr persönliches Zugriffstoken zu verwenden, fügen Sie es wie unten dargestellt als Pipelinevariable hinzu:
Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und navigieren Sie dann zu Ihrem Projekt.
Wählen Sie "Pipelines", wählen Sie Ihre Pipelinedefinition und dann "Bearbeiten" aus, um Ihre Pipeline zu ändern.
Wählen Sie "Variablen" in der oberen rechten Ecke und dann "Neue Variable" aus.
Geben Sie einen Namen für Ihre Variable ein, und fügen Sie dann Ihr persönliches Zugriffstoken in das Textfeld "Wert " ein.
Stellen Sie sicher, dass Sie das Kontrollkästchen "Diesen Wert geheim halten " aktivieren. Wählen Sie "OK" aus, wenn Sie fertig sind.
Fügen Sie eine zweite Variable für Ihren Benutzernamen hinzu. Geben Sie einen Namen für die Variable ein, und geben Sie dann ihren Benutzernamen in das Textfeld "Wert " ein.
Wählen Sie Speichern aus, wenn Sie fertig sind.
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'