Azure DevOps で vcpkg を使用してカスタム レジストリ ポートをテストする

vcpkg ポートのカスタム レジストリを設定したら、継続的な統合を追加して、すべての依存関係を正常に構築できることを検証できます。

Microsoft/vcpkg の メイン vcpkg レジストリは、Azure DevOps との継続的インテグレーション (CI) パイプラインを使用して vcpkg チームによってテストされます。 これにより、新しいパッケージを追加したり、既存のパッケージを更新したりしても、コンシューマーが中断されることはありません。

この記事では、独自のレジストリで vcpkg ポートをテストする CI 環境を設定する方法について説明します。

この記事では、次の内容について説明します。

  • Azure DevOps パイプラインのバイナリ キャッシュと資産キャッシュを設定する
  • レジストリのポートをテストするパイプラインを設定する

前提条件

Azure DevOps パイプラインのバイナリ キャッシュと資産キャッシュを設定する

ポートの大規模なコレクションを構築することは、時間とコンピューティング能力の両方の面で高価なタスクです。 ポートに CI を使用する前に、Azure DevOps パイプラインのバイナリ キャッシュと資産キャッシュの設定に投資することを強くお勧めします。

バイナリ キャッシュは、変更されていないパッケージがすべての CI 実行で再構築されないようにすることで、CI シナリオに最も大きな利点をもたらします。 資産キャッシュミラー実行中にパッケージ用にダウンロードされた成果物を取得し、その後の実行時にキャッシュされた成果物を使用します。 また、アップストリーム リポジトリの信頼性が低い問題 (ダウンロード URL の破損など) を軽減するのにも役立ちます。

これらのキャッシュを設定する方法の詳細な手順については、バイナリ キャッシュと資産キャッシュに関する記事を参照してください。

例: Azure DevOps パイプラインで資産とバイナリ キャッシュを有効にする

steps: 
- task: NuGetAuthenticate@1

- script: $(Build.Repository.LocalPath)/vcpkg/vcpkg install --triplet=x64-windows
  displayName: some vcpkg task
  env:
    X_VCPKG_ASSET_SOURCES: "clear;x-azurl,https://my.domain.com/container,$(VcpkgAssetCache),readwrite"
    VCPKG_BINARY_SOURCES: "clear;nuget,https://my.domain.com/vcpkgBinaryCache/nuget/v3/index.json,readwrite"

この例では、Azure DevOps パイプラインでバイナリ キャッシュと資産キャッシュを設定する方法を示します。 このスニペットは、独自のパイプラインの YAML ファイルで使用するように調整する必要があります。

このスニペットを分解します。

X_VCPKG_ASSET_SOURCES は、vcpkg で資産キャッシュを構成するために使用される環境変数です。 この例では、次に x-azurl,https://my.domain.com/container,$(VcpkgAssetCache),readwrite設定します。 バックエンドは x-azurl 、ストレージ プロバイダーとして Azure Storage コンテナーを使用するように vcpkg に指示します。 その x-azurl 後に、コンマ (,) で区切られた 3 つのパラメーターが続きます。

  • https://my.domain.com/container はストレージ コンテナーの URL です。
  • $(VcpkgAssetCache) は、ストレージ コンテナーに対して認証する SAS トークンを含むパイプライン シークレット変数です。
  • readwrite は、資産キャッシュの読み取りと書き込みのアクセス許可を設定します。 つまり、この資産キャッシュは、成果物を格納するために使用されるだけでなく、成果物から成果物を復元するために使用されます。

VCPKG_BINARY_SOURCES は、vcpkg でバイナリ キャッシュを構成するために使用される環境変数です。 この例では、次に clear;nuget,https://my.domain.com/vcpkgBinaryCache/nuget/v3/index.json,readwrite設定します。 これにより、NuGet フィード https://my.domain.com/vcpkgBinaryCache/nuget/v3/index.jsonを使用してバイナリ キャッシュの NuGet バックエンドを有効にします。 NuGet フィードに対する認証には追加の手順が必要になる場合があります。ADO で NuGet 認証を設定する手順については、チュートリアルを参照してください。

Azure Artifacts NuGet フィードに対して認証を行うには、パイプラインに次のタスクをそのまま追加する必要があります。 このタスクは、vcpkg を含むタスクの前にも実行する必要があります。

- task: NuGetAuthenticate@1

NuGet フィードに別のホストを使用している場合は、NuGet を認証する方法に関するドキュメントをお読みください。

資産キャッシュとバイナリ キャッシュの機能に関するドキュメントを参照して、これらのすべてが機能する方法の詳細について説明します。

レジストリのポートをテストするパイプラインを設定する

CI 環境のバイナリ キャッシュとアセット キャッシュを設定したら、次の手順として、レジストリのすべてのポートをテストするパイプラインを設定します。 このパイプラインをスケジュールに従って実行するか、新しいコミットまたはプル要求によってトリガーするかを決定できます。

メイン vcpkg レジストリは、vcpkg プロジェクトのニーズに合わせて調整されたコマンドを使用vcpkg ciします。これは、vcpkg プロジェクトのニーズに合わせて調整されておりメイン安定しているか、vcpkg のコンシューマーによって使用されることを意図していません。 そのため、独自の vcpkg レジストリのテストには適していません。 代わりに、この記事で説明されている手順に従うことをお勧めします。

マニフェスト ファイルを使用してすべてのポートを含める

コマンドを vcpkg ci 使用する代わりに、マニフェスト ファイルを使用して、レジストリ内のすべてのパッケージに依存するビルドを作成することをお勧めします。

次の例では、仮想 vcpkg レジストリ内のすべてのポートをテストするマニフェスト ファイルを作成します。 依存関係の一覧を置き換えて、レジストリ内のすべてのポートを含め、リポジトリのルートに配置します。

vcpkg.json

{
  "dependencies": [
    "beicode",
    "beison"
  ]
}

独自のポートは、メイン vcpkg レジストリまたはその他のサード パーティのレジストリに依存している可能性があります。その場合は、それらのレジストリをファイルにvcpkg-configuration.json追加する必要があります。 vcpkg は追加の構成なしで メイン レジストリからパッケージを解決できますが、バージョン管理のためにレジストリ リストに明示的に追加することを強くお勧めします。 これにより、基になるポート バージョンのセットを制御できます。 レジストリの vcpkg x-update-baseline ベースラインの管理に役立つコマンド を確認してください。

vcpkg-configuration.json

{
  "default-registry": null,
  "registries": [
    {
      "kind": "git",
      "repository": "https://github.com/Microsoft/vcpkg",
      "baseline": "42bb0d9e8d4cf33485afb9ee2229150f79f61a1f",
      "packages": "*"
    }
  ]
}

詳細については、 vcpkg.json 記事と vcpkg-configuration.json リファレンス記事を参照してください。 マニフェスト モードの ドキュメント では、これらがどのように連携するかを学習します。

Azure DevOps パイプラインで vcpkg を取得する

プロジェクトのサブモジュールとして vcpkg を使用する場合は、次に示すように、手順で vcpkg リポジトリを取得して、独自のプロジェクトをチェックできます。

steps:
- checkout: self
  submodules: true

それ以外の場合は、vcpkg を取得してパイプラインで使用する必要があります。 vcpkg リポジトリを複製するには、次の手順を追加します。

resources:
  repositories:
    - repository: vcpkgRepo
      type: github
      name: Microsoft/vcpkg
      endpoint: MyGitHubServiceConnection

steps:
  - checkout: vcpkgRepo

vcpkg リポジトリを複製するには、パイプラインのリポジトリ リソースを定義する必要があります。 次のスニペットは、vcpkg リポジトリをリソースとして追加する方法を示しています。パイプラインを GitHub に接続するには、サービス接続を設定する必要があります。

サブモジュールとして、または GitHub から複製して vcpkg リポジトリをチェックした後、vcpkg のブートストラップ スクリプトを実行する必要があります。

steps:
  - script: vcpkg/bootstrap-vcpkg.sh

これらの手順が完了したら、vcpkg 実行可能ファイルを使用する必要があります。

vcpkg インストールを実行してポートをビルドする

最後の手順では、すべてのポートをビルドするように vcpkg に指示します。 上記の 2 つの手順で、独自のレジストリが作成されていないことに vcpkg-configuration.json 気付いたかもしれません。 その理由は、リポジトリで公開されているバージョンではなく、現在作業ディレクトリにあるポートのバージョンをテストするためです。

そのためには、環境変数をレジストリのディレクトリに設定VCPKG_OVERLAY_PORTSして、レジストリのポートをオーバーレイ ポートとして追加する必要がありますports

次のスニペットは、レジストリのポートをオーバーレイ ポートとして設定し、マニフェスト モードで実行 vcpkg install してすべてのカスタム ポートをインストールする方法を示しています。

steps:
- script: $(Build.Repository.LocalPath)/vcpkg/vcpkg install
  env:
    X_VCPKG_ASSET_SOURCES: "clear;x-azurl,https://my.domain.com/container,$(VcpkgAssetCache),readwrite"
    VCPKG_BINARY_SOURCES: "clear;nuget,https://my.domain.com/demoBinaries/nuget/v3/index.json,readwrite"
    VCPKG_OVERLAY_PORTS: "$(Build.Repository.LocalPath)/ports"

この例では、ファイルがレジストリのリポジトリのルートに作成され、vcpkg リポジトリがサブモジュールとして追加されることを前提としています vcpkg.json

パイプラインの YAML ファイルをすべてまとめると、次のようになります。

.azure-pipelines/test-ports.yml

trigger:
- main

pool:
  vmImage: windows-latest

steps:
- checkout: self
  submodules: true

- task: NuGetAuthenticate@1

- script: $(Build.Repository.LocalPath)/vcpkg/bootstrap-vcpkg.bat
  displayName: Bootstrap vcpkg

- script: $(Build.Repository.LocalPath)/vcpkg/vcpkg install --triplet=x64-windows
  env:
    X_VCPKG_ASSET_SOURCES: "clear;x-azurl,https://my.domain.com/container,$(VcpkgAssetCache),readwrite"
    VCPKG_BINARY_SOURCES: "clear;nuget,https://my.domain.com/demoBinaries/nuget/v3/index.json,readwrite"
    VCPKG_OVERLAY_PORTS: "$(Build.Repository.LocalPath)/ports"

これは、レジストリのポートをテストするための CI パイプラインの基本的な構造です。 プライベート リポジトリまたは NuGet フィードに対する認証には、追加の作業が必要になる場合があります。

また、ファイルの vcpkg.json 生成を自動化する手順や、レジストリに新しく追加されたポートがテストから除外されていないことを確認する手順を追加することもできます。

次のステップ

次の記事は、CI 環境を設定するときに役立つ場合があります。