다음을 통해 공유


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 개의 매개 변수가 쉼표(,)로 구분됩니다.

  • 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 피드를 사용하여 이진 캐시에 대한 NuGet 백 엔드를 사용할 수 있습니다 https://my.domain.com/vcpkgBinaryCache/nuget/v3/index.json. NuGet 피드에 인증하려면 몇 가지 추가 단계가 필요할 수 있습니다. ADO를 사용하여 NuGet 인증을 설정하는 지침은 자습서를 참조하세요.

다음 작업은 Azure Artifacts NuGet 피드에 인증하기 위해 파이프라인에 있는 그대로 추가되어야 합니다. 이 작업은 vcpkg와 관련된 모든 작업 전에도 실행되어야 합니다.

- task: NuGetAuthenticate@1

NuGet 피드에 다른 호스트를 사용하는 경우 NuGet을 인증하는 방법에 대한 설명서를 읽어보세요.

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

레지스트리의 포트를 테스트하는 파이프라인 설정

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 참조하세요. 그리고 매니페스트 모드 설명서에서는 이러한 작업이 어떻게 함께 작동하는지 알아봅니다.

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에 연결하려면 서비스 커넥트ion을 설정해야 합니다.

vcpkg 리포지토리를 하위 모듈로 검사 또는 GitHub에서 복제한 후 vcpkg의 부트스트랩 스크립트를 실행해야 합니다.

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

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

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

마지막 단계는 vcpkg에 모든 포트를 빌드하도록 지시하는 것입니다. 위에서 만든 몇 가지 단계에서 사용자 고유의 레지스트리가 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 환경을 설정할 때 유용할 수 있습니다.