SwiftLint 캐싱으로 증분 빌드 최적화하기
SwiftLint를 로컬 캐싱하고 CI를 보강해 증분 빌드를 15~30초에서 1~2초로 줄였다.
29CM 모바일팀은 모듈화가 진행될수록 SwiftLint가 모든 모듈에서 매 빌드마다 실행되며 증분 빌드 시간을 갉아먹는 문제를 해결하고자 했다. M1~M3 Pro 기준으로 SwiftLint만 15~30초가 소요돼, 일상적인 코딩 흐름에서 체감이 큰 병목이었다.
이를 위해 Xcode Build Phase의 Based on dependency analysis 옵션을 활용할 수 있도록 구조를 바꿨다. 핵심은 두 가지였다.
- 최초 기준이 되는 xcfilelist를 만들고
- 파일 변경 시 해당 모듈의 SwiftLint 대상 목록을 갱신하는 것
특정 타겟을 기준으로 master 브랜치와 현재 작업 디렉터리의 diff를 비교해 변경된 Swift 파일만 xcfilelist에 기록하고, 빈 output 파일을 생성해 Xcode가 불필요하게 스크립트를 반복 실행하지 않도록 했다. 여기에 모든 타겟의 Project.swift를 찾아 CPU 코어 수만큼 병렬 실행하는 스크립트도 추가해 갱신 비용을 줄였다.
또한 Build Pre-actions를 이용해 빌드 전에 각 타겟의 입력 파일 목록을 갱신하도록 구성했다. 그 결과 평소 개발에서는 대부분의 타겟에서 SwiftLint가 실행되지 않게 되었고, 순수 소요 시간은 1~2초 수준으로 줄었다.
다만 캐싱 방식은 즉시 린트가 돌지 않기 때문에 경고나 오류 발견이 늦어지는 부작용이 있었다. 이를 보완하기 위해 danger-swift와 GitHub Actions 기반의 SwiftLint CI를 도입해, 변경된 파일만 검사하는 별도 린트 파이프라인을 만들었다.
결과적으로 로컬에서는 증분 빌드 속도를 확보하고, CI에서는 린트 품질을 다시 강하게 보장하는 구조로 정리했다. SwiftLint뿐 아니라 다른 Build Phase 작업에도 xcfilelist, Build Pre-actions, dependency analysis를 활용해 비슷한 최적화를 시도할 수 있다.
이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.
요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.