Azure DevOps サービス
Azure Artifacts は、PowerShell スクリプトを共有するための便利なソリューションを提供します。 Azure Artifacts フィードを使用すると、コマンド ラインから PowerShell モジュールをシームレスに発行し、フィード設定を通じてこれらへのアクセスを制御できます。 この記事では、PowerShell モジュールを格納および共有するためのプライベート PowerShell リポジトリとして Azure Artifacts フィードを設定する手順について説明します。
この記事では、次の方法について学習します。
- 個人用アクセス トークンを作成する
- PowerShell モジュールを作成する
- SecretStore コンテナーを作成してリポジトリを登録する
- フィードからパッケージを発行して使用する
前提条件
新しいフィードを作成します (ない場合)。
POWERShell 6.0 以降をインストールして、PSResourceGet のインストールに必要な PowerShellGet バージョンが必要であることを確認します。
PSResourceGet をインストールします。
SecretManagement モジュールと SecretStore モジュールをインストールします。
注
PSResourceGet では、Azure Artifacts Credential Provider はサポートされていません。
個人用アクセス トークンを作成する
個人用アクセス トークンはデジタル ID として機能し、Azure DevOps でユーザーを認証するための代替パスワードとして使用できます。
Azure DevOps組織に移動します
https://dev.azure.com/<ORGANIZATION_NAME>/
ユーザー設定アイコンを選択し、[個人アクセス トークン]、[新しいトークン] の順に選択します。
PAT の名前を入力して 有効期限を設定し、[カスタム定義] を選択して、[パッケージ化]>[読み取り、書き込み & 管理] を選択します。
完了したら [作成] を選択し、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
リンクは、[Artifacts]>[フィードに接続する]>[NuGet.exe] に移動し、[プロジェクト設定] セクション > [ソース URL] で確認できます。プロジェクト スコープのフィード:
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
コマンドレットの実行後に新しいセッションの開始が必要になる場合があります。リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。
Get-PSResourceRepository
注
エラー "応答ステータス コードは成功を示していません: 404 (見つかりません)" が発生した場合は、ソース URL が nuget/v3/index.json
ではなく nuget/v2
を指していることを確認してください。
パッケージを発行する
次のコマンドを実行して、パッケージをフィードに発行します。 プレースホルダーをパッケージ パス、リポジトリ名、前に作成した資格情報オブジェクトに置き換え、ApiKey の任意の文字列を指定します。
Publish-PSResource -Path <PACKAGE_PATH> -Repository <REPOSITORY_NAME> -Credential $credentials -ApiKey <ANY_STRING>
例:
PS C:\AzureDevOps\Demos\PowerShellDemo> Publish-PSResource -Path .\scripts\ -Repository FabrikamFiberFeed -Credential $credentials -ApiKey az -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 の呼び出しで例外が発生しました" が発生した場合は、新しい PowerShell ウィンドウを開いて Get-SecretInfo
を実行します。 SecretStore のタイムアウトが期限切れになる可能性があるため、Find-PSResource と 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 以降をインストールしてください。
PowerShell 6.0 以降をインストールして、適切な PowerShellGet と PackageManagement のバージョンがあることを確認します。
個人用アクセス トークンを作成する
個人用アクセス トークンはデジタル ID として機能し、Azure DevOps でユーザーを認証するための代替パスワードとして使用できます。
Azure DevOps組織に移動します
https://dev.azure.com/<ORGANIZATION_NAME>/
ユーザー設定アイコンを選択し、[個人アクセス トークン]、[新しいトークン] の順に選択します。
PAT の名前を入力して 有効期限を設定し、[カスタム定義] を選択して、[パッケージ化]>[読み取り、書き込み & 管理] を選択します。
完了したら [作成] を選択し、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>"
重要
モジュール マニフェスト (.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
リンクは、[Artifacts]>[フィードに接続する]>[NuGet.exe] に移動し、[プロジェクト設定] セクション > [ソース URL] で確認できます。プロジェクト スコープのフィード:
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
コマンドレットの実行後に新しいセッションの開始が必要になる場合があります。パッケージ ソースを登録します。
プロジェクト スコープのフィード:
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
注
- Register-PSRepository: モジュールを検索してインストールするための PowerShell リポジトリの登録に使用されます。
- Register-PackageSource: パッケージを検索して発行するためのパッケージ ソースの登録に使用されます。
リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。
Get-PSRepository
次のコマンドを実行して、Get-Hello モジュールをインストールします。
Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
注
組織でファイアウォールまたはプロキシ サーバーを使用している場合は、Azure Artifacts ドメインの URL と IP アドレスへのアクセスを必ず許可してください。
パイプラインからパッケージをインストールする
この例では、Azure Artifacts フィードを使用して認証し、パイプラインから PowerShell モジュールをインストールする手順について説明します。 個人用アクセス トークンを使用するには、次のようにパイプライン変数として追加します。
Azure DevOps 組織にサインインしてから、プロジェクトに移動します。
[パイプライン] を選択してパイプライン定義を選択し、[編集] を選択してパイプラインを変更します。
右上隅にある [変数] を選択し、[新しい変数] を選択します。
変数の [名前] を入力し、個人用アクセス トークンを [値] ボックスに貼り付けます。
[この値を非公開にする] チェック ボックスをオンにします。 操作が終わったら、[OK] を選択します。
userName の 2 番目の変数を追加します。 変数の [名前] を入力し、[変数] ボックスに 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'