GitLab CI에서 anchors와 artifacts 제대로 이해하기
DevSecOps 실무에서 .gitlab-ci.yml 파일을 다루다 보면 반복적인 설정을 줄이고, 빌드 결과물을 효율적으로 관리하기 위해 anchors와 artifacts 키워드를 자주 활용하게 됩니다. 이 글에서는 이 두 키워드의 개념부터 실무 적용 사례, 그리고 주의해야 할 점까지 구체적으로 설명드리겠습니다.
1. anchors란 무엇인가
개념
GitLab CI의 .gitlab-ci.yml은 YAML 문법을 따릅니다. YAML은 anchors(&)와 aliases(*) 기능을 제공하여, 설정 내용을 재사용할 수 있습니다. 마치 코드에서 공통 함수를 정의하고 불러오는 것처럼, CI 설정의 중복을 줄이고 관리 효율성을 높이는 데 유용합니다.
문법 예시
script:
- echo "공통 스크립트 실행"
job1:
<<: *default_script
job2:
<<: *default_script
script:
- echo "job2만의 스크립트 실행"
실무 활용 시나리오
- 보안 스캔 파이프라인에서 공통 사전 작업 정의: 예를 들어 모든 Job에 공통적인 SAST 사전 설치 작업이 있다면 anchor로 정의해 놓고 각 Job에서 재사용합니다.
- 환경 분리 설정에 따른 중복 제거: dev, staging, prod 환경에 따라 Job 설정만 조금씩 다른 경우, 공통 부분은 anchor로 관리하고 차이만 override 합니다.
주의사항
- Anchor는 YAML 레벨에서만 작동하므로, GitLab CI 문법이 아닌 YAML 문법 오류로 인한 문제 발생 가능성이 있습니다.
- 복잡한 중첩 anchor는 가독성을 오히려 해칠 수 있으므로, 2단계 이상 중첩은 지양하는 것이 좋습니다.
- Anchor로 가져온 뒤 일부 키만 수정할 경우, 오히려 처음부터 작성하는 것보다 비효율적일 수 있습니다.
2. artifacts란 무엇인가
개념
artifacts는 Job 실행 결과물(파일, 디렉터리 등)을 GitLab Runner가 저장하고, 다음 Job으로 전달하거나 다운로드할 수 있도록 하는 기능입니다. 보통 빌드 산출물, 보안 리포트, 로그 등을 전달할 때 사용합니다.
문법 예시
script:
- make build
artifacts:
paths:
- build/
expire_in: 1 hour
test-job:
dependencies:
- build-job
script:
- ./test build/
실무 활용 시나리오
- 보안 리포트 전달: SAST, DAST, Dependency Scan 등의 결과물을 artifacts로 지정하여 이후 Job이나 UI에서 검토 가능하게 합니다.
- 빌드 캐싱: 빌드된 바이너리 또는 패키지를 다음 테스트 Job에서 재활용할 수 있습니다.
- 인프라 배포 전 중간 결과 보존: 예를 들어 Terraform Plan 결과 파일을 artifacts로 저장하고 승인 후 배포 Job에서 그대로 사용할 수 있습니다.
주요 키워드 정리
- paths: 보존할 파일이나 디렉터리 경로 목록
- expire_in: 저장된 아티팩트의 만료 시간. 기본은 30일이며, SAST 등 보안 스캔 관련 Job은 명시적으로 짧게 설정하는 것이 좋습니다.
- when: 항상 저장(always), Job 성공 시(on_success), 실패 시(on_failure) 중 선택 가능
- reports: GitLab UI에서 표시할 수 있는 보안/테스트 리포트 지정 (예: sast, dependency_scanning, dast, junit 등)
주의사항
- 모든 Job에서 artifacts를 남기면 GitLab 스토리지가 빠르게 소모될 수 있습니다. 특히 대용량 로그나 빌드 결과물이 자주 생성될 경우 주의해야 합니다.
- CI/CD Job이 병렬적으로 실행되는 경우 dependencies를 명시하지 않으면 artifacts가 제대로 전달되지 않을 수 있습니다.
- Runner 유형에 따라 artifacts의 upload/download 속도에 큰 차이가 발생할 수 있으며, 자체 GitLab 설치 환경에서는 네트워크 병목도 고려해야 합니다.
3. anchors + artifacts 조합 활용 예시
보안 스캔 Job에 공통된 artifacts 설정을 anchor로 관리하는 예시)
.common_artifacts: &common_artifacts
artifacts:
paths:
- reports/
expire_in: 1 hour
when: always
sast-scan:
script:
- run-sast-scan > reports/sast.json
<<: *common_artifacts
artifacts:
reports:
sast: reports/sast.json
dependency-scan:
script:
- run-dep-scan > reports/dependency.json
<<: *common_artifacts
artifacts:
reports:
dependency_scanning: reports/dependency.json
이렇게 구성하면 paths, expire_in, when 같은 반복적인 설정을 anchor로 관리하면서도, 각 스캔 종류에 맞는 리포트를 개별적으로 지정할 수 있습니다.
결론
DevSecOps 환경에서 .gitlab-ci.yml을 구조적으로 작성하는 것은 코드 품질 못지않게 중요합니다.
anchors를 통해 중복을 제거하고 유지보수성을 높이며, artifacts를 통해 Job 간 의존성과 결과물을 체계적으로 관리할 수 있습니다.
단, YAML 문법에 대한 이해 부족, 무분별한 아티팩트 저장, 가독성 저하 등은 오히려 CI/CD 파이프라인의 복잡도와 비용을 높일 수 있으므로 신중한 설계가 필요합니다.