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 내용이 해시됩니다. 이렇게 하면 파일이 변경 될 때마다 새 캐시 키가 만들어집니다.
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* 파일에서 RestorePackagesWithLockFile을 True으로 설정하거나, dotnet restore --use-lock-file명령을 실행하여 사용하도록 설정할 수 있습니다.