将 Azure Artifacts 源用作专用 PowerShell 存储库
Azure DevOps Services
Azure Artifacts 提供了一种简单的方式来跨团队共享 PowerShell 脚本,以促进协作并最大限度地提高有效性。 通过将 PowerShell 模块存储在专用存储库中,可以让团队成员使用命令行快速下载或更新这些脚本。
本文将指导你设置 Azure Artifacts 源作为专用 PowerShell 存储库来存储和共享 PowerShell 模块。 将了解如何执行以下操作:
- 创建个人访问令牌
- 创建新的源来存储 PowerShell 模块
- 创建、打包和发布 PowerShell 模块
- 使用 PowerShell 连接源
- 将专用 PowerShell 存储库与 Azure Pipelines 配合使用
先决条件
- NuGet.exe
- Azure Artifacts 凭据提供程序
- Azure DevOps 组织。 创建组织(如果还没有)。
- 一个 Azure Artifacts 源。 如果你没有源,请创建一个新源。
创建个人访问令牌
使用个人访问令牌(PAT)是在不使用主要凭据的情况下使用 Azure DevOps 进行身份验证的好方法。 有关更多详细信息,请参阅 “使用个人访问令牌 ”。
导航到 Azure DevOps 组织
https://dev.azure.com/<ORGANIZATION_NAME>/
选择用户设置图标,然后选择“ 个人访问令牌”。
选择“新建令牌”
输入 PAT 的名称,然后选择 到期 日期。
选择“自定义定义”,然后选择“打包>读取”、“写入和管理”。
完成操作后,选择“创建”。 将 PAT 复制并存储在安全位置。
创建模块
创建新文件夹 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
将以下脚本粘贴到 Get-Hello.psm1 文件中:
Function Get-Hello{ Write-Host "Hello from my Azure DevOps Services Package." }
通过在 Get-Hello 目录路径中运行以下命令来创建模块清单。
New-ModuleManifest -Path .\Get-Hello.psd1
打开 Get-Hello.psd1 文件并查找变量
RootModule
。 将空字符串替换为 Get-Hello.psm1 文件的路径,如下所示:RootModule = 'Get-Hello.psm1'
本
FunctionsToExport
部分旨在定义将从此模块导出的函数列表。 按如下所示添加 Get-Hello 函数:FunctionsToExport = @('Get-Hello')
找到该
FileList
部分,并添加应与模块一起打包的以下文件列表。FileList = @('./Get-Hello.psm1')
打包和发布模块
为模块创建 nuspec 文件。 此命令将创建一个 Get-Hello.nuspec 文件,其中包含打包模块所需的元数据。
nuget spec Get-Hello
运行以下命令来打包模块。
nuget pack Get-Hello.nuspec
运行以下命令以添加源源 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>"
将包发布到源。
nuget push -Source "<FEED_NAME>" -ApiKey "<ANY_STRING>" "<PACKAGE_PATH>"
重要
模块清单 (.psd1) 和 .nuspec 文件中的版本号必须匹配。
连接作为 PowerShell 存储库馈送
打开提升的 PowerShell 提示窗口。
设置凭据以使用 Azure Artifacts 进行身份验证。 将占位符替换为相应的信息。
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
$credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
注册 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 后重启新会话,以避免 无法解析包源 警告。注册包源:
项目作用域的源:
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
运行以下命令,确认存储库是否已成功注册。 此命令获取当前用户的所有已注册存储库:
Get-PSRepository
如果要在存储库中找到所有模块,请运行以下命令。
Find-Module -Repository PowershellAzureDevopsServices
如果要安装 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 模块进行身份验证和安装的过程。 若要在管道中使用个人访问令牌,应将其作为管道变量包含,如下所示:
登录到 Azure DevOps 组织,并导航到你的项目。
选择 管道,选择管道,然后选择 “编辑” 以编辑管道。
选择右上角的“变量”,然后选择用于创建新变量的+符号。
为变量提供名称,然后将个人访问令牌粘贴到“值”文本框中。
请确保选择“保留此值机密”检查框。 完成后,选择“ 确定 ”。 现在可以在管道中使用变量了。
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)
相关文章
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈