Dela via


Använda en Azure Artifacts-feed som en privat PowerShell-lagringsplats

Azure DevOps Services

Azure Artifacts är en praktisk lösning för att dela PowerShell-skript. Genom att använda Azure Artifacts-feeds kan du sömlöst publicera dina PowerShell-moduler från kommandoraden och styra åtkomsten till dem via flödesinställningarna. Den här artikeln beskriver hur du konfigurerar Ditt Azure Artifacts-flöde som en privat PowerShell-lagringsplats för att lagra och dela dina PowerShell-moduler.

I den här artikeln får du lära dig att:

  • Skapa en personlig åtkomsttoken
  • Skapa en PowerShell-modul
  • Skapa ett SecretStore-valv och registrera en lagringsplats
  • Publicera och använda paket från en feed

Förutsättningar

Kommentar

Azure Artifacts Credential Provider stöds inte med PSResourceGet.

Skapa en personlig åtkomsttoken

En personlig åtkomsttoken fungerar som din digitala identitet och fungerar som ett alternativt lösenord för att autentisera dig med Azure DevOps.

  1. Gå till din Azure DevOps-organisation https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Välj ikonen användarinställningar, välj Personliga åtkomsttoken och välj sedan Ny token.

  3. Ange ett namn för din PAT, ange ett förfallodatum, välj Anpassad definierad och välj sedan Paketera>läs, skriva och hantera.

  4. Välj Skapa när du är klar och se till att du kopierar och lagrar din PAT på en säker plats.

    En skärmbild som visar hur du konfigurerar en ny personlig åtkomsttoken.

Skapa en PowerShell-modul

Om du inte har en egen modul följer du anvisningarna i det här avsnittet för att skapa en PowerShell-exempelmodul. Annars går du vidare till nästa steg:

  1. Skapa en ny mapp PowerShell-Demo. Navigera till mappen och skapa en ny fil PowerShell-Demo.psm1.

  2. Klistra in följande skript i filen PowerShell-Demo.psm1 :

    Function PowerShell-Demo{
        Write-Host "Hello World!"
    }
    
  3. Generera modulmanifestet genom att köra följande kommando i powershell-demo-katalogen:

    New-ModuleManifest -Path .\PowerShell-Demo.psd1
    
  4. Öppna filen PowerShell-Demo.psd1 och leta upp variabeln RootModule . Den här inställningen anger huvudskriptfilen som PowerShell läser in när modulen importeras. Ersätt den tomma strängen med sökvägen till filen PowerShell-Demo.psm1 :

    RootModule = 'PowerShell-Demo.psm1'
    
  5. Avsnittet FunctionsToExport anger vilka funktioner som är tillgängliga för användare när de importerar modulen. Inkludera din PowerShell-Demo-funktion :

    FunctionsToExport = @('PowerShell-Demo')
    
  6. Leta upp avsnittet FileList som visar de filer som ingår när du paketerar modulen. Lägg till filen som du vill paketera med modulen:

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

Registrera en lagringsplats

  1. Kör följande kommando för att skapa ett autentiseringsobjekt. Ersätt platshållarna med rätt information.

    $username = "<USER_NAME>"
    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
    
  2. Kontrollera att SecretManagement och SecretStore är installerade och kör sedan följande kommando för att skapa ett valv och lägga till en hemlighet:

    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. Kontrollera om valvet och hemligheten har skapats genom att köra följande kommando för att visa alla dina hemligheter:

    PS > Get-SecretInfo
    
    Name            Type         VaultName
    ----            ----         ---------
    MyCredential    PSCredential MySecretVault
    
    
  4. Kör följande kommando för att registrera din PowerShell-lagringsplats. Du hittar länken SourceLocation genom att gå till Artifacts>Connect to Feed>NuGet.exe under avsnittet > Käll-URL för projektkonfiguration.

    • Flöde med projektomfattning:

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

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

    Dricks

    Vissa versioner av PowerShell kan kräva att en ny session startas när cmdleten Register-PSResourceRepository har körts för att förhindra att paketkällvarningen inte kan matchas.

  5. Kontrollera om lagringsplatsen har registrerats genom att köra följande kommando för att hämta alla registrerade lagringsplatser för den aktuella användaren:

    Get-PSResourceRepository
    

Kommentar

Om du stöter på felet: Svarsstatuskoden indikerar inte att det lyckades: 404 (hittades inte)., se till att käll-URL:en pekar på i stället nuget/v2för nuget/v3/index.json .

Publicera ett paket

Kör följande kommando för att publicera paketet i feeden:

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

Exempel:

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'

En skärmbild som visar PowerShell-demopaketet som publicerats i feeden.

Installera ett paket

  1. Kontrollera om modulen är tillgänglig på lagringsplatsen genom att använda följande kommando för att söka efter den:

    Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
    
  2. Kör följande kommando för att installera den senaste stabila versionen av modulen:

    Install-PSResource <MODULE_NAME>
    

Dricks

Om du stöter på felet: Undantagsanrop för "WriteObject"., starta ett nytt PowerShell-fönster och kör Get-SecretInfo. Ange ditt valvlösenord innan du kör Find-PSResource och Install-PSResource, eftersom Tidsgränsen för SecretStore kan upphöra att gälla. Standardvärdet PasswordTimeout är 900 sekunder, men du kan ändra det här värdet efter behov. Mer information finns i Använda SecretStore i automation .

I den här artikeln får du lära dig att:

  • Skapa en personlig åtkomsttoken
  • Skapa, paketera och publicera en PowerShell-modul
  • Ansluta till en feed som en PowerShell-lagringsplats
  • Registrera och installera en PowerShell-modul med Hjälp av Azure Pipelines

Förutsättningar

Skapa en personlig åtkomsttoken

En personlig åtkomsttoken fungerar som din digitala identitet och fungerar som ett alternativt lösenord för att autentisera dig med Azure DevOps.

  1. Gå till din Azure DevOps-organisation https://dev.azure.com/<ORGANIZATION_NAME>/

  2. Välj ikonen användarinställningar, välj Personliga åtkomsttoken och välj sedan Ny token.

  3. Ange ett namn för din PAT, ange ett förfallodatum, välj Anpassad definierad och välj sedan Paketera>läs, skriva och hantera.

  4. Välj Skapa när du är klar och se till att du kopierar och lagrar din PAT på en säker plats.

    En skärmbild som visar hur du konfigurerar en ny personlig åtkomsttoken.

Skapa en PowerShell-modul

Om du inte har en egen modul följer du anvisningarna i det här avsnittet för att skapa en PowerShell-exempelmodul. Annars går du vidare till nästa steg:

  1. Skapa en ny mapp Get-Hello. Navigera till mappen och skapa en ny fil Get-Hello.psm1.

  2. Klistra in följande skript i filen Get-Hello.psm1 :

    Function Get-Hello{
        Write-Host "Hello Azure DevOps!"
    }
    
  3. Generera modulmanifestet genom att köra följande kommando i din Get-Hello-katalog :

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Öppna filen Get-Hello.psd1 och leta upp variabelnRootModule. Den här inställningen anger huvudskriptfilen som PowerShell läser in när modulen importeras. Ersätt den tomma strängen med sökvägen till filen Get-Hello.psm1 :

    RootModule = 'Get-Hello.psm1'
    
  5. Avsnittet FunctionsToExport anger vilka funktioner som är tillgängliga för användare när de importerar modulen. Inkludera funktionen Get-Hello :

    FunctionsToExport = @('Get-Hello')
    
  6. Leta reda på avsnittet FileList som anger vilka filer som ingår när modulen paketeras. Lägg till filen som du vill paketera med modulen:

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

Paketera och publicera en modul

  1. Generera en nuspec-fil för modulen. Det här kommandot skapar en Get-Hello.nuspec-fil som innehåller nödvändiga metadata för att packa modulen:

    nuget spec Get-Hello
    
  2. Kör följande kommando för att paketera modulen:

    nuget pack Get-Hello.nuspec
    
  3. Kör följande kommando för att lägga till feedkällans URL. Kontrollera att du använder V2 i feedkällans URL eftersom NuGet V3 inte stöds.

    • Flöde med organisationsomfattning:

      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>"
      
    • Flöde med projektomfattning:

      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. Publicera paketet i feeden:

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

Viktigt!

Versionsnumret i modulmanifestet (.psd1) måste vara identiskt med versionsnumret i .nuspec-filen .

Ansluta till en feed som en PowerShell-lagringsplats

Det här avsnittet vägleder dig genom att autentisera med ett flöde som en PowerShell-lagringsplats och använda en modul som finns i feeden:

  1. I ett PowerShell-promptfönster kör du följande kommando för att konfigurera dina autentiseringsuppgifter. Ersätt platshållarna med lämplig information.

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  2. Registrera din PowerShell-lagringsplats. Du hittar länken SourceLocation genom att gå till Artifacts>Connect to Feed>NuGet.exe under avsnittet > Käll-URL för projektkonfiguration.

    • Flöde med projektomfattning:

      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
      
    • Flöde med organisationsomfattning:

      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
      

    Dricks

    Vissa versioner av PowerShell kan kräva att en ny session startas när cmdleten Register-PSRepository har körts för att förhindra att paketkällvarningen inte kan matchas.

  3. Registrera paketkällan:

    • Flöde med projektomfattning:

      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
      
    • Flöde med organisationsomfattning:

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

    Kommentar

    • Register-PSRepository: Används för att registrera en PowerShell-lagringsplats för att hitta och installera moduler.
    • Register-PackageSource: Används för att registrera en paketkälla för att hitta och publicera paket.
  4. Kontrollera om lagringsplatsen har registrerats genom att köra följande kommando för att hämta alla registrerade lagringsplatser för den aktuella användaren:

    Get-PSRepository
    
  5. Kör följande kommando för att installera Get-Hello-modulen .

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

Kommentar

Om din organisation använder en brandvägg eller en proxyserver kontrollerar du att du tillåter åtkomst till Url:er och IP-adresser för Azure Artifacts-domäner.

Installera ett paket från din pipeline

Det här exemplet vägleder dig genom att autentisera med en Azure Artifacts-feed och installera en PowerShell-modul från din pipeline. Om du vill använda din personliga åtkomsttoken lägger du till den som en pipelinevariabel enligt nedan:

  1. Logga in på din Azure DevOps-organisation och navigera sedan till projektet.

  2. Välj Pipelines, välj din pipelinedefinition och välj sedan Redigera för att ändra pipelinen.

  3. Välj Variabler i det övre högra hörnet och välj sedan Ny variabel.

  4. Ange ett Namn för variabeln och klistra sedan in din personliga åtkomsttoken i textrutan Värde .

  5. Kontrollera att du markerar kryssrutan Behåll det här värdet hemligt . Välj Ok när du är klar.

  6. Lägg till en andra variabel för ditt användarnamn. Ange ett Namn för variabeln och ange sedan användarnamnet i textrutan Värde .

  7. Välj Spara när du är klar.

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'