Поделиться через


Руководство. Настройка двоичного кэша vcpkg с помощью пакетов GitHub в рабочем процессе GitHub Actions

Примечание.

В этом руководстве используются веб-каналы NuGet, размещенные в пакетах GitHub, но те же инструкции можно использовать для других поставщиков веб-каналов NuGet, например: Артефакты Azure с минимальными изменениями.

Пакеты GitHub предлагают удобный репозиторий для двоичных пакетов NuGet, созданных vcpkg. В этом руководстве показано, как настроить двоичный кэш в рабочем процессе GitHub Actions, использующего пакеты GitHub в качестве удаленного хранилища.

Из этого руководства вы узнаете, как выполнять следующие задачи:

Необходимые компоненты

  • Редактор кода
  • Репозиторий GitHub с помощью GitHub Actions
  • Проект с помощью vcpkg

1. Настройка проверки подлинности для пакетов GitHub

В этом руководстве используется встроенный инструмент GITHUB_TOKEN, предоставленный GitHub Actions. Чтобы включить доступ для чтения и записи к пакетам GitHub, добавьте следующий permissions блок в рабочий процесс:

permissions:
  packages: write

Это предоставляет необходимые разрешения GITHUB_TOKEN, packages:write и packages:read. Использование GITHUB_TOKEN имеет несколько преимуществ:

  • Нет необходимости создавать или управлять дополнительными секретами
  • Работает автоматически для запросов на вытягивание из вилок (с доступом только для чтения)
  • Область применения к определенному репозиторию и запуску рабочего процесса

Примечание.

Кроме того, вы можете использовать классический личный маркер доступа (PAT), если вам нужен доступ между репозиториями или другие расширенные сценарии. Следуйте инструкциям GitHub, чтобы создать классический личный маркер доступа (PAT) с разрешениями packages:write и packages:read, затем добавьте его в качестве секрета в ваш репозиторий и используйте ${{ secrets.YOUR_PAT_NAME }} вместо ${{ secrets.GITHUB_TOKEN }} в приведенных ниже примерах.

2 — bootstrap vcpkg

vcpkg получает собственную копию исполняемого nuget.exe файла, который он использует во время двоичных операций кэширования. В этом руководстве используется nuget.exeприобретенный vcpkg.

Добавьте шаг для загрузки 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 расположения исполняемого файла vcpkg, созданного на шаге начальной загрузки vcpkg .

На этом шаге вы настраиваете VCPKG_BINARY_SOURCES использование веб-канала пакетов GitHub в качестве источника двоичного кэширования, ознакомьтесь со ссылкой на двоичное кэширование, чтобы узнать больше.

4. Добавление пакетов GitHub в качестве источника NuGet

Команда vcpkg fetch nuget выводит расположение приобретенного nuget.exevcpkg, скачивая исполняемый файл при необходимости.

Добавьте следующий шаг в файл рабочего процесса, чтобы настроить источник NuGet с помощью GITHUB_TOKEN:

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 runners поставляются с предустановленными компонентами, но начиная с mono (к которому ubuntu-24.04 в настоящее время относится), ubuntu-latest больше не включен в предустановку.

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_TOKEN , предоставленному GitHub Actions, нет необходимых разрешений для отправки или скачивания кэшированных пакетов.
Чтобы включить кэширование пакетов в пакеты GitHub, используйте вместо этого личный маркер доступа (PAT) и убедитесь, что он включает следующие области:

  • packages:read
  • packages:write

Сохраните PAT в качестве секрета репозитория (например, VCPKG_PAT_TOKEN) и ссылайтесь на него в рабочем процессе.

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

Вот и все! vcpkg теперь будет отправлять или восстанавливать пакеты из веб-канала NuGet, размещенного в пакетах GitHub в рабочем процессе GitHub Actions.

Следующие шаги

Ниже приведены другие задачи, которые необходимо выполнить следующим образом: