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

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.

  1. Navigieren Sie zu Ihrer Azure DevOps-Organisation https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Wählen Sie das Symbol "Benutzereinstellungen" aus, wählen Sie "Persönliche Zugriffstoken" und dann "Neues Token" aus.

  3. 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.

  4. Wählen Sie " Erstellen " aus, wenn Sie fertig sind, und stellen Sie sicher, dass Sie Ihren PAT an einem sicheren Ort kopieren und speichern.

    Screenshot, der zeigt, wie Sie ein neues persönliches Zugriffstoken einrichten.

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:

  1. Erstellen Sie einen neuen Ordner powerShell-Demo. Navigieren Sie zu Ihrem Ordner, und erstellen Sie eine neue Datei PowerShell-Demo.psm1.

  2. Fügen Sie das folgende Skript in die Datei "PowerShell-Demo.psm1 " ein:

    Function PowerShell-Demo{
        Write-Host "Hello World!"
    }
    
  3. Generieren Sie das Modulmanifest, indem Sie den folgenden Befehl in Ihrem PowerShell-Demo-Verzeichnis ausführen:

    New-ModuleManifest -Path .\PowerShell-Demo.psd1
    
  4. Ö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'
    
  5. 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')
    
  6. 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

  1. 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)
    
  2. 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')
    
  3. 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
    
    
  4. 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.

  5. 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'

Screenshot des powerShell-Demopakets, das im Feed veröffentlicht wurde.

Installieren eines Pakets

  1. 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
    
  2. 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 eines persönlichen Zugriffstokens

Ein persönliches Zugriffstoken fungiert als Ihre digitale Identität und dient als alternatives Kennwort zur Authentifizierung bei Azure DevOps.

  1. Navigieren Sie zu Ihrer Azure DevOps-Organisation https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Wählen Sie das Symbol "Benutzereinstellungen" aus, wählen Sie "Persönliche Zugriffstoken" und dann "Neues Token" aus.

  3. 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.

  4. Wählen Sie " Erstellen " aus, wenn Sie fertig sind, und stellen Sie sicher, dass Sie Ihren PAT an einem sicheren Ort kopieren und speichern.

    Screenshot, der zeigt, wie Sie ein neues persönliches Zugriffstoken einrichten.

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:

  1. Erstellen Sie einen neuen Ordner "Get-Hello". Navigieren Sie zu Ihrem Ordner, und erstellen Sie eine neue Datei "Get-Hello.psm1".

  2. Fügen Sie das folgende Skript in die Datei "Get-Hello.psm1 " ein:

    Function Get-Hello{
        Write-Host "Hello Azure DevOps!"
    }
    
  3. Generieren Sie das Modulmanifest, indem Sie den folgenden Befehl in Ihrem Get-Hello-Verzeichnis ausführen:

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Ö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'
    
  5. 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')
    
  6. 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

  1. 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
    
  2. Führen Sie den folgenden Befehl aus, um Ihr Modul zu verpacken:

    nuget pack Get-Hello.nuspec
    
  3. 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>"
      
  4. 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:

  1. 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)
    
  2. 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.

  3. 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.
  4. 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
    
  5. 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:

  1. Melden Sie sich bei Ihrer Azure DevOps-Organisation an, und navigieren Sie dann zu Ihrem Projekt.

  2. Wählen Sie "Pipelines", wählen Sie Ihre Pipelinedefinition und dann "Bearbeiten" aus, um Ihre Pipeline zu ändern.

  3. Wählen Sie "Variablen" in der oberen rechten Ecke und dann "Neue Variable" aus.

  4. Geben Sie einen Namen für Ihre Variable ein, und fügen Sie dann Ihr persönliches Zugriffstoken in das Textfeld "Wert " ein.

  5. Stellen Sie sicher, dass Sie das Kontrollkästchen "Diesen Wert geheim halten " aktivieren. Wählen Sie "OK" aus, wenn Sie fertig sind.

  6. 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.

  7. 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'