다음을 통해 공유


NuGet 패키지 캐시

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

파이프라인 캐싱은 향후 실행에서 다시 사용할 종속성을 저장하여 빌드 시간을 줄이는 데 도움이 됩니다. 이 문서에서는 캐시 작업 사용하여 NuGet 패키지를 캐시하고 복원하는 방법을 알아봅니다.

참고

클래식 릴리스 파이프라인에서는 파이프라인 캐싱이 지원되지 않습니다.

필수 조건

제품 요구 사항
Azure DevOps - Azure DevOps 프로젝트.
- 권한:
    - 프로젝트의 모든 파이프라인에 대한 액세스 권한을 부여하려면 Project Administrators 그룹구성원이어야 합니다.

의존성 잠금

캐시 작업을 설정하기 전에 프로젝트의 종속성을 잠그고 package.lock.json 파일을 생성해야 합니다. 고유 캐시 키는 빌드 간에 일관성을 보장하기 위해 이 잠금 파일의 콘텐츠 해시에서 파생됩니다.

프로젝트의 종속성을 잠그려면 RestorePackagesWithLockFile 속성을 csproj 파일에 추가하고 true 설정합니다. nuget restore실행하면 프로젝트의 루트 디렉터리에 packages.lock.json 파일이 생성됩니다. packages.lock.json 파일을 소스 코드 저장소에 꼭 체크인하십시오.

<PropertyGroup>
  <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>

NuGet 패키지 캐시

NuGet 패키지를 캐시하려면 파이프라인을 실행하는 에이전트에서 패키지의 위치를 가리키는 파이프라인 변수를 정의합니다.

아래 예제에서는 동적 캐시 키를 생성하기 위해 packages.lock.json 내용이 해시됩니다. 이렇게 하면 파일이 변경 될 때마다 새 캐시 키가 만들어집니다.

Azure Pipelines에서 캐시 키가 생성되는 방법을 표시하는 스크린샷입니다.

variables:
  NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages

- task: Cache@2
  displayName: Cache v2 task 
  inputs:
    key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
    restoreKeys: |
       nuget | "$(Agent.OS)"
       nuget
    path: '$(NUGET_PACKAGES)'
    cacheHitVar: 'CACHE_RESTORED'

참고

캐시는 변경할 수 없으며 캐시가 만들어지면 해당 콘텐츠를 수정할 수 없습니다.

캐시 복원

다음 작업은 CACHE_RESTORED 변수가 false 경우에만 실행됩니다. 즉, 캐시 적중이 발생하는 경우(패키지가 캐시에서 이미 사용 가능) 복원 단계를 건너뛰어 시간과 리소스를 절약합니다. 캐시가 없으면 복원 명령이 실행되어 필요한 종속성을 다운로드합니다.

- task: NuGetCommand@2
  condition: ne(variables.CACHE_RESTORED, true)
  inputs:
    command: 'restore'
    restoreSolution: '**/*.sln'

참고

Ubuntu 24.04 이상을 사용하는 경우 NuGetAuthenticate 작업 대신 .NET CLI와 함께 NuGetCommand@2 작업을 사용해야 합니다. 자세한 내용은 최신 Ubuntu 호스팅 이미지 지원을 참조하세요.

"project.assets.json 찾을 수 없음" 오류 처리

빌드 작업 중에 오류 "project.assets.json 찾을 수 없음"가 발생하면, 복원 작업에서 조건 condition: ne(variables.CACHE_RESTORED, true)을 제거하십시오. 이렇게 하면 복원 명령이 실행되고 project.assets.json 파일이 생성됩니다. 복원 작업은 해당 폴더에 이미 있는 패키지를 다시 다운로드하지 않습니다.

참고

파이프라인에는 여러 캐싱 작업이 포함될 수 있으며 동일한 파이프라인 내의 작업 및 태스크는 동일한 캐시에 액세스하고 공유할 수 있습니다.

성능 비교

파이프라인 캐싱은 종속성을 복원하는 데 필요한 시간을 크게 줄여 빌드 속도가 빨라집니다. 다음 비교에서는 두 개의 서로 다른 파이프라인에 대한 파이프라인 실행 시간에 캐싱이 미치는 영향을 보여 줍니다.

  • 캐싱하지 않고(오른쪽): 복원 작업에 약 41초가 걸렸습니다.

  • 캐싱(왼쪽)사용: 캐싱 태스크를 두 번째 파이프라인에 추가하고 캐시 누락이 발생할 때만 실행되도록 복원 작업을 구성했습니다. 이 경우 복원 작업은 8초 만에 완료되었습니다.

캐싱을 사용 및 사용하지 않고 파이프라인 성능을 표시하는 스크린샷

다음은 참조할 전체 YAML 파이프라인입니다.

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'
  NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages

steps:
- task: NuGetToolInstaller@1
  displayName: 'NuGet tool installer'

- task: Cache@2
  displayName: 'NuGet Cache'
  inputs:
    key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
    restoreKeys: |
       nuget | "$(Agent.OS)"
       nuget
    path: '$(NUGET_PACKAGES)'
    cacheHitVar: 'CACHE_RESTORED'

- task: NuGetCommand@2
  displayName: 'NuGet restore'
  condition: ne(variables.CACHE_RESTORED, true)
  inputs:
    command: 'restore'
    restoreSolution: '$(solution)'

- task: VSBuild@1
  displayName: 'Visual Studio Build'
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'

이 방법은 프로젝트에서 packages.lock.json 사용하여 패키지 버전을 잠그는 경우 .NET Core 프로젝트에도 적용됩니다. *Csproj* 파일에서 RestorePackagesWithLockFileTrue으로 설정하거나, dotnet restore --use-lock-file명령을 실행하여 사용하도록 설정할 수 있습니다.