使用 Azure Artifacts 摘要作為私人 PowerShell 存放庫

Azure DevOps Services

Azure Artifacts 可讓您輕鬆地跨小組共用 PowerShell 腳本,以提升共同作業併發揮最大效率。 藉由將 PowerShell 模組儲存在私人存放庫中,您可以讓小組成員使用命令行快速下載或更新這些腳本。

本文將引導您將 Azure Artifacts 摘要設定為私人 PowerShell 存放庫,以儲存和共用 PowerShell 模組。 您將了解如何:

  • 建立個人存取令牌
  • 建立新的摘要以儲存PowerShell模組
  • 建立、封裝及發佈PowerShell模組
  • 使用 PowerShell 連線 摘要
  • 搭配 Azure Pipelines 使用私人 PowerShell 存放庫

必要條件

建立個人存取權杖

使用個人存取令牌 (PAT) 是向 Azure DevOps 進行驗證,而不需使用主要認證的絕佳方式。 如需詳細資訊,請參閱 使用個人存取令牌

  1. 流覽至您的 Azure DevOps 組織 https://dev.azure.com/<ORGANIZATION_NAME>/

  2. 選取使用者設定圖示,然後選取 [ 個人存取令牌]。

    A screenshot showing how to create a personal access token.

  3. 選取 [新增令牌]

  4. 輸入 PAT 的名稱,然後選擇 到期 日。

  5. 選取 [自定義定義],然後選取 [封裝>讀取]、[寫入及管理]。

  6. 完成後,選取 [建立]。 將 PAT 複製並儲存在安全的位置。

    A screenshot showing how to set up a new personal access token.

建立模組

  1. 建立新的資料夾 Get-Hello。 在資料夾內流覽,並建立新的 檔案 Get-Hello.psm1

    |--- Get-Hello               // Parent folder     
        |--- Get-Hello.psm1     // This will become our PowerShell Module
        |--- Get-Hello.psd1    // This will become our module manifest
    
  2. 將下列腳本貼到 Get-Hello.psm1 檔案中:

    Function Get-Hello{
        Write-Host "Hello from my Azure DevOps Services Package."
    }
    
  3. 在 Get-Hello 目錄路徑中執行下列命令,以建立模組指令清單。

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. 開啟 Get-Hello.psd1 檔案並尋找 RootModule 變數。 以 Get-Hello.psm1 檔案的路徑取代空字串串,如下所示:

    RootModule = 'Get-Hello.psm1'
    
  5. FunctionsToExport 段旨在定義將從本課程模組導出的函式清單。 新增 Get-Hello 函式,如下所示:

    FunctionsToExport = @('Get-Hello')
    
  6. 尋找 區 FileList 段,並新增下列應該與您的模組一起封裝的檔案清單。

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

套件和發佈模組

  1. 為您的模組建立 nuspec 檔案。 此命令會建立 Get-Hello.nuspec 檔案,其中包含封裝模組所需的元數據。

    nuget spec Get-Hello
    
  2. 執行下列命令來封裝您的模組。

    nuget pack Get-Hello.nuspec
    
  3. 執行下列命令以新增您的摘要來源 URL。 不支援 NuGet v3,請確定您在摘要來源 URL 中使用 v2。

    • 組織範圍的摘要:

      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>"
      
    • 專案範圍的摘要:

      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. 將套件發佈至您的摘要。

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

    A screenshot showing the published package.

重要

模組指令清單中的版本號碼 (.psd1) 和 .nuspec 檔案必須相符。

連線 作為 PowerShell 存放庫摘要

  1. 開啟提升許可權的 PowerShell 提示視窗。

  2. 設定您的認證以向 Azure Artifacts 進行驗證。 將佔位元取代為適當的資訊。

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  3. 註冊 PowerShell 存放庫。 SourceLocation您可以流覽至 [項目設定來源 URL] 底下的 [成品> 連線 至 [摘要>NuGet.exe] 來找到連結。

    • 專案範圍的摘要:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -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
      
    • 組織範圍的摘要:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -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
      

    如果您仍在使用舊 visualstudio.com 版 URL,請改用下列命令:

    • 專案範圍的摘要:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -SourceLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
      
    • 組織範圍的摘要:

      Register-PSRepository -Name "PowershellAzureDevopsServices" -SourceLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/_packaging/<FEED_NAME>/nuget/v2" -PublishLocation "https://<ORGANIZATION_NAME>.pkgs.visualstudio.com/_packaging/<FEED_NAME>/nuget/v2" -InstallationPolicy Trusted -Credential $credsAzureDevopsServices
      

    提示

    執行 Cmdlet 之後 Register-PSRepository ,某些版本的 PowerShell 需要重新啟動新的工作階段,以避免 無法解析套件來源 警告。

  4. 註冊您的套件來源:

    • 專案範圍的摘要:

      Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
      
    • 組織範圍的摘要:

      Register-PackageSource -Name "PowershellAzureDevopsServices" -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices 
      
  5. 執行下列命令以確認存放庫是否已成功註冊。 此指令會取得目前使用者的所有已註冊存放庫:

    Get-PSRepository
    
  6. 如果您想要在存放庫中尋找所有模組,請執行下列命令。

    Find-Module -Repository PowershellAzureDevopsServices
    
  7. 如果您想要安裝 Get-Hello 模組,請執行下列命令。

    Install-Module -Name Get-Hello -Repository PowershellAzureDevopsServices
    

如果 Install-Module 命令傳回下列錯誤:無法解析套件來源,請使用 旗標再次Trusted執行 Register-PackageSource Cmdlet,如下所示:

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

注意

如果您的組織使用防火牆或 Proxy 伺服器,請確定您允許 Azure Artifacts 網域 URL 和 IP 位址

使用 Azure Pipelines 註冊和安裝模組

此範例說明使用 YAML 管線驗證和安裝 PowerShell 模組的程式。 若要在管線中使用您的個人存取令牌,您應該將其納入為管線變數,如下所示:

  1. 登入您的 Azure DevOps 組織,然後流覽至您的專案。

  2. 選取 [管線],選取您的管線,然後選取 [ 編輯 ] 以編輯管線。

  3. 選取 右上角的 [變數 ],然後選取 + 符號以建立新的變數。

  4. 提供變數的 [名稱],然後在 [值] 文本框中貼上您的個人存取令牌。

  5. 請確定您選取 [ 保留此值秘密 ] 複選框。 完成時選取 [ 確定 ]。 您現在已準備好在管線中使用您的變數。

trigger:
- main

pool:
  vmImage: 'Windows-latest'

variables:
  PackageFeedEndpoint: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2'  ## For project scoped feeds use: 'https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/<PROJECT_NAME>/_packaging/<FEED_NAME>/nuget/v2'
  PackageFeedEndpointCredential: '{"endpointCredentials": [{"endpoint":"$(PackageFeedEndpoint)", "username":"Admin", "password":"$(AZURE_DEVOPS_PAT)"}]}'

steps:
- powershell: |
    Register-PSRepository -Name "psRepoPipeline" -SourceLocation '$(PackageFeedEndpoint)' -InstallationPolicy Trusted
  displayName: 'Register Azure Artifacts Feed as PSRepository'
  env:
    VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: $(PackageFeedEndpointCredential)

- powershell: |
     echo (Get-PSRepository)
  displayName: 'Get all module repositories'

- powershell: |
    Find-Module -Name "Get-Hello" | Install-Module -Confirm:$false -Force
  displayName: 'Install the Get-Hello PowerShell module'
  env:
    VSS_NUGET_EXTERNAL_FEED_ENDPOINTS: $(PackageFeedEndpointCredential)