다음을 통해 공유


GitHub Actions에서 vcpkg를 사용하여 사용자 지정 레지스트리 포트 테스트

vcpkg 포트의 사용자 지정 레지스트리를 설정한 후에는 Continous Integration을 추가하여 모든 종속성을 성공적으로 빌드할 수 있는지 확인할 수 있습니다.

Microsoft/vcpkg의 기본 vcpkg 레지스트리는 Azure DevOps와 CI(연속 통합)를 사용하여 vcpkg 팀에서 테스트합니다. 이렇게 하면 새 패키지를 추가하거나 기존 패키지를 업데이트해도 소비자가 중단되지 않습니다.

이 문서에서는 사용자 고유의 레지스트리에서 vcpkg 포트를 테스트하도록 CI 환경을 설정하는 방법을 보여 줍니다.

이 문서에서는 다음에 대해 알아봅니다.

  • GitHub Actions 워크플로에 대한 이진 캐시 및 자산 캐시 설정
  • 레지스트리의 포트를 테스트하는 워크플로 설정

필수 조건

GitHub Actions 워크플로에 대한 이진 캐시 및 자산 캐시 설정

포트의 큰 컬렉션을 구축하는 것은 시간과 컴퓨팅 능력 측면에서 모두 비용이 많이 드는 작업입니다. 포트에 CI를 사용하기 전에 GitHub Action 워크플로에 대한 이진 캐시 및 자산 캐시를 설정하는 데 투자하는 것이 좋습니다.

이진 캐시는 수정되지 않은 패키지가 모든 CI 실행에서 다시 빌드되지 않도록 하여 CI 시나리오에 가장 큰 이점을 제공합니다. 자산 캐시는 실행 중에 패키지에 대해 다운로드된 아티팩트를 미러 이후 실행에서 캐시된 아티팩트를 사용합니다. 또한 업스트림 리포지토리가 신뢰할 수 없는 문제(예: 다운로드 URL 손상)를 완화하는 데 도움이 될 수 있습니다.

이러한 캐시 를 설정하는 방법에 대한 자세한 지침은 이진 캐싱자산 캐싱 문서를 참조하세요.

예: GitHub Actions 워크플로에서 자산 및 이진 캐싱 사용

steps:
  - name: Enable GitHub Actions Cache backend
    uses: actions/github-script@v7
    with:
      script: |
        core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
        core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');

  - name: some vcpkg task
    run: "${{ github.workspace }}/vcpkg/vcpkg install"
    env: 
      X_VCPKG_ASSET_SOURCES: "clear;x-azurl,https://my.domain.com/container,{{ secrets.SAS }},readwrite"
      VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"

이 예제에서는 GitHub Actions 워크플로에서 이진 캐시 및 자산 캐시를 설정하는 방법을 보여 줍니다. 이 코드 조각은 사용자 고유의 워크플로의 YAML 파일에서 사용하도록 조정해야 합니다.

이 코드 조각을 세분화합니다.

X_VCPKG_ASSET_SOURCES 는 vcpkg에서 자산 캐시를 구성하는 데 사용되는 환경 변수입니다. 이 예제에서는 .로 설정됩니다 x-azurl,https://my.domain.com/container,{{secrets.SAS}},readwrite. 백 엔드는 x-azurl 스토리지 공급자로 Azure Storage 컨테이너를 사용하도록 vcpkg에 지시합니다. 뒤에 세 x-azurl 개의 매개 변수가 쉼표(,)로 구분됩니다.

  • https://my.domain.com/container 는 스토리지 컨테이너 URL입니다.
  • {{secrets.SAS}} 는 스토리지 컨테이너에 인증할 SAS 토큰을 포함하는 GitHub Actions 비밀 변수입니다.
  • readwrite 는 자산 캐시에 대한 읽기 및 쓰기 권한을 설정합니다. 즉, 이 자산 캐시는 아티팩트 저장 및 아티팩트 복원에 사용됩니다.

VCPKG_BINARY_SOURCES 는 vcpkg에서 이진 캐시를 구성하는 데 사용되는 환경 변수입니다. 이 예제에서는 .로 설정됩니다 clear;x-gha,readwrite. 이렇게 하면 이진 캐시에 대한 GitHub Actions 캐시 백 엔드가 활성화됩니다. 이 백 엔드를 성공적으로 사용하려면 워크플로에 추가 단계가 필요합니다.

다음 단계는 GitHub 작업 워크플로 단계에 있는 그대로 포함되어야 합니다. 이 단계에서는 백 엔드가 x-gha 작동하는 데 필요한 두 개의 환경 변수를 내보내며 vcpkg를 포함하는 작업 전에 실행해야 합니다.

- name: Enable GitHub Actions Cache backend
  uses: actions/github-script@v7
  with:
  script: |
    core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
    core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');

자산 캐시 및 이진 캐시 기능에 대한 설명서를 참조하여 이러한 모든 작업이 어떻게 작동하는지 자세히 알아봅니다.

레지스트리의 포트를 테스트하는 워크플로 설정

CI 환경에 대한 이진 캐시 및 자산 캐시를 설정한 후 다음 단계는 모든 레지스트리의 포트를 테스트하는 워크플로를 설정하는 것입니다. 이 워크플로가 일정에 따라 실행되는지 또는 새 커밋 또는 끌어오기 요청에 의해 트리거되는지 여부를 결정할 수 있습니다.

기본 vcpkg 레지스트리는 vcpkg 프로젝트의 요구에 맞게 조정된 명령을 사용 vcpkg ci 하며기본 안정적이거나 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 참조하세요. 그리고 매니페스트 모드 설명서에서는 이러한 작업이 어떻게 함께 작동하는지 알아봅니다.

GitHub Actions 워크플로에서 vcpkg 획득

다음으로, 워크플로에서 사용하기 위해 vcpkg를 획득해야 합니다. vcpkg를 설치하려면 다음 단계를 추가합니다.

steps:
- uses: actions/checkout@v4
  with:
    repository: "https://github.com/Microsoft/vcpkg"
    path: "vcpkg"

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

이러한 단계가 완료되면 사용할 vcpkg 실행 파일이 있어야 합니다.

vcpkg 설치를 실행하여 포트 빌드

마지막 단계는 vcpkg에 모든 포트를 빌드하도록 지시하는 것입니다. 위에서 만든 몇 가지 단계에서 사용자 고유의 레지스트리가 vcpkg-configuration.json 없는 것을 확인할 수 있습니다. 그 이유는 리포지토리에 게시된 버전과 달리 현재 작업 디렉터리에 있는 포트의 버전을 테스트하려고 하기 때문입니다.

이 목표를 위해 환경 변수를 레지스트리의 디렉터리로 설정 VCPKG_OVERLAY_PORTS 하여 레지스트리의 ports 포트를 오버레이 포트추가해야 합니다.

아래 코드 조각에서는 레지스트리의 포트를 오버레이 포트로 설정하고 매니페스트 모드에서 실행 vcpkg install 하여 모든 사용자 지정 포트를 설치하는 방법을 보여 줍니다.

  - name: some vcpkg task
    run: "${{ github.workspace }}/vcpkg/vcpkg install"
    env: 
      X_VCPKG_ASSET_SOURCES: "clear;x-azurl,https://my.domain.com/container,{{ secrets.SAS }},readwrite"
      VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
      VCPKG_OVERLAY_PORTS: "${{ github.workspace }}/ports"

이 예제에서는 파일이 레지스트리 리포지토리의 루트에 생성된다고 가정 vcpkg.json 합니다.

워크플로의 YAML 파일을 모두 함께 배치하는 것은 다음과 유사합니다.

.github/workflows/test-ports.yml

name: Test vcpkg ports

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    
    - name: Acquire vcpkg
      uses: actions/checkout@v4
      with:
        repository: "Microsoft/vcpkg"
        path: vcpkg

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

    - name: Enable GitHub Actions Cache backend
      uses: actions/github-script@v7
      with:
        script: |
          core.exportVariable('ACTIONS_CACHE_URL', process.env.ACTIONS_CACHE_URL || '');
          core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env.ACTIONS_RUNTIME_TOKEN || '');

    - name: Build ports
      run: ${{ github.workspace }}/vcpkg/vcpkg install
      env:
        X_VCPKG_ASSET_SOURCES: "clear;x-azurl,https://your.domain.com/container,${{ secrets.SAS }},readwrite"
        VCPKG_BINARY_SOURCES: "clear;x-gha,readwrite"
        VCPKG_OVERLAY_PORTS: "${{ github.workspace }}/ports"
      shell: bash

이는 레지스트리의 포트를 테스트하기 위한 CI 워크플로의 기본 구조입니다. 프라이빗 리포지토리 또는 NuGet 피드에 인증하려면 몇 가지 추가 작업이 필요할 수 있습니다.

파일 생성 vcpkg.json 을 자동화하는 단계나 레지스트리에 새로 추가된 포트가 테스트에서 제외되지 않도록 확인하는 단계를 추가할 수도 있습니다.

다음 단계

다음 문서는 CI 환경을 설정할 때 유용할 수 있습니다.