CI의 개념과 CI 도구의 흐름: 깃허브 액션과 Travis CI
한눈에 보기
짧은 주기로 병합하고 커밋마다 빌드와 테스트를 자동 실행하는 지속적 통합(CI)의 개념을 정리한다. 깃허브 액션 중심의 파이프라인 흐름과 Travis CI의 역사적 맥락, CD와의 차이를 다룬다.
최종 업데이트 2026.09.17
지속적 통합(CI, Continuous Integration)은 개발자들이 작성한 코드를 짧은 주기로 공유 저장소에 병합하고, 병합할 때마다 빌드와 테스트를 자동으로 실행해 문제를 조기에 발견하는 개발 방식이다. 이 자동화를 담당하는 도구로 과거에는 트래비스 CI(Travis CI)와 젠킨스(Jenkins)가 널리 쓰였고, 현재는 깃허브 액션(GitHub Actions)이 사실상의 표준으로 자리 잡았다. 도구는 바뀌어도 커밋마다 빌드와 테스트를 자동 검증한다는 핵심 흐름은 동일하다.
CI가 해결하는 문제
CI가 없던 시절에는 각자 오래 작업한 브랜치를 한꺼번에 합치다가 병합 충돌과 통합 버그가 터지는 이른바 통합 지옥(integration hell)이 흔했다. 문제는 발견이 늦을수록 원인 커밋을 찾기 어렵고 수정 비용도 커진다는 점이다. CI는 이를 뒤집어, 작은 단위로 자주 병합하고 병합 시점마다 전체 테스트를 돌려서 문제를 커밋 단위로 좁혀 준다.
CI가 제대로 동작하려면 두 가지 전제가 필요하다. 첫째, 빌드와 테스트가 사람 손을 타지 않고 명령 한 번으로 재현 가능해야 한다. 둘째, 실패를 걸러 줄 자동화된 테스트가 충분히 있어야 한다. 테스트가 없는 CI는 컴파일 확인기에 지나지 않는다.
CI 파이프라인의 기본 흐름
도구가 무엇이든 CI 파이프라인(pipeline)의 뼈대는 같다. 개발자가 코드를 푸시하거나 풀 리퀘스트(Pull Request)를 열면 저장소의 웹훅(webhook) 이벤트가 CI 서버를 깨운다. CI 서버는 깨끗한 가상 머신이나 컨테이너 환경을 새로 만들어 코드를 체크아웃하고, 의존성 설치, 빌드, 테스트, 정적 분석을 순서대로 실행한다. 결과는 풀 리퀘스트 화면에 성공과 실패로 표시되고, 실패한 코드는 병합이 차단된다.
매번 새 환경에서 실행하는 이유는 "내 컴퓨터에서는 되는데"라는 문제를 차단하기 위해서다. 로컬에 우연히 설치된 도구나 남아 있는 파일에 의존하는 코드는 깨끗한 환경에서 즉시 실패하므로, CI 통과 자체가 빌드 재현성의 증명이 된다.
깃허브 액션으로 보는 CI 설정
깃허브 액션은 저장소 안의 .github/workflows/ 디렉터리에 YAML 파일로 워크플로(workflow)를 정의한다. 워크플로는 트리거 이벤트, 실행 환경, 그리고 순차 실행되는 스텝(step)으로 구성된다.
name: CI
on:
push:
branches: [main]
pull_request:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
cache: gradle
- run: ./gradlew build
여기서 on은 어떤 이벤트에 반응할지, runs-on은 어떤 러너(runner) 환경에서 실행할지를 정한다. uses는 체크아웃이나 자바 설치처럼 자주 쓰는 작업을 재사용 가능한 액션으로 가져오는 문법이고, run은 셸 명령을 직접 실행한다. 의존성 캐시를 활성화하면 매 실행마다 라이브러리를 새로 내려받지 않아 파이프라인 속도가 크게 빨라진다. 저장소와 CI가 한 플랫폼에 통합되어 별도 서버나 외부 서비스 연동 없이 설정 파일 하나로 시작할 수 있다는 점이 깃허브 액션이 표준이 된 이유다.
트래비스 CI의 역사적 맥락과 도구 비교
트래비스 CI는 2010년대에 클라우드 호스팅형 CI를 대중화한 서비스다. 저장소 루트에 .travis.yml 파일만 두면 깃허브 저장소와 연동되어 자동으로 빌드가 도는 방식은 당시 직접 서버를 설치해 운영해야 했던 젠킨스에 비해 혁신적이었고, 오픈 소스 프로젝트에 무료로 제공되어 널리 퍼졌다. 그러나 2020년 무료 정책이 크게 축소되고 같은 해 깃허브 액션이 무료 사용량과 플랫폼 통합을 앞세워 성장하면서, 신규 프로젝트에서 트래비스 CI를 선택하는 경우는 드물어졌다. 설정 파일 형식은 다르지만 이벤트 트리거, 격리된 빌드 환경, 단계별 스크립트라는 개념은 그대로 깃허브 액션에 이어졌다.
| 구분 | 젠킨스 | 트래비스 CI | 깃허브 액션 |
|---|---|---|---|
| 운영 형태 | 직접 설치, 자체 호스팅 | 클라우드 호스팅 | 클라우드 호스팅, 자체 러너 가능 |
| 설정 방식 | 웹 UI 또는 Jenkinsfile | .travis.yml | .github/workflows의 YAML |
| 강점 | 플러그인 생태계, 내부망 제어 | 당시 기준 간편한 연동 | 저장소 통합, 액션 마켓플레이스 |
| 현재 위상 | 사내 인프라에서 여전히 사용 | 역사적 의의, 신규 채택 드묾 | 사실상 표준 |
CI에서 CD로
CI가 병합까지의 품질을 책임진다면, 그 뒤는 CD가 이어받는다. CD는 두 가지로 나뉜다. 지속적 전달(Continuous Delivery)은 검증된 산출물을 언제든 배포 가능한 상태로 유지하되 실제 배포 버튼은 사람이 누르는 방식이고, 지속적 배포(Continuous Deployment)는 테스트를 통과한 커밋을 사람 개입 없이 운영 환경까지 자동 배포하는 방식이다. 실무에서는 CI 파이프라인 끝에 도커(Docker) 이미지 빌드와 배포 스텝을 붙여 CI/CD 파이프라인 하나로 관리하는 경우가 많다. 이때 배포에 필요한 비밀값은 코드에 두지 않고 CI 도구의 시크릿(secret) 저장소에서 주입하는 것이 원칙이다.
면접에서 이렇게 물어본다
- CI를 도입하면 어떤 문제가 해결되는가. 도입의 전제 조건은 무엇인가.
- 코드를 푸시했을 때 CI 파이프라인에서 어떤 일이 순서대로 일어나는지 설명해 보라.
- 지속적 전달과 지속적 배포의 차이는 무엇인가.
- CI 빌드가 매번 깨끗한 환경에서 실행되는 이유는 무엇인가.
- 깃허브 액션과 젠킨스는 어떤 기준으로 선택하겠는가.
DevOps / 인프라에서 같이 읽기
- AWS에 스프링 부트를 배포하는 네 가지 방법EC2 수동 배포부터 배포 스크립트, CodeDeploy, 컨테이너까지 AWS에 스프링 부트를 배포하는 방식의 발전 단계를 정리한다. 각 방식의 원리와 무중단 배포 전략, 롤백까지 다룬다.
- 시스템 규모 확장 전략: 스케일 업부터 샤딩까지트래픽 증가에 대응하는 시스템 확장 전략을 정리한다. 스케일 업과 스케일 아웃의 비교, 무상태 설계와 세션 처리, 로드 밸런싱, 캐시, 데이터베이스 복제와 샤딩까지 다룬다.
이 개념, 내 코드에서는 어떻게 물어볼까요
데브핏(DevFit)에 채용공고 URL을 붙여 넣고 레포지토리를 연결하면, 내가 쓴 커밋에서 예상 질문과 어필 포인트를 만듭니다. 하루 10회까지 무료입니다. 합불 판정이나 지원자 랭킹은 만들지 않고, 최종 판단은 사람이 합니다.
공고 넣고 시작하기