チュートリアル: GitHub Actions ワークフローで GitHub Packages を使用して vcpkg バイナリ キャッシュを設定する

注

このチュートリアルでは、GitHub パッケージでホストされている NuGet フィードを使用しますが、他の NuGet フィード プロバイダー (Azure Artifacts など) でも同じ手順を最小限の変更で使用できます。

GitHub Packages には、vcpkg によって生成された NuGet バイナリ パッケージ用の便利なリポジトリが用意されています。 このチュートリアルでは、GitHub Packages をリモート ストレージとして使用する GitHub Actions ワークフローでバイナリ キャッシュを設定する方法について説明します。

このチュートリアルで学習する内容は次のとおりです。

前提条件

  • コード エディター
  • GitHub Actions を使用した GitHub リポジトリ
  • vcpkg を使用するプロジェクト

1 - GitHub パッケージの認証を構成する

このチュートリアルでは、GitHub Actions によって提供される組み込みの GITHUB_TOKEN を使用します。 GitHub Packages への読み取りと書き込みの両方のアクセスを有効にするには、次の permissions ブロックをワークフローに追加します。

permissions:
  packages: write

これにより、 GITHUB_TOKEN に必要な packages:write と packages:read のアクセス許可が付与されます。 GITHUB_TOKENの使用には、いくつかの利点があります。

  • 追加のシークレットを作成または管理する必要はありません
  • フォークからのプル要求に対して自動的に機能します (読み取り専用アクセスを使用)
  • 特定のリポジトリとワークフロー実行のスコープ

注

または、クロスリポジトリ アクセスまたはその他の高度なシナリオが必要な場合は、従来の個人用アクセス トークン (PAT) を使用することもできます。 GitHub の指示に従って、とpackages:writeのアクセス許可を持つpackages:readし、それをリポジトリにシークレットとして追加し、次の例で${{ secrets.YOUR_PAT_NAME }}の代わりに${{ secrets.GITHUB_TOKEN }}を使用します。

2 - Bootstrap vcpkg

vcpkg は、バイナリ キャッシュ操作中に使用する nuget.exe 実行可能ファイルの独自のコピーを取得します。 このチュートリアルでは、vcpkg で取得した nuget.exeを使用します。

ワークフローで vcpkg をブートストラップするステップを追加します。

- name: Bootstrap vcpkg
  shell: pwsh
  run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.bat
- name: Bootstrap vcpkg
  shell: bash
  run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.sh

vcpkg ブートストラップ スクリプトの場所をワークフローに適した場所に置き換える必要がある場合があります。このチュートリアルでは、vcpkg がリポジトリのルートにある vcpkg フォルダーにあることを前提としています。

3 - 必要な環境変数を設定する

ワークフロー ファイルに次の環境変数を追加します ( <OWNER> を GitHub のユーザー名または組織の名前に置き換えます)。

env: 
  USERNAME: <OWNER>
  VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg
  FEED_URL: https://nuget.pkg.github.com/<OWNER>/index.json
  VCPKG_BINARY_SOURCES: "clear;nuget,https://nuget.pkg.github.com/<OWNER>/index.json,readwrite"

VCPKG_EXEの値を、bootstrap vcpkg ステップで生成された vcpkg 実行可能ファイルの場所に置き換える必要がある場合があります。

この手順では、gitHub Packages フィードをバイナリ キャッシュ ソースとして使用するように VCPKG_BINARY_SOURCES を構成します。詳細については、 binary キャッシュリファレンス を参照してください。

4 - GitHub パッケージを NuGet ソースとして追加する

vcpkg fetch nuget コマンドは、vcpkg で取得したnuget.exeの場所を出力し、必要に応じて実行可能ファイルをダウンロードします。

次の手順をワークフロー ファイルに追加して、 GITHUB_TOKENで NuGet ソースを構成します。

permissions:
  packages: write

jobs:
  build:
    runs-on: windows-latest
    steps:
    # ... other steps ...
    - name: Add NuGet sources
      shell: pwsh
      run: |
        .$(${{ env.VCPKG_EXE }} fetch nuget) `
          sources add `
          -Source "${{ env.FEED_URL }}" `
          -StorePasswordInClearText `
          -Name GitHubPackages `
          -UserName "${{ env.USERNAME }}" `
          -Password "${{ secrets.GITHUB_TOKEN }}"
        .$(${{ env.VCPKG_EXE }} fetch nuget) `
          setapikey "${{ secrets.GITHUB_TOKEN }}" `
          -Source "${{ env.FEED_URL }}"

Linux では、monoを実行するnuget.exeが必要です。 ディストリビューションのシステム パッケージ マネージャーを使用して、 mono をインストールできます。

apt install mono-complete

ubuntu-22.04 GitHub Actions ランナーにはmonoがプレインストールされていますが、ubuntu-24.04 (現在ubuntu-latest指している) 以降では、monoプレインストールは行われません。

permissions:
  packages: write

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # ... other steps ...
    - name: Add NuGet sources
      shell: bash
      env: 
        VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg
        USERNAME: <OWNER>
        FEED_URL: https://nuget.pkg.github.com/<OWNER>/index.json
      run: |
        mono `${{ env.VCPKG_EXE }} fetch nuget | tail -n 1` \
          sources add \
          -Source "${{ env.FEED_URL }}" \
          -StorePasswordInClearText \
          -Name GitHubPackages \
          -UserName "${{ env.USERNAME }}" \
          -Password "${{ secrets.GITHUB_TOKEN }}"
        mono `${{ env.VCPKG_EXE }} fetch nuget | tail -n 1` \
          setapikey "${{ secrets.GITHUB_TOKEN }}" \
          -Source "${{ env.FEED_URL }}"

注

GitHub Actions によって提供される既定の GITHUB_TOKEN には、キャッシュされたパッケージをアップロードまたはダウンロードするために必要なアクセス許可 がありません 。
GitHub パッケージへのパッケージ キャッシュを有効にするには、代わりに 個人用アクセス トークン (PAT) を使用し、次のスコープが含まれていることを確認します。

  • packages:read
  • packages:write

PAT をリポジトリ シークレット ( VCPKG_PAT_TOKEN など) として格納し、ワークフローで参照します。

-Password: "${{ secrets.VCPKG_PAT_TOKEN }}"
-Source: "${{ env.FEED_URL }}"

以上で作業は終了です。 vcpkg は、GitHub Actions ワークフロー内の GitHub Packages でホストされている NuGet フィードからパッケージをアップロードまたは復元するようになりました。

次のステップ

次に試すその他のタスクを次に示します。