TrotRanking
IT Engineering

깃허브 액션(GitHub Actions) 셀프 호스티드 러너(Self-hosted runner) 로컬 통제망 아키텍처 및 빌드 컴퓨팅 시간 최적화

김민준 · IT 시스템 엔지니어
모던 소프트웨어 개발 시대의 도래와 데브옵스(DevOps) 파이프라인 사상의 보편화에 힘입어 CI/CD (지속적 통합 및 지속적 배포) 서버 시스템 구축은 더 이상 거대 자본을 업은 대기업 백엔드 팀만의 호화로운 전유물이 아닙니다. 아주 열악한 개인 인디 개발자들조차도 자신이 밤새워 작성한 코드를 푸시만 하면 스스로 패키지를 풀어서 유닛 테스트 스펙을 입증하고 상용 프론트 도메인 서버 트리에 자동으로 배포해주는 깃허브 액션(GitHub Actions) 환경을 거미줄처럼 광범위하게 채택하고 실무에 녹여내고 있습니다. 하지만 엄청난 편리함을 등에 업은 반면, 단일 리포지토리에 스파게티처럼 얽힌 복합 마이크로서비스 모노레포 구조를 빌드 단계로 밀어 넣을 때, 깃허브 클라우드가 기본으로 공용 무료 제공하는 호스팅 우분투 러너(Ubuntu Runner) 컨테이너는 심각하게 통제 수준이 제한적인 쥐꼬리만 한 2 코어 수준의 7GB 램이라는 아슬아슬하고 조악한 컴퓨팅 파워를 한곗값으로 던져줍니다. 자바 스프링 부트(Spring Boot)의 묵직한 그래들 빌드나 타입스크립트 노드 프레임워크인 넥스트제이에스(Next.js) 프로덕션 렌더링 파일 패키징을 수 차례 태우려면 그 빌드 대기 시간에만 커피를 내리고 와야 할 처참한 워크로드 인프라 병목 대참사가 수반되기 일쑤입니다. 이러한 제한적인 공용 자원의 저사양 감옥에서 탈피하여 여러분의 로컬 워크스테이션이나 별도로 구성된 고사양 AWS EC2 홈 서버의 빵빵한 CPU 코어를 빌드 전초기지 용도로 독점 장악하도록 브릿지를 뚫어주는 놀랍도록 강력한 무기가 바로 '셀프 호스티드 러너(Self-hosted Runner)' 구축 아키텍처입니다. 레포지토리 관리자 셋팅스의 액션 메뉴 탭 가장 하단에 자리 잡은 러너 메뉴에서 아주 손쉽게 나만의 독립적인 서버를 등록하기 직행하는 권한 부여를 하달받을 수 있습니다. 터미널 창에 리눅스 권한이나 파워쉘로 접속해 깃허브에서 친절하게 할당해 주는 컬(CURL) 다운로드 스크립트와 엄청나게 긴 암호화 인증 토큰을 복사하여 타격해주면 당신이 소유한 8 코어니 16 코어니 하는 무지막지한 괴물 컴퓨팅 장비에 깃허브 원격 트리거를 상시로 리스닝하며 감시하는 백그라운드 런타임 리시버 코어가 다운로드되어 마운트 세팅됩니다. 이것을 단순히 명령어로 한 번 구동시켜두고 잊어버리는 초급 수준에 머물러서는 곤란합니다. 만약 여러분의 호스트 기기가 재부팅되거나 펌웨어 업데이트로 꺼졌을 때 CI 파이프라인 전체가 마비되는 리스크를 막으려면 리눅스 운영체제를 기준으로 로우리벨 데몬 관리자인 시스템디(Systemd) 서비스 네트워크로 모듈화하여 이식하는 딥 리팩토링 과정이 요구됩니다. 러너가 설치된 홈 디렉토리 상에서 자체적으로 지원하는 `sudo ./svc.sh install` 스크립트를 작동시켜 백그라운드 프로세싱 네트워크로 영구 배선 체계를 묶어버리고 `systemctl start actions.runner.서비스명` 구동 트리거를 걸어주어야 비로소 진정한 무중단 서버 통제력이 손아귀에 잡힙니다. 이 러너 파이프가 파란 불빛과 함께 활성화된 그 순간부터 로컬 내 여러분의 장비는 원격 깃허브 서버와 SSH 없이 암호화된 양방향 포트 터널링 핑을 주고받으며 액션 워크플로우(`runs-on: self-hosted` 지정 시)가 굴러가는 모든 핵심 소스 데이터들을 끌어당겨 자신의 CPU 16개 쓰레드를 총동원해 수 분이 소요되던 답답한 무거운 빌드를 단 몇 십 초의 경이적인 속도만으로 아작 내며 병렬 폭파 압축해 버립니다. 성능 극대화 튜닝 이면에는 분명 방관할 수 없는 거대한 보안의 치명적인 함정이 입을 벌리고 기다리고 있습니다. 셀프 호스팅 러너는 호스트 머신의 루트 권한이나 사용자 쉘 권한 인프라 네트워크를 여과 없이 100% 동일하게 공유받습니다. 만일 당신의 퍼블릭 공개 깃허브 레포지토리에 누군가 고의적으로 권한 삭제 코드를 집어넣은 악의적인 외부 공격자 풀 리퀘스트(Pull Request)를 무심코 수락하여 승인을 내리게 되는 순간, 그 액션 명령 트리거 파이프라인을 타고 들어와 당신의 내부 로컬 홈 서버가 통째로 해킹당해 파일 포매팅 암호화 공격이 단행되는 아득한 통제 상실 상황에 노출될 수 있습니다. 이를 방어하기 위해서 깃허브는 가급적 폐쇄적인 프라이빗 코드 베이스 환경에서만 구축하는 정책을 권장수칙으로 강조하고 있으며, 고수준의 엔지니어들은 이에 더해 해당 러너 자체를 호스트 OS와 다시 한번 격리 분리된 도커(Docker) 컨테이너 이미지 그 자체 속으로 파묻어 이중 샌드박스로 가둬버리는 극한의 물리적 보안 아키텍처 방어망을 철저히 두르고 있습니다. 이렇듯 편의성이 가져다주는 가성비 극강의 고속 빌드 파워와 시스템 루트 권한 노출이라는 딜레마를 정확히 통찰하여 다룰 줄 알아야 진정한 데브옵스의 파이프라인 시스템 매니저로 군림할 수 있습니다.