Compartilhar via


Tutorial: Configurar um cache binário vcpkg usando GitHub Packages em um fluxo de trabalho do GitHub Actions

Observação

Este tutorial usa feeds NuGet hospedados em GitHub Packages, mas as mesmas instruções podem ser usadas para outros provedores de feed NuGet, por exemplo: Azure Artifacts, com alterações mínimas.

GitHub Packages oferece um repositório conveniente para seus pacotes binários NuGet produzidos pelo vcpkg. Neste tutorial, mostramos como configurar um cache binário no fluxo de trabalho do GitHub Actions que usa o GitHub Packages como armazenamento remoto.

Neste tutorial, você aprenderá como:

Pré-requisitos

  • Um editor de código
  • Um repositório do GitHub usando o GitHub Actions
  • Um projeto usando vcpkg

1 – Configurar a autenticação para pacotes do GitHub

Este tutorial usa o interno GITHUB_TOKEN fornecido pelo GitHub Actions. Para habilitar o acesso de leitura e gravação aos Pacotes do GitHub, adicione o seguinte permissions bloco ao fluxo de trabalho:

permissions:
  packages: write

Isso concede as GITHUB_TOKEN permissões necessárias packages:writepackages:read. O uso GITHUB_TOKEN tem várias vantagens:

  • Não é necessário criar ou gerenciar segredos adicionais
  • Funciona automaticamente para solicitações de pull de bifurcações (com acesso somente leitura)
  • Escopo para o repositório específico e a execução do fluxo de trabalho

Observação

Como alternativa, você pode usar um PAT (Token de Acesso Pessoal) clássico se precisar de acesso entre repositórios ou outros cenários avançados. Siga as instruções do GitHub para gerar um PAT (Token de Acesso Pessoal) clássico com packages:write permissões e packages:read , em seguida, adicione-o como um segredo em seu repositório e use ${{ secrets.YOUR_PAT_NAME }} em vez de ${{ secrets.GITHUB_TOKEN }} nos exemplos abaixo.

2 - Bootstrap vcpkg

O vcpkg adquire sua própria cópia do executável que ele usa durante as nuget.exe operações de cache binário. Este tutorial usa o arquivo .nuget.exe

Adicione uma etapa para inicializar vcpkg em seu fluxo de trabalho:

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

Pode ser necessário substituir o local do script de bootstrap vcpkg pelo correto para o seu fluxo de trabalho, este tutorial pressupõe que o vcpkg esteja localizado em uma vcpkg pasta na raiz do repositório.

3 - Configure as variáveis de ambiente necessárias

Adicione as seguintes variáveis de ambiente ao seu arquivo de fluxo de trabalho (substitua <OWNER> pelo nome de usuário do GitHub ou pelo nome da organização):

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"

Pode ser necessário substituir o valor de VCPKG_EXE pelo local do executável vcpkg gerado na etapa bootstrap vcpkg .

Nesta etapa, você está configurando VCPKG_BINARY_SOURCES para usar seu feed do GitHub Packages como uma fonte de cache binário, leia a referência de cache binário para saber mais.

4 – Adicionar GitHub Packages como uma fonte NuGet

O vcpkg fetch nuget comando gera a localização do vcpkg-acquired nuget.exe, baixando o executável, se necessário.

Adicione a seguinte etapa ao arquivo de fluxo de trabalho para configurar a origem do NuGet com seu 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 }}"

No Linux, você precisa mono executar nuget.exeo . Você pode instalar mono usando o gerenciador de pacotes do sistema da distribuição:

apt install mono-complete

Observe que ubuntu-22.04 os executores do GitHub Actions vêm com mono pré-instalado, mas começando com ubuntu-24.04 (que ubuntu-latest atualmente aponta para), mono não vem mais pré-instalado.

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

Observação

O padrão GITHUB_TOKEN fornecido pelo GitHub Actions não tem as permissões necessárias para carregar ou baixar pacotes armazenados em cache.
Para habilitar o armazenamento em cache de pacotes no GitHub Packages, use um Token de Acesso Pessoal (PAT) e verifique se ele inclui os seguintes escopos:

  • packages:read
  • packages:write

Armazene o PAT como um segredo do repositório (por exemplo VCPKG_PAT_TOKEN) e faça referência a ele em seu fluxo de trabalho:

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

Pronto! O vcpkg agora carregará ou restaurará pacotes do feed do NuGet hospedado no GitHub Packages dentro do fluxo de trabalho do GitHub Actions.

Próximas etapas

Aqui estão outras tarefas para tentar a seguir: