GitLab Group Runner 캐시 문제와 해결 방안
GitLab CI/CD를 구성할 때 여러 개의 러너를 그룹으로 묶어 운영하는 경우가 많습니다. 그러나 그룹 러너를 사용할 때 자주 발생하는 문제가 바로 캐시 관리입니다. 이번 글에서는 GitLab 그룹 러너를 사용할 때 node 패키지나 go 패키지를 받아오는 과정에서 캐시 문제로 인해 정상적인 빌드가 되지 않는 현상을 확인하고, 이를 해결할 수 있는 방안을 소개하겠습니다.
🔍 문제 현상
GitLab에서 제공하는 그룹 러너(Group Runner)는 빌드 성능을 높이기 위해 로컬 캐시를 활용합니다. 그러나 여러 서버에서 그룹 러너를 분산 운영하는 경우, 각 서버가 로컬로 독립적인 캐시를 가지고 있으면 다음과 같은 현상이 발생할 수 있습니다.
- Node 패키지 설치 시 일부 패키지를 찾지 못하거나 오류가 발생함.
- Go 빌드 시 캐시된 모듈을 제대로 불러오지 못하는 현상이 발생함.
이러한 문제는 동일한 그룹 내 여러 러너 서버 간에 캐시 상태가 다르게 유지되기 때문에 발생합니다. 특히, node_modules
나 Go 모듈 캐시 같은 공유가 필요한 의존성에서 자주 나타납니다.
🚩 문제의 원인
기본적으로 GitLab 그룹 러너는 별도의 설정이 없으면 각 러너 서버마다 개별적으로 캐시를 유지합니다. 이러한 이유로 빌드 작업이 서로 다른 러너 서버에서 분산 실행될 때, 이전 작업에서 생성된 캐시를 다른 서버에서 이용할 수 없어 패키지를 매번 다시 다운로드하거나 충돌이 발생할 수 있습니다.
즉, 러너 간 캐시 공유가 안 되는 상황이 문제의 핵심 원인입니다.
✅ 해결 방법
이 문제를 해결하기 위해서는 캐시를 공유할 수 있도록 외부 캐시 저장소를 사용하는 방법이 가장 효과적입니다. 대표적인 외부 캐시 스토리지 옵션은 다음과 같습니다.
- AWS S3를 이용한 공유 캐시
- MinIO를 이용한 자체 호스팅 캐시 서버
여기서는 가장 손쉽게 접근 가능한 AWS S3를 이용한 방법을 안내하겠습니다.
🛠️ AWS S3 캐시 설정 방법
1. S3 버킷 생성
먼저 AWS 콘솔에서 S3 버킷을 생성합니다.
- 버킷 이름: 예시로
gitlab-runner-cache-example
(원하는 이름 설정) - 접근 권한: 러너에서 접근 가능하도록 설정
- AWS 리전: 러너가 배포된 서버와 가까운 리전 권장
2. IAM 사용자 또는 역할 설정
GitLab 러너가 AWS S3 버킷에 접근할 수 있도록 IAM 사용자를 만들고, 적절한 권한을 부여합니다.
필요 권한 예시:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::gitlab-runner-cache-example/*"
]
}
]
}
3. GitLab Runner 설정 변경
GitLab Runner의 설정 파일(config.toml
)에 다음과 같이 S3 캐시를 지정합니다.
[[runners]]
name = "Group Runner"
url = "https://gitlab.example.com/"
token = "YOUR_RUNNER_TOKEN"
executor = "docker"
[runners.docker]
image = "docker:latest"
[runners.cache]
Type = "s3"
Path = "runner/cache"
Shared = true
[runners.cache.s3]
ServerAddress = "s3.amazonaws.com"
BucketName = "gitlab-runner-cache-example"
BucketLocation = "ap-northeast-2" # 예시 리전
AccessKey = "YOUR_AWS_ACCESS_KEY"
SecretKey = "YOUR_AWS_SECRET_KEY"
여기서 중요한 옵션은 Shared = true
입니다.
이 옵션을 활성화하면 모든 그룹 러너가 동일한 S3 버킷 내 캐시를 공유할 수 있습니다.
⚠️ 주의사항: Shared 옵션이 false인 경우
Shared = false
로 설정된 경우, 각 러너는 고유한 캐시를 사용하게 되어 다음과 같은 현상이 발생합니다.
- 다른 러너 서버 간 캐시 공유가 이루어지지 않음.
- 동일한 프로젝트 빌드를 서로 다른 러너에서 수행할 때마다 매번 새로운 캐시가 생성되어 저장 공간 낭비 및 빌드 속도 저하의 원인이 될 수 있음.
- 분산 러너 환경에서는 사실상 로컬 캐시와 비슷한 효과를 가져 비효율적일 수 있음.
그러므로 여러 러너가 분산 환경에서 운영되는 경우에는 반드시 Shared = true
로 설정하여 S3 버킷에 통합된 캐시를 관리하는 것이 권장됩니다.
🧪 결과 확인
캐시 설정 이후 GitLab 빌드 작업을 다시 실행하여 node, go 패키지가 정상적으로 캐시되어 공유되는지 확인합니다.
빌드 로그에서 캐시가 성공적으로 저장되고 로드되는 것을 확인할 수 있습니다.
Checking cache for default...
Successfully extracted cache
# ...
Creating cache default...
runtime/node_modules/: found 2685 matching files and directories
Uploading cache.zip to https://s3.amazonaws.com/gitlab-runner-cache-example/runner/cache/...
Created cache
📌 결론
GitLab 그룹 러너를 운영할 때는 반드시 캐시 공유 전략을 고려해야 합니다. AWS S3를 활용한 캐시 공유 설정을 통해 빌드 안정성을 높이고 불필요한 패키지 재설치를 방지하여 빌드 시간을 절약할 수 있습니다.