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

Azure DevOps Services

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

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

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

前提条件

Note

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

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

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

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

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

  3. PAT の名前を入力し、 Expiration 日付を設定し、 Custom defined を選択してから、 Packaging>Read、write & manage を選択します。

  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リンクは、ソース 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 が発生しないようにする必要があります 警告。

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

    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'

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

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

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

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

    Install-PSResource <MODULE_NAME>
    

ヒント

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

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

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

前提条件

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

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

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

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

  3. PAT の名前を入力し、 Expiration 日付を設定し、 Custom defined を選択してから、 Packaging>Read、write & manage を選択します。

  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>"
    

重要

Module マニフェスト (.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リンクは、ソース 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 が発生しないようにする必要があります 警告。

  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 
      

    Note

    • Register-PSRepository: モジュールを検索してインストールするために PowerShell リポジトリを登録するために使用されます。
    • Register-PackageSource: パッケージを検索して発行するためのパッケージ ソースを登録するために使用されます。
  4. リポジトリが正常に登録されたかどうかを確認するには、次のコマンドを実行して、現在のユーザーのすべての登録済みリポジトリを取得します。

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

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

Note

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

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

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

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

  2. Pipelinesを選択し、パイプライン定義を選択し、Edit を選択してパイプラインを変更します。

  3. 右上隅にある Variables を選択し、 New 変数を選択します。

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

  5. [この値のシークレットを保持します] チェック ボックスをオンにします。 完了したら Ok を選択します。

  6. userName の 2 番目の変数を追加します。 変数の Name を入力し、 Value ボックスに 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'