将 Azure Artifacts 源用作专用 PowerShell 存储库

Azure DevOps Services

Azure Artifacts 提供了一种简单的方式来跨团队共享 PowerShell 脚本,以促进协作并最大限度地提高有效性。 通过将 PowerShell 模块存储在专用存储库中,可以让团队成员使用命令行快速下载或更新这些脚本。

本文将指导你设置 Azure Artifacts 源作为专用 PowerShell 存储库来存储和共享 PowerShell 模块。 将了解如何执行以下操作:

  • 创建个人访问令牌
  • 创建新的源来存储 PowerShell 模块
  • 创建、打包和发布 PowerShell 模块
  • 使用 PowerShell 连接源
  • 将专用 PowerShell 存储库与 Azure Pipelines 配合使用

先决条件

创建个人访问令牌

使用个人访问令牌(PAT)是在不使用主要凭据的情况下使用 Azure DevOps 进行身份验证的好方法。 有关更多详细信息,请参阅 “使用个人访问令牌 ”。

  1. 导航到 Azure DevOps 组织 https://dev.azure.com/<ORGANIZATION_NAME>/

  2. 选择用户设置图标,然后选择“ 个人访问令牌”。

    显示如何创建个人访问令牌的屏幕截图。

  3. 选择“新建令牌”

  4. 输入 PAT 的名称,然后选择 到期 日期。

  5. 选择“自定义定义”,然后选择“打包>读取”、“写入和管理”。

  6. 完成操作后,选择“创建”。 将 PAT 复制并存储在安全位置。

    显示如何设置新的个人访问令牌的屏幕截图。

创建模块

  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>"
    

    显示已发布包的屏幕截图。

重要

模块清单 (.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
      

    提示

    某些版本的 PowerShell 需要在执行 Register-PSRepository cmdlet 后重启新会话,以避免 无法解析包源 警告。

  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

注意

如果你的组织使用防火墙或代理服务器,请确保允许 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)