Azure Artifacts フィードをプライベート PowerShell リポジトリとして使用する
Azure DevOps Services
Azure Artifacts は、PowerShell スクリプトを共有するための便利なソリューションを提供します。 Azure Artifacts フィードを使用すると、コマンド ラインから PowerShell モジュールをシームレスに発行し、フィード設定を使用してそれらのモジュールへのアクセスを制御できます。 この記事では、PowerShell モジュールを格納および共有するためのプライベート PowerShell リポジトリとして Azure Artifacts フィードを設定する手順について説明します。
この記事では、次の方法について学習します。
- 個人用アクセス トークンを作成する
- PowerShell モジュールを作成する
- SecretStore コンテナーを作成してリポジトリを登録する
- フィードからパッケージを発行して使用する
前提条件
Azure DevOps organization と project をまだ作成していない場合は作成します。
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>NuGet.exe に移動することで確認できます。プロジェクト スコープのフィード
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/v2
ではなくnuget/v3/index.json
を指していることを確認します。
パッケージの公開
次のコマンドを実行して、パッケージをフィードに発行します。
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 DevOps organization と project をまだ作成していない場合は作成します。
Azure Artifacts Credential Provider をインストールします。
NuGet をインストールします。
個人用アクセス トークンを作成する
個人用アクセス トークンはデジタル 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>NuGet.exe に移動することで確認できます。プロジェクト スコープのフィード
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'