리니어, AI 에이전트 확산에 맞춰 CI 개편해 대기시간 줄여

리니어(Linear)가 AI 에이전트 확산으로 빨라진 코드 개발 속도에 맞춰 CI 환경을 개편했다. 테스트 스위트가 연초보다 4배 가까이 늘었지만 풀 리퀘스트의 CI 대기시간을 6분 이상에서 5분여로 줄이고 테스트당 러너 사용시간을 절반가량 낮췄다고 밝혔다. 리니어는 외부 러너 전환, 네이티브 컴파일러 도입, 린트 규칙 재작성, 체크아웃·캐시 구조 개선 등을 통해 병목과 인프라 비용을 함께 줄이는 데 초점을 맞췄다.

CI 대기시간과 러너 사용량 줄여

리니어는 9월 22일 리니어(Linear)에 게시한 코드 작성이 빨라진 반면 변경 내용을 검증하는 CI가 같은 속도로 개선되지 않아 개발자와 AI 에이전트가 피드백을 기다리는 시간이 길어졌다고 설명했다. 모든 풀 리퀘스트가 CI를 통과해야 하는 구조에서 개발 속도가 빨라질수록 CI가 병목이 되고 인프라 비용도 커진다는 것이다.

테스트 스위트는 올해 초보다 거의 4배로 증가했지만, 풀 리퀘스트가 CI를 기다리는 시간은 6분 이상에서 5분을 조금 넘는 수준으로 낮아졌다. 테스트당 러너 사용시간도 대략 절반으로 줄었다. 깃허브 액션(GitHub Actions)에서 더 빠른 CPU와 고성능 저장장치, 개선된 캐시 인프라를 갖춘 제3자 러너로 작업을 옮긴 결과, 전환 전후 같은 조건을 비교했을 때 작업이 평균 34% 더 빠르게 실행됐다. 일부 작업인 타입스크립트 컴파일러 확인은 52% 빨라졌다.

도구 체계도 손봤다. 네이티브 타입스크립트 컴파일러인 tsgo로 전환하면서 tsc 확인 작업의 주간 중앙값이 73% 줄어 타입 검사가 더는 주요 병목이 아니게 됐다. 린트 규칙 중 일부는 타입 정보를 확인하기 위해 매번 전체 타입 그래프를 구축했는데, 이를 추상 구문 트리 기반 정적 분석으로 다시 작성했다. 그 결과 API 린트 시간은 68%, 전체 저장소 린트 시간은 55% 감소했고 메모리 사용량도 크게 줄었다. 타입 정보 의존성을 없앤 덕분에 이후 옥스린트(Oxlint)로 옮기는 작업도 쉬워졌으며, 옥스린트는 린트에 쓰이는 CI 러너 분을 추가로 줄였다.

체크아웃·캐시 구조도 재설계

리니어는 개별 검사뿐 아니라 CI 전체 흐름에서 앞단에 놓인 작은 작업도 주요 병목으로 봤다. 변경된 경로와 같은 입력으로 테스트가 이미 통과했는지를 먼저 확인하는 작업이 API 테스트 8개 샤드의 시작을 막을 수 있기 때문이다. 전체 작업 트리를 내려받던 변경 감지 작업은 가져오기 깊이를 제한해 가장 느린 게이트를 94초에서 20초로 줄였고, 작업 트리가 필요 없는 작업에서는 체크아웃을 제거해 27초를 7초로 낮췄다. 커밋 푸시와 병합 대기열 이벤트에는 제한된 이력의 희소·블롭 없는 체크아웃을 적용해 11초가량을 더 절약했다.

제3자 러너가 깃허브 네트워크 외부에 있어 직접 IP 연결을 사용하면서 체크아웃이 지연되거나 멈추는 문제도 발생했다. 이에 리니어는 기존 액션 대신 백오프 방식으로 재시도하는 자체 복합 액션을 만들고, 약 30초 동안 연결이 정체되면 중단하도록 관련 Git 환경변수를 설정했다. 영구 Git 미러를 저장하는 체크아웃 캐시도 활용했다. 병합 직전 검사를 막던 캐시 표식 기록은 테스트 샤드가 끝난 뒤 실행되지만 다른 작업을 차단하지 않는 단계로 옮겨 API 풀 리퀘스트와 병합 대기열 진입 때마다 42초를 줄였다.

반복되는 준비 비용도 줄였다. API 테스트 샤드는 매번 같은 PostgreSQL 클라이언트를 apt로 설치하는 데 7~8초를 썼지만, 리니어는 Node와 해당 클라이언트가 들어 있는 CI 기본 이미지를 만들어 즉시 실행할 수 있게 했다. 이후 네이티브 빌드 헤더도 이미지에 포함해 설정 과정에서 다운로드가 멈추는 경우를 줄였다. 이 변경들을 합쳐 캐시가 없는 API 풀 리퀘스트의 필수 검사 경로에서 약 1분을 단축하고 러너 시작 횟수도 낮췄다고 설명했다. 글에는 별도의 제품 출시 일정이나 가격 계획은 제시되지 않았다.

RELATED ARTICLES