次の方法で共有


Azure Artifacts フィードをプライベート PowerShell リポジトリとして使用する

Azure DevOps サービス

Azure Artifacts は、PowerShell スクリプトを共有するための便利なソリューションを提供します。 Azure Artifacts フィードを使用すると、コマンド ラインから PowerShell モジュールをシームレスに発行し、フィード設定を通じてこれらへのアクセスを制御できます。 この記事では、PowerShell モジュールを格納および共有するためのプライベート PowerShell リポジトリとして Azure Artifacts フィードを設定する手順について説明します。

この記事では、次の方法について学習します。

  • 個人用アクセス トークンを作成する
  • PowerShell モジュールを作成する
  • SecretStore コンテナーを作成してリポジトリを登録する
  • フィードからパッケージを発行して使用する

前提条件

PSResourceGet では、Azure Artifacts Credential Provider はサポートされていません。

個人用アクセス トークンを作成する

個人用アクセス トークンはデジタル ID として機能し、Azure DevOps でユーザーを認証するための代替パスワードとして使用できます。

  1. Azure DevOps組織に移動します https://dev.azure.com/<ORGANIZATION_NAME>/

  2. ユーザー設定アイコンを選択し、[個人アクセス トークン][新しいトークン] の順に選択します。

  3. PAT の名前を入力して 有効期限を設定し、[カスタム定義] を選択して、[パッケージ化]>[読み取り、書き込み & 管理] を選択します。

  4. 完了したら [作成] を選択し、PAT をコピーして安全な場所に保存してください。

    新しい個人用アクセス トークンを設定する方法を示すスクリーンショット。

PowerShell モジュールを作成する

独自のモジュールがない場合は、このセクションの手順に従って、サンプルの PowerShell モジュールを作成します。 それ以外の場合は次の手順に進みます。

  1. PowerShell-Demo という新しいフォルダーを作成します。 このフォルダーに移動して、新しいファイル PowerShell-Demo.psm1 を作成します。

  2. 次のスクリプトを PowerShell-Demo.psm1 ファイルに貼り付けます。

    Function PowerShell-Demo{
        Write-Host "Hello World!"
    }
    
  3. PowerShell-Demo ディレクトリで次のコマンドを実行して、モジュール マニフェストを生成します。

    New-ModuleManifest -Path .\PowerShell-Demo.psd1
    
  4. PowerShell-Demo.psd1 ファイルを開き、RootModule 変数を見つけます。 この設定では、モジュールのインポート時に PowerShell によって読み込まれるメイン スクリプト ファイルを指定します。 空の文字列を、PowerShell-Demo.psm1 ファイルへのパスに置き換えます。

    RootModule = 'PowerShell-Demo.psm1'
    
  5. FunctionsToExportセクションでは、ユーザーがモジュールをインポートするときにアクセスできる関数を指定します。 PowerShell-Demo 関数を含めます。

    FunctionsToExport = @('PowerShell-Demo')
    
  6. FileList セクションを見つけます。このセクションには、モジュールのパッケージ化時に含まれるファイルが一覧表示されます。 モジュールでパッケージ化するファイルを追加します。

    FileList = @('./PowerShell-Demo.psm1')
    

リポジトリを登録する

  1. 次のコマンドを実行して、資格情報オブジェクトを作成します。 プレースホルダーを適切な情報に置き換えます。

    $username = "<USER_NAME>"
    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credentials = New-Object System.Management.Automation.PSCredential($username, $patToken)
    
  2. SecretManagementSecretStore がインストールされていることを確認してから、次のコマンドを実行してコンテナーを作成し、シークレットを追加します。

    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')
    
  3. コンテナーとシークレットが正常に作成されたかどうかを確認するには、次のコマンドを実行して、すべてのシークレットを一覧表示します。

    PS > Get-SecretInfo
    
    Name            Type         VaultName
    ----            ----         ---------
    MyCredential    PSCredential MySecretVault
    
    
  4. 次のコマンドを実行して、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 コマンドレットの実行後に新しいセッションの開始が必要になる場合があります。

  5. リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。

    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'

フィードに発行された PowerShell デモ パッケージを示すスクリーンショット。

パッケージをインストールする

  1. モジュールがリポジトリで使用可能かどうかを確認するには、次のコマンドを使用してモジュールを検索します。

    Find-PSResource -Name <RESOURCE_NAME> -Repository <REPOSITORY_NAME> -verbose
    
  2. 次のコマンドを実行して、モジュールの最新の安定バージョンをインストールします。

    Install-PSResource <MODULE_NAME>
    

ヒント

エラー "WriteObject の呼び出しで例外が発生しました" が発生した場合は、新しい PowerShell ウィンドウを開いて Get-SecretInfo を実行します。 SecretStore のタイムアウトが期限切れになる可能性があるため、Find-PSResourceInstall-PSResource を実行する前に、コンテナーのパスワードを入力してください。 既定の PasswordTimeout は 900 秒ですが、この値は必要に応じて変更できます。 詳細については、「オートメーションで SecretStore を使用する」を参照してください。

この記事では、次の方法について学習します。

  • 個人用アクセス トークンを作成する
  • PowerShell モジュールを作成、パッケージ化、発行する
  • PowerShell リポジトリとしてフィードに接続する
  • Azure Pipelines を使用して PowerShell モジュールの登録とインストールを行う

前提条件

個人用アクセス トークンを作成する

個人用アクセス トークンはデジタル ID として機能し、Azure DevOps でユーザーを認証するための代替パスワードとして使用できます。

  1. Azure DevOps組織に移動します https://dev.azure.com/<ORGANIZATION_NAME>/

  2. ユーザー設定アイコンを選択し、[個人アクセス トークン][新しいトークン] の順に選択します。

  3. PAT の名前を入力して 有効期限を設定し、[カスタム定義] を選択して、[パッケージ化]>[読み取り、書き込み & 管理] を選択します。

  4. 完了したら [作成] を選択し、PAT をコピーして安全な場所に保存してください。

    新しい個人用アクセス トークンを設定する方法を示すスクリーンショット。

PowerShell モジュールを作成する

独自のモジュールがない場合は、このセクションの手順に従って、サンプルの PowerShell モジュールを作成します。 それ以外の場合は次の手順に進みます。

  1. Get-Hello という新しいフォルダーを作成します。 フォルダーに移動し、Get-Hello.psm1 という新しいファイルを作成します。

  2. 次のスクリプトを Get-Hello.psm1 ファイルに貼り付けます。

    Function Get-Hello{
        Write-Host "Hello Azure DevOps!"
    }
    
  3. Get-Hello ディレクトリで次のコマンドを実行して、モジュール マニフェストを生成します。

    New-ModuleManifest -Path .\Get-Hello.psd1
    
  4. Get-Hello.psd1 ファイルを開き、RootModule 変数を見つけます。 この設定では、モジュールのインポート時に PowerShell によって読み込まれるメイン スクリプト ファイルを指定します。 空の文字列を、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 リポジトリとしてフィードに接続する

このセクションでは、フィードを PowerShell リポジトリとして認証し、フィードでホストされているモジュールを使用する方法について説明します。

  1. PowerShell プロンプト ウィンドウで、次のコマンドを実行して資格情報を設定します。 プレースホルダーを適切な情報に置き換えます。

    $patToken = "<PERSONAL_ACCESS_TOKEN>" | ConvertTo-SecureString -AsPlainText -Force
    
    $credsAzureDevopsServices = New-Object System.Management.Automation.PSCredential("<USER_NAME>", $patToken)
    
  2. 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 コマンドレットの実行後に新しいセッションの開始が必要になる場合があります。

  3. パッケージ ソースを登録します。

    • プロジェクト スコープのフィード:

      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: パッケージを検索して発行するためのパッケージ ソースの登録に使用されます。
  4. リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。

    Get-PSRepository
    
  5. 次のコマンドを実行して、Get-Hello モジュールをインストールします。

    Install-Module -Name <PACKAGE_NAME> -Repository <REPOSITORY_NAME>
    

組織でファイアウォールまたはプロキシ サーバーを使用している場合は、Azure Artifacts ドメインの URL と IP アドレスへのアクセスを必ず許可してください。

パイプラインからパッケージをインストールする

この例では、Azure Artifacts フィードを使用して認証し、パイプラインから PowerShell モジュールをインストールする手順について説明します。 個人用アクセス トークンを使用するには、次のようにパイプライン変数として追加します。

  1. Azure DevOps 組織にサインインしてから、プロジェクトに移動します。

  2. [パイプライン] を選択してパイプライン定義を選択し、[編集] を選択してパイプラインを変更します。

  3. 右上隅にある [変数] を選択し、[新しい変数] を選択します。

  4. 変数の [名前] を入力し、個人用アクセス トークンを [値] ボックスに貼り付けます。

  5. [この値を非公開にする] チェック ボックスをオンにします。 操作が終わったら、[OK] を選択します。

  6. userName の 2 番目の変数を追加します。 変数の [名前] を入力し、[変数] ボックスに userName を入力します。

  7. 完了したら、 [保存] を選択します。

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'