Azure Artifacts フィードをプライベート PowerShell リポジトリとして使用する
Azure DevOps Services
Azure Artifacts は、PowerShell スクリプトを共有するための便利なソリューションを提供します。 Azure Artifacts フィードを使用すると、コマンド ラインから PowerShell モジュールをシームレスに発行し、フィード設定を使用してそれらのモジュールへのアクセスを制御できます。 この記事では、PowerShell モジュールを格納および共有するためのプライベート PowerShell リポジトリとして Azure Artifacts フィードを設定する手順について説明します。
この記事では、次の方法について学習します。
- 個人用アクセス トークンを作成する
- PowerShell モジュールを作成する
- SecretStore コンテナーを作成してリポジトリを登録する
- フィードからパッケージを発行して使用する
前提条件
新しいフィードを作成します (ない場合)。
PSResourceGet をインストールします。
SecretManagement モジュールと SecretStore モジュールをインストールします。
Note
PSResourceGet では、Azure Artifacts Credential Provider はサポートされていません。
個人用アクセス トークンを作成する
個人用アクセス トークンはデジタル ID として機能し、Azure DevOps でユーザーを認証するための代替パスワードとして機能します。
Azure DevOps 組織に移動する
https://dev.azure.com/<ORGANIZATION_NAME>/
ユーザー設定アイコンを選択 [個人アクセス トークン]を選択し、 [新しいトークン] を選択します。
PAT の名前を入力し、 Expiration 日付を設定し、 Custom defined を選択してから、 Packaging>Read、write & manage を選択します。
完了したら 作成 を選択し、PAT をコピーして安全な場所に保存してください。
PowerShell モジュールを作成する
独自のモジュールがない場合は、このセクションの手順に従って、サンプルの PowerShell モジュールを作成します。 それ以外の場合は、次の手順に進みます。
PowerShell-Demo新しいフォルダーを作成します。 フォルダーに移動し、PowerShell-Demo.psm1 新しいファイルを作成。
次のスクリプトを PowerShell-Demo.psm1 ファイルに貼り付けます。
Function PowerShell-Demo{ Write-Host "Hello World!" }
PowerShell-Demo ディレクトリで次のコマンドを実行して、モジュール マニフェストを生成します。
New-ModuleManifest -Path .\PowerShell-Demo.psd1
PowerShell-Demo.psd1 ファイルを開き、
RootModule
変数を見つけます。 この設定では、モジュールのインポート時に PowerShell によって読み込まれるメイン スクリプト ファイルを指定します。 空の文字列を、 PowerShell-Demo.psm1 ファイルへのパスに置き換えます。RootModule = 'PowerShell-Demo.psm1'
FunctionsToExport
セクションでは、ユーザーがモジュールをインポートするときにアクセスできる関数を指定します。 PowerShell-Demo 関数を含めます。FunctionsToExport = @('PowerShell-Demo')
FileList
セクションを見つけます。このセクションには、モジュールのパッケージ化時に含まれるファイルが一覧表示されます。 モジュールでパッケージ化するファイルを追加します。FileList = @('./PowerShell-Demo.psm1')
リポジトリを登録する
次のコマンドを実行して、資格情報オブジェクトを作成します。 プレースホルダーを正しい情報に置き換えます。
$username = "<USER_NAME>" $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
SecretManagement と SecretStore がインストールされていることを確認し、次のコマンドを実行してコンテナーを作成し、シークレットを追加します。
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')
コンテナーとシークレットが正常に作成されたかどうかを確認するには、次のコマンドを実行してすべてのシークレットを一覧表示します。
PS > Get-SecretInfo Name Type VaultName ---- ---- --------- MyCredential PSCredential MySecretVault
次のコマンドを実行して、PowerShell リポジトリを登録します。
SourceLocation
リンクは、ソース URL の [Project setup>] セクションの [Artifacts>Connect to 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
組織スコープのフィード:
Register-PSResourceRepository -Name "PowershellPSResourceRepository" ` -Uri "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v3/index.json" ` -Trusted ` -CredentialInfo $CredentialInfo
ヒント
一部のバージョンの PowerShell では、
Register-PSResourceRepository
コマンドレットを実行した後に新しいセッションを開始して、パッケージ ソースを解決するために Unable が発生しないようにする必要があります 警告。リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。
Get-PSResourceRepository
Note
エラーが発生した場合: Response 状態コードが成功を示していません: 404 (Not Found).、ソース URL がnuget/v3/index.json
ではなくnuget/v2
を指していることを確認します。
パッケージの公開
次のコマンドを実行して、パッケージをフィードに発行します。
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -ApiKey (Get-Secret <SECRET_NAME>)
例:
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'
パッケージをインストールする
モジュールがリポジトリで使用可能かどうかを確認するには、次のコマンドを使用してモジュールを検索します。
Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
次のコマンドを実行して、モジュールの最新の安定バージョンをインストールします。
Install-PSResource <MODULE_NAME>
ヒント
"WriteObject". を呼び出す Exception というエラーが発生した場合は、新しい PowerShell ウィンドウを起動し、Get-SecretInfo
実行します。 SecretStore のタイムアウト期間が期限切れになる可能性Install-PSResourceを実行する前に、コンテナーのパスワードを入力します。 既定の PasswordTimeout は 900 秒ですが、必要に応じてこの値を変更できます。 詳細については、「 オートメーションで SecretStore を使用する 」を参照してください。
この記事では、次の方法について学習します。
- 個人用アクセス トークンを作成する
- PowerShell モジュールを作成、パッケージ化、発行する
- PowerShell リポジトリとしてフィードに接続する
- Azure Pipelines を使用して PowerShell モジュールを登録してインストールする
前提条件
新しいフィードを作成します (ない場合)。
Azure Artifacts Credential Provider をインストールします。
次のいずれかのオプションを使用して Windows MSBuild をインストールします。
NuGet(.exe) バージョン 4.8.0.5385 以降をインストールします。
dotnet runtime バージョン 8.0.x 以降をインストールしてください。
個人用アクセス トークンを作成する
個人用アクセス トークンはデジタル ID として機能し、Azure DevOps でユーザーを認証するための代替パスワードとして機能します。
Azure DevOps 組織に移動する
https://dev.azure.com/<ORGANIZATION_NAME>/
ユーザー設定アイコンを選択 [個人アクセス トークン]を選択し、 [新しいトークン] を選択します。
PAT の名前を入力し、 Expiration 日付を設定し、 Custom defined を選択してから、 Packaging>Read、write & manage を選択します。
完了したら 作成 を選択し、PAT をコピーして安全な場所に保存してください。
PowerShell モジュールを作成する
独自のモジュールがない場合は、このセクションの手順に従って、サンプルの PowerShell モジュールを作成します。 それ以外の場合は、次の手順に進みます。
Get-Hello新しいフォルダーを作成します。 フォルダーに移動し、Get-Hello.psm1 新しいファイル作成します。
次のスクリプトを Get-Hello.psm1 ファイルに貼り付けます。
Function Get-Hello{ Write-Host "Hello Azure DevOps!" }
Get-Hello ディレクトリで次のコマンドを実行して、モジュール マニフェストを生成します。
New-ModuleManifest -Path .\Get-Hello.psd1
Get-Hello.psd1 ファイルを開き、
RootModule
変数を見つけます。 この設定では、モジュールのインポート時に PowerShell によって読み込まれるメイン スクリプト ファイルを指定します。 空の文字列を、 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>"
重要
Module マニフェスト (.psd1) のバージョン番号は、.nuspec ファイルのバージョン番号と同じである必要があります。
PowerShell リポジトリとしてフィードに接続する
このセクションでは、フィードを PowerShell リポジトリとして認証し、フィードでホストされているモジュールを使用する方法について説明します。
PowerShell プロンプト ウィンドウで、次のコマンドを実行して資格情報を設定します。 プレースホルダーを適切な情報に置き換えます。
$patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
PowerShell リポジトリを登録します。
SourceLocation
リンクは、ソース URL の [Project setup>] セクションの [Artifacts>Connect to 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
組織スコープのフィード:
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
ヒント
一部のバージョンの PowerShell では、
Register-PSRepository
コマンドレットを実行した後に新しいセッションを開始して、パッケージ ソースを解決するために Unable が発生しないようにする必要があります 警告。パッケージ ソースを登録します。
プロジェクト スコープのフィード
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
組織スコープのフィード:
Register-PackageSource -Name <REPOSITORY_NAME> -Location "https://pkgs.dev.azure.com/<ORGANIZATION_NAME>/_packaging/<FEED_NAME>/nuget/v2" -ProviderName NuGet -Trusted -SkipValidate -Credential $credsAzureDevopsServices
Note
- Register-PSRepository: モジュールを検索してインストールするために PowerShell リポジトリを登録するために使用されます。
- Register-PackageSource: パッケージを検索して発行するためのパッケージ ソースを登録するために使用されます。
リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。
Get-PSRepository
次のコマンドを実行して、 Get-Hello モジュールをインストールします。
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
Note
組織でファイアウォールまたはプロキシ サーバーを使用している場合は、 Azure Artifacts のドメイン URL と IP アドレスへのアクセスを許可していることを確認します。
パイプラインからパッケージをインストールする
この例では、Azure Artifacts フィードを使用して認証し、パイプラインから PowerShell モジュールをインストールする手順について説明します。 個人用アクセス トークンを使用するには、次のようにパイプライン変数として追加します。
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
Pipelinesを選択し、パイプライン定義を選択し、Edit を選択してパイプラインを変更します。
右上隅にある Variables を選択し、 New 変数を選択します。
変数の Name を入力し、個人用アクセス トークンを Value ボックスに貼り付けます。
[この値のシークレットを保持します] チェック ボックスをオンにします。 完了したら Ok を選択します。
userName の 2 番目の変数を追加します。 変数の Name を入力し、 Value ボックスに userName を入力します。
完了したら、 [保存] を選択します。
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'