Azure DevOps Services
파이프라인 캐싱은 이전 실행에서 다운로드한 종속성을 재사용하여 동일한 파일을 다시 만들거나 다시 다운로드할 필요가 없도록 하여 빌드 시간을 줄일 수 있습니다. 이는 각 실행이 시작될 때 동일한 종속성이 반복적으로 다운로드되는 시나리오에서 특히 유용합니다. 이 프로세스는 종종 수백 또는 수천 개의 네트워크 호출을 포함하는 시간이 많이 소요되는 프로세스입니다.
캐시를 복원하고 저장하는 데 필요한 시간이 파일을 다시 생성하는 데 걸리는 시간보다 작은 경우 캐싱이 가장 효과적입니다. 그러나 경우에 따라 캐싱은 성능 이점을 제공하지 않을 수 있으며 빌드 시간에 부정적인 영향을 줄 수도 있습니다. 특정 시나리오를 평가하여 캐싱이 올바른 접근 방식인지 확인하는 것이 중요합니다.
메모
클래식 릴리스 파이프라인에는 파이프라인 캐싱이 지원되지 않습니다.
파이프라인 아티팩트 및 파이프라인 캐싱을 사용하는 경우
파이프라인 캐싱 및 파이프라인 아티팩트 도 비슷한 기능을 수행하지만 다른 시나리오를 위한 것이며 서로 다른 용도로 사용하면 안 됩니다.
파이프라인 아티팩트 사용: 한 작업에서 생성된 특정 파일을 다른 작업과 공유해야 하는 경우, 그렇지 않으면 해당 작업이 실패할 가능성이 높습니다.
파이프라인 캐싱 사용: 이전 실행에서 파일을 다시 사용하여 빌드 시간을 개선하려는 경우(해당 파일이 없으면 작업의 실행 기능에 영향을 주지 않음)
메모
파이프라인 캐싱 및 파이프라인 아티팩트도 모든 계층(무료 및 유료)에 대해 무료로 사용할 수 있습니다. 자세한 내용은 아티팩트 스토리지 사용을 참조하세요.
셀프 호스팅 에이전트 요구 사항
다음 실행 파일은 환경 변수에 나열된 폴더에 PATH 있어야 합니다. 이러한 요구 사항은 호스트된 에이전트가 필요한 소프트웨어와 함께 미리 설치되어 있으므로 자체 호스팅 에이전트에만 적용됩니다.
| 보관 소프트웨어/플랫폼 |
윈도우즈 |
리눅스 |
맥 |
| GNU 타르 |
필수 |
필수 |
아니요 |
| BSD 타르 |
아니요 |
아니요 |
필수 |
| 7-지퍼 |
권장 |
아니요 |
아니요 |
캐시 작업: 작동 방식
파이프라인에 캐싱을 추가하려면 작업의 섹션에 steps을 추가하세요.
파이프라인을 실행하는 동안 캐시 단계가 발견되면 태스크는 제공된 입력에 따라 캐시를 복원하려고 시도합니다. 캐시를 찾을 수 없으면 단계가 완료되고 작업의 다음 단계가 실행됩니다.
작업의 모든 단계가 성공적으로 실행되면 건너뛰지 않은 각 "캐시 복원" 단계에 대해 특수한 "사후 작업: 캐시" 단계가 자동으로 추가되고 트리거됩니다. 이 단계는 캐시을 저장하는 역할을 합니다.
메모
캐시는 변경할 수 없습니다. 캐시가 만들어지면 해당 콘텐츠를 수정할 수 없습니다.
캐시 작업에는 경로와 키라는 두 가지 필수 인수가 있습니다.
path: 캐시할 폴더의 경로입니다. 절대 경로 또는 상대 경로일 수 있습니다. 상대 경로는 $(System.DefaultWorkingDirectory)을 기준으로 해결됩니다.
팁
미리 정의된 변수를 사용하여 캐시하려는 폴더의 경로를 저장할 수 있습니다. 그러나 와일드카드는 지원되지 않습니다.
키: 복원하거나 저장하려는 캐시의 식별자를 정의합니다. 키는 문자열 값, 파일 경로 또는 파일 패턴의 조합으로 구성되며 각 세그먼트는 문자로 구분됩니다 | .
문자열:
고정 값(예: 캐시 이름 또는 도구 이름) 또는 환경 변수(예: 현재 OS 또는 작업 이름)에서 가져온 값입니다.
파일 경로:
콘텐츠가 해시될 특정 파일의 경로입니다. 작업이 실행되는 시점에 파일이 있어야 합니다. 파일 경로와 유사한 모든 세그먼트는 이와 같이 처리되므로 특히 포함된 세그먼트를 .사용하는 경우 "파일이 존재하지 않음" 오류가 발생할 수 있으므로 주의해야 합니다.
팁
경로와 유사한 문자열 세그먼트가 파일 경로처럼 처리되지 않도록 하려면 큰따옴표로 래핑합니다(예: "my.key" | $(Agent.OS) | key.file
파일 패턴:
하나 이상의 파일과 일치해야 하는 glob 스타일 와일드카드 패턴의 쉼표로 구분된 목록입니다. 예제:
-
**/yarn.lock: 원본 디렉터리 아래의 모든 yarn.lock 파일입니다.
-
*/asset.json, !bin/**: bin 디렉터리에 있는 파일을 제외하고 원본 디렉터리 아래의 디렉터리에 있는 모든 asset.json 파일입니다.
파일 경로 또는 파일 패턴으로 식별되는 파일의 콘텐츠는 동적 캐시 키를 생성하기 위해 해시됩니다. 이 기능은 프로젝트에 캐시되는 내용을 고유하게 식별하는 파일이 있는 경우에 유용합니다. 예를 들어 package-lock.jsonyarn.lockGemfile.lockPipfile.lock 파일은 고유한 종속성 집합을 나타내므로 캐시 키에서 참조되거나 자주 참조됩니다. 상대 파일 경로 또는 패턴은 $(System.DefaultWorkingDirectory)을 기준으로 해석됩니다.
다음 예제에서는 Yarn 패키지를 캐시하는 방법을 보여 줍니다.
variables:
YARN_CACHE_FOLDER: $(Pipeline.Workspace)/s/.yarn
steps:
- task: Cache@2
inputs:
key: '"yarn" | "$(Agent.OS)" | yarn.lock'
restoreKeys: |
"yarn" | "$(Agent.OS)"
"yarn"
path: $(YARN_CACHE_FOLDER)
displayName: Cache Yarn packages
- script: yarn --frozen-lockfile
이 예제에서 캐시 키는 정적 문자열("yarn"), 작업이 실행 중인 OS(캐시가 운영 체제마다 고유하므로) 및 파일의 해시(종속성을 고유하게 식별하는)의 yarn.lock 세 부분으로 구성됩니다.
작업이 추가된 후 첫 번째 실행에서 캐시 단계에서는 이 키로 식별된 캐시가 없기 때문에 "캐시 누락"을 보고합니다. 마지막 단계가 끝나면 $(Pipeline.Workspace)/s/.yarn 파일에서 캐시가 만들어지고 업로드됩니다. 다음 실행 시 캐시 단계에서는 "캐시 적중"을 보고하고 캐시의 내용을 다운로드하고 복원합니다.
사용할 때 checkout: self를, 리포지토리가 $(Pipeline.Workspace)/s에 체크 아웃되고 .yarn 폴더는 리포지토리 자체에 있을 가능성이 큽니다.
메모
Pipeline.Workspace 모든 디렉터리를 만드는 파이프라인을 실행하는 에이전트의 로컬 경로입니다. 이 변수는 Agent.BuildDirectory와 같은 값을 가집니다.
checkout: self을(를) 사용하지 않는 경우, YARN_CACHE_FOLDER의 위치를 가리키도록 리포지토리의 .yarn 변수를 업데이트해야 합니다.
복원 키 사용
restoreKeys 를 사용하면 여러 개의 정확한 키 또는 키 접두사를 쿼리할 수 있습니다. 지정된 key 가 적중하지 않을 때 대체로 사용됩니다. 복원 키는 접두사로 키를 검색하고 가장 최근에 만든 캐시 항목을 반환합니다. 이는 파이프라인이 정확한 일치 항목을 찾을 수 없지만 여전히 부분 캐시 적중을 사용하려는 경우에 유용합니다.
여러 복원 키를 지정하려면 별도의 줄에 나열합니다. 복원 키를 시도하는 순서는 위에서 아래로입니다.
복원 키를 사용하여 Yarn 패키지를 캐시하는 방법의 예는 다음과 같습니다.
variables:
YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn
steps:
- task: Cache@2
inputs:
key: '"yarn" | "$(Agent.OS)" | yarn.lock'
restoreKeys: |
yarn | "$(Agent.OS)"
yarn
path: $(YARN_CACHE_FOLDER)
displayName: Cache Yarn packages
- script: yarn --frozen-lockfile
이 예제에서 캐시 태스크는 먼저 지정된 키를 복원하려고 시도합니다. 캐시에 키가 없으면 첫 번째 복원 키를 yarn | $(Agent.OS)시도합니다. 이 도구는 이 접두사에 정확히 일치하거나 이 접두사로 시작하는 캐시 키를 검색합니다.
파일의 해시가 변경된 경우, yarn.lock 접두사 일치가 발생할 수 있습니다. 예를 들어 캐시에 키 yarn | $(Agent.OS) | old-yarn.lock (현재 old-yarn.lock해시와 다른 해시가 있는 경우yarn.lock)가 포함된 경우 이 복원 키는 부분 캐시 적중을 초래합니다.
첫 번째 복원 키가 일치하지 않으면, 다음 복원 키(yarn)을 사용하여 yarn로 시작하는 모든 캐시 키를 검색합니다. 접두사 일치의 경우 복원 프로세스는 가장 최근에 만든 캐시 항목을 반환합니다.
메모
파이프라인에는 여러 캐싱 작업이 포함될 수 있으며 캐싱에 대한 스토리지 제한이 없습니다. 동일한 파이프라인 내의 작업 및 태스크는 동일한 캐시에 액세스하고 공유할 수 있습니다.
복원 조건 사용
일부 시나리오에서는 캐시가 성공적으로 복원되었는지 여부에 따라 단계를 조건부로 실행할 수 있습니다. 예를 들어 캐시가 복원된 경우 종속성을 설치하는 단계를 건너뛸 수 있습니다. 인수를 사용하여 이 작업을 cacheHitVar 수행할 수 있습니다.
이 입력을 환경 변수의 이름으로 설정하면 캐시 적중이 있을 때, true 복원 키가 부분 캐시 적중을 생성하는 경우 및 inexact 캐시를 찾을 수 없는 경우 변수가 설정 false 됩니다. 그런 다음 단계 조건 또는 스크립트 내에서 이 변수를 참조할 수 있습니다.
캐시가 복원될 때 단계를 건너뛰는 예제 install-deps.sh 는 다음과 같습니다.
steps:
- task: Cache@2
inputs:
key: mykey | mylockfile
restoreKeys: mykey
path: $(Pipeline.Workspace)/mycache
cacheHitVar: CACHE_RESTORED
- script: install-deps.sh
condition: ne(variables.CACHE_RESTORED, 'true')
- script: build.sh
캐시 격리 및 보안
서로 다른 파이프라인과 다른 분기의 캐시 간에 격리를 보장하기 위해 모든 캐시는 범위라는 논리 컨테이너 내에 저장됩니다. 범위는 다음을 보장하는 보안 경계 역할을 합니다.
실행하는 동안 캐시 단계가 발견되면 키로 식별되는 캐시가 서버에서 요청됩니다. 그런 다음 서버는 작업에 표시되는 범위에서 이 키가 있는 캐시를 찾고 캐시(사용 가능한 경우)를 반환합니다. 캐시 저장 시(작업 종료 시) 캐시는 파이프라인 및 분기를 나타내는 범위에 기록됩니다.
CI, 수동 및 예약된 실행
| 범위 |
읽다 |
쓰다 |
| 소스 브랜치 |
예 |
예 |
main 분기 |
예 |
아니요 |
master 분기 |
예 |
아니요 |
끌어오기 요청 실행
| 범위 |
읽다 |
쓰다 |
| 소스 브랜치 |
예 |
아니요 |
| 대상 브랜치 |
예 |
아니요 |
중간 분기(예: refs/pull/1/merge) |
예 |
예 |
main 분기 |
예 |
아니요 |
master 분기 |
예 |
아니요 |
풀 리퀘스트 포크 실행
| 가지 |
읽다 |
쓰다 |
| 대상 브랜치 |
예 |
아니요 |
중간 분기(예: refs/pull/1/merge) |
예 |
예 |
main 분기 |
예 |
아니요 |
master 분기 |
예 |
아니요 |
팁
캐시는 이미 프로젝트, 파이프라인 및 분기로 범위가 지정되어 있으므로 캐시 키에 프로젝트, 파이프라인 또는 분기 식별자를 포함할 필요가 없습니다.
예시
Bundler를 사용하는 Ruby 프로젝트의 경우, Bundler가 Gems를 찾는 경로를 설정하기 위해 BUNDLE_PATH 환경 변수를 재정의합니다.
예:
variables:
BUNDLE_PATH: $(Pipeline.Workspace)/.bundle
steps:
- task: Cache@2
displayName: Bundler caching
inputs:
key: 'gems | "$(Agent.OS)" | Gemfile.lock'
path: $(BUNDLE_PATH)
restoreKeys: |
gems | "$(Agent.OS)"
gems
Ccache 는 C/C++에 대한 컴파일러 캐시입니다. 파이프라인에서 Ccache를 사용하려면 Ccache이 설치되어 있는지 확인하고, PATH에 선택적으로 추가하세요. 자세한 내용은 Ccache 실행 모드를 참조하세요.
CCACHE_DIR 환경 변수를 $(Pipeline.Workspace) 아래의 경로로 설정하고 이 디렉터리를 캐시합니다.
예:
variables:
CCACHE_DIR: $(Pipeline.Workspace)/ccache
steps:
- bash: |
sudo apt-get install ccache -y
echo "##vso[task.prependpath]/usr/lib/ccache"
displayName: Install ccache and update PATH to use linked versions of gcc, cc, etc
- task: Cache@2
displayName: Ccache caching
inputs:
key: 'ccache | "$(Agent.OS)" | $(Build.SourceVersion)'
path: $(CCACHE_DIR)
restoreKeys: |
ccache | "$(Agent.OS)"
자세한 내용은 Ccache 구성 설정을 참조하세요.
Docker 이미지를 캐싱하면 파이프라인을 실행하는 데 걸리는 시간을 크게 줄일 수 있습니다.
variables:
repository: 'myDockerImage'
dockerfilePath: '$(Build.SourcesDirectory)/app/Dockerfile'
tag: '$(Build.BuildId)'
pool:
vmImage: 'ubuntu-latest'
steps:
- task: Cache@2
displayName: Cache task
inputs:
key: 'docker | "$(Agent.OS)" | cache' ## A unique identifier for the cache
path: $(Pipeline.Workspace)/docker ## Path of the folder or file that you want to cache
cacheHitVar: CACHE_RESTORED ## Variable to set to 'true' when the cache is restored
- script: |
docker load -i $(Pipeline.Workspace)/docker/cache.tar
displayName: Docker restore
condition: and(not(canceled()), eq(variables.CACHE_RESTORED, 'true'))
- task: Docker@2
displayName: 'Build Docker'
inputs:
command: 'build'
repository: '$(repository)'
dockerfile: '$(dockerfilePath)'
tags: |
'$(tag)'
- script: |
mkdir -p $(Pipeline.Workspace)/docker
docker save -o $(Pipeline.Workspace)/docker/cache.tar $(repository):$(tag)
displayName: Docker save
condition: and(not(canceled()), not(failed()), ne(variables.CACHE_RESTORED, 'true'))
Docker buildx를 사용하는 예제:
steps:
- task: Cache@2
displayName: Cache Docker
inputs:
key: 'docker | "$(Agent.OS)" | mydockerimage | ./Dockerfile'
path: $(Pipeline.Workspace)/docker_image_cache
restoreKeys: |
docker | "$(Agent.OS)" | mydockerimage
- script: |
docker buildx create --name builder --driver docker-container --use
docker buildx build \
--cache-from=type=local,src=$(Pipeline.Workspace)/docker_image_cache \
--cache-to=type=local,dest=$(Pipeline.Workspace)/docker_image_cache,mode=max \
--file ./Dockerfile \
--output=type=docker,name=mydockerimage \
.
displayName: docker buildx
env:
DOCKER_BUILDKIT: 1
Golang 프로젝트의 경우 go.mod 파일에서 다운로드할 패키지를 지정할 수 있습니다.
GOCACHE 변수가 아직 설정되지 않은 경우 캐시를 다운로드할 위치로 설정합니다.
예:
variables:
GO_CACHE_DIR: $(Pipeline.Workspace)/.cache/go-build/
steps:
- task: Cache@2
inputs:
key: 'go | "$(Agent.OS)" | go.mod'
restoreKeys: |
go | "$(Agent.OS)"
path: $(GO_CACHE_DIR)
displayName: Cache GO packages
Gradle의 기본 제공 캐싱 지원을 사용하면 빌드 시간에 큰 영향을 미칠 수 있습니다. 빌드 캐시를 사용하도록 설정하려면 GRADLE_USER_HOME 환경 변수를 $(Pipeline.Workspace) 아래의 경로로 설정하고 --build-cache 사용하여 빌드를 실행하거나 org.gradle.caching=true 파일에 gradle.properties 추가합니다.
예:
variables:
GRADLE_USER_HOME: $(Pipeline.Workspace)/.gradle
steps:
- task: Cache@2
inputs:
key: 'gradle | "$(Agent.OS)" | **/build.gradle.kts' # Swap build.gradle.kts for build.gradle when using Groovy
restoreKeys: | # The fallback keys if the primary key fails (Optional)
gradle | "$(Agent.OS)"
gradle
path: $(GRADLE_USER_HOME)
displayName: Configure gradle caching
- task: Gradle@4 # Build using a Gradle wrapper script
inputs:
gradleWrapperFile: 'gradlew' # Alias: wrapperScript. Gradle wrapper.
tasks: 'build' # Default: build. Gradle tasks.
options: '--build-cache' # String. Gradle options.
displayName: Build
- script: |
# stop the Gradle daemon to ensure no files are left open (impacting the save cache operation later)
./gradlew --stop
displayName: Gradlew stop
메모
캐시는 변경할 수 없습니다. 특정 범위(예: 분기)에 대해 특정 키가 있는 캐시를 만든 후에는 업데이트할 수 없습니다. 즉, 고정 키 값을 사용하는 경우 캐시 내용이 변경된 경우에도 동일한 분기에 대한 모든 후속 빌드에서 캐시를 업데이트할 수 없습니다. 고정 키를 사용하는 경우 restoreKeys 입력을 대안으로 지정해야 합니다.
Maven은 로컬 리포지토리를 사용하여 다운로드한 종속성 및 빌드된 아티팩트를 저장합니다. 캐싱을 사용하려면 maven.repo.local 옵션을 $(Pipeline.Workspace) 아래 경로로 설정하고 이 폴더를 캐시하십시오.
예:
variables:
MAVEN_CACHE_FOLDER: $(Pipeline.Workspace)/.m2/repository
MAVEN_OPTS: '-Dmaven.repo.local=$(MAVEN_CACHE_FOLDER)'
steps:
- task: Cache@2
inputs:
key: 'maven | "$(Agent.OS)" | **/pom.xml'
restoreKeys: |
maven | "$(Agent.OS)"
maven
path: $(MAVEN_CACHE_FOLDER)
displayName: Cache Maven local repo
- script: mvn install -B -e
Maven 작업을 사용하는 경우, 변수가 덮어쓰여지므로 MAVEN_OPTS 변수를 반드시 함께 전달해야 합니다.
- task: Maven@4
inputs:
mavenPomFile: 'pom.xml'
mavenOptions: '-Xmx3072m $(MAVEN_OPTS)'
PackageReferences을 사용하여 프로젝트 파일 내에서 NuGet 종속성을 직접 관리하고, packages.lock.json 파일이 있는 경우, NUGET_PACKAGES 환경 변수를 $(UserProfile) 아래의 경로로 설정하고 이 디렉터리를 캐시함으로써 캐싱을 활성화할 수 있습니다. 종속성을 잠그는 방법에 대한 자세한 내용은 프로젝트 파일 패키지 참조를 참조하세요.
여러 packages.lock.json사용하려는 경우에도 변경하지 않고 다음 예제를 사용할 수 있습니다. 모든 packages.lock.json 파일의 콘텐츠가 해시되고 파일 중 하나가 변경되면 새 캐시 키가 생성됩니다.
예:
variables:
NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
steps:
- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | $(Build.SourcesDirectory)/**/packages.lock.json'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: $(NUGET_PACKAGES)
displayName: Cache NuGet packages
이 방법은 프로젝트에서 packages.lock.json 사용하여 패키지 버전을 잠그는 경우에도 .NET Core 프로젝트에 유효합니다.
RestorePackagesWithLockFile 파일에서 True을 으로 설정하거나 다음 명령(dotnet restore --use-lock-file)을 사용하여 사용할 수 있습니다.
Node.js 프로젝트에서 캐싱을 사용하도록 설정하는 방법에는 여러 가지가 있지만 npm의 공유 캐시 디렉터리를 캐시하는 것이 좋습니다. 이 디렉터리 npm에서 관리 하 고 모든 다운로드 된 모듈의 캐시 된 버전을 포함 합니다. 설치하는 동안 npm은 공용 npm 레지스트리 또는 프라이빗 레지스트리에 대한 네트워크 호출을 줄이거나 제거할 수 있는 이 디렉터리를 먼저 확인합니다(기본적으로).
npm의 공유 캐시 디렉터리에 대한 기본 경로는 플랫폼마다 다르므로 환경 변수를 재정의하여 npm_config_cache 아래의 경로로 설정하는 것이 좋습니다. 이렇게 하면 컨테이너 및 비컨테이너 작업 모두에서 캐시에 액세스할 수 있습니다.
예:
variables:
npm_config_cache: $(Pipeline.Workspace)/.npm
steps:
- task: Cache@2
inputs:
key: 'npm | "$(Agent.OS)" | package-lock.json'
restoreKeys: |
npm | "$(Agent.OS)"
path: $(npm_config_cache)
displayName: Cache npm
프로젝트에 package-lock.json 파일이 없는 경우 대신 캐시 키 입력에서 package.json 파일을 참조합니다.
팁
npm ci이(가) 폴더 node_modules를 삭제하여 일관되고 반복 가능한 모듈 집합을 보장하므로, node_modules를 사용할 때 npm ci 캐시를 피하십시오.
npm과 마찬가지로 Yarn은 설치된 패키지를 캐시하는 여러 가지 방법을 제공합니다. Yarn의 공유 캐시 폴더를 캐시하는 것이 좋습니다. 이 디렉터리가 Yarn에서 관리되며 다운로드한 모든 패키지의 캐시된 버전을 저장합니다. 설치하는 동안 Yarn은 공용 또는 프라이빗 레지스트리에 대한 네트워크 호출을 줄이거나 제거할 수 있는 이 디렉터리를 먼저 확인합니다(기본적으로).
예:
variables:
YARN_CACHE_FOLDER: $(Pipeline.Workspace)/.yarn
steps:
- task: Cache@2
inputs:
key: 'yarn | "$(Agent.OS)" | yarn.lock'
restoreKeys: |
yarn | "$(Agent.OS)"
yarn
path: $(YARN_CACHE_FOLDER)
displayName: Cache Yarn packages
- script: yarn --frozen-lockfile
Anaconda 환경을 사용하여 파이프라인 캐싱을 설정합니다.
예시
variables:
CONDA_CACHE_DIR: /usr/share/miniconda/envs
# Add conda to system path
steps:
- script: echo "##vso[task.prependpath]$CONDA/bin"
displayName: Add conda to PATH
- bash: |
sudo chown -R $(whoami):$(id -ng) $(CONDA_CACHE_DIR)
displayName: Fix CONDA_CACHE_DIR directory permissions
- task: Cache@2
displayName: Use cached Anaconda environment
inputs:
key: 'conda | "$(Agent.OS)" | environment.yml'
restoreKeys: |
python | "$(Agent.OS)"
python
path: $(CONDA_CACHE_DIR)
cacheHitVar: CONDA_CACHE_RESTORED
- script: conda env create --quiet --file environment.yml
displayName: Create Anaconda environment
condition: eq(variables.CONDA_CACHE_RESTORED, 'false')
Windows
- task: Cache@2
displayName: Cache Anaconda
inputs:
key: 'conda | "$(Agent.OS)" | environment.yml'
restoreKeys: |
python | "$(Agent.OS)"
python
path: $(CONDA)/envs
cacheHitVar: CONDA_CACHE_RESTORED
- script: conda env create --quiet --file environment.yml
displayName: Create environment
condition: eq(variables.CONDA_CACHE_RESTORED, 'false')
Composer를 사용하는 PHP 프로젝트의 경우 Composer에서 사용하는 COMPOSER_CACHE_DIR를 재정의 합니다.
예:
variables:
COMPOSER_CACHE_DIR: $(Pipeline.Workspace)/.composer
steps:
- task: Cache@2
inputs:
key: 'composer | "$(Agent.OS)" | composer.lock'
restoreKeys: |
composer | "$(Agent.OS)"
composer
path: $(COMPOSER_CACHE_DIR)
displayName: Cache composer
- script: composer install
알려진 문제 및 피드백
파이프라인에서 캐싱을 설정하는 데 문제가 있는 경우 리포지토리에서 microsoft/azure-pipelines-tasks 목록을 확인합니다. 문제가 나열되지 않으면 새을 만들고 시나리오에 필요한 정보를 제공하십시오.
질문 및 답변
Q: 캐시를 지울 수 있나요?
A: 캐시 지우기는 지원되지 않습니다. 그러나 캐시 키에 문자열 리터럴(예: version2)을 추가하여 기존 캐시에서 적중을 방지할 수 있습니다. 예를 들어 다음 캐시 키를 다음과 같이 변경하세요.
key: 'yarn | "$(Agent.OS)" | yarn.lock'
이에:
key: 'version2 | yarn | "$(Agent.OS)" | yarn.lock'
Q: 캐시는 언제 만료되나요?
A: 7일 동안 활동이 없으면 캐시가 만료됩니다.
Q: 캐시는 언제 업로드되나요?
A: 캐시는 작업의 마지막 단계 이후에 지정된 path 캐시에서 만들어지고 업로드됩니다. 자세한 내용은 예제 를 참조하세요.
Q: 캐시 크기에 제한이 있나요?
A: 조직 내의 개별 캐시 크기 또는 총 캐시 크기에 대한 제한은 없습니다.
관련 콘텐츠