지속적 통합

Continuous integration

변경을 자주 합치고 자동 검사를 거쳐 통합 오류를 일찍 드러냅니다.

···
html
<div class="stage" data-phase="0"><div class="title">COMMIT → CHECKS</div><div class="row track"><span class="panel mono">a81f</span><span class="line"></span><span class="panel gate">lint</span><span class="panel gate">test</span><span class="panel gate">package</span></div><div class="panel result">New commit queued</div></div>
css
.stage{width:min(94vw,760px);height:min(88vh,330px);padding:clamp(9px,2.6vmin,20px);border:1px solid var(--line);border-radius:14px;background:var(--surface);font:600 clamp(12px,2.5vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;display:flex;flex-direction:column;gap:clamp(6px,1.7vmin,12px);overflow:hidden;position:relative}.stage *{min-width:0}.stage .title{color:var(--accent);font-weight:800}.stage .sub{color:var(--muted)}.stage .row{display:flex;align-items:center;gap:clamp(5px,1.6vmin,12px)}.stage .panel{border:1px solid var(--line);border-radius:8px;background:var(--bg);padding:clamp(6px,1.6vmin,12px)}.stage .mono{font-family:ui-monospace,SFMono-Regular,monospace;font-size:clamp(12px,2.5vmin,15px)}.stage .grow{flex:1}.stage .on{color:var(--accent)}.track{flex:1;justify-content:center}.track .line{height:2px;flex:1;background:var(--line);position:relative}.track .line:after{content:'';position:absolute;left:0;top:-4px;width:10px;height:10px;border-radius:50%;background:var(--accent);animation:travel 3.6s infinite}.gate{transition:background .25s,color .25s}.stage[data-phase="1"] .gate:nth-last-child(3),.stage[data-phase="2"] .gate:nth-last-child(3),.stage[data-phase="2"] .gate:nth-last-child(2){background:var(--accent);color:var(--surface);border-color:var(--accent)}.stage[data-phase="1"] .result:after{content:' · lint passed'}.stage[data-phase="2"] .result:after{content:' · tests passed' }@keyframes travel{from{left:0}to{left:calc(100% - 10px)}}
js
const stage=document.querySelector('.stage');let phase=0;function advance(){phase=(phase+1)%3;stage.dataset.phase=String(phase)}const timer=setInterval(advance,1200);stage.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})

지속적 통합은 새 커밋이 들어올 때 빌드와 테스트를 자동 실행하는 개발 방식입니다. 긴 브랜치를 한 번에 합칠 때보다 충돌과 실패의 원인을 좁히기 쉽습니다.

데모에서는 커밋이 세 검사 단계를 지나고, 실패가 난 단계에서 흐름이 멈춥니다. 검사가 통과해도 배포 가능한 상태인지는 별도의 통합·환경 검증이 필요합니다.

언제 쓰나

여러 사람이 같은 코드베이스를 자주 수정할 때 커밋별 실패를 빠르게 발견합니다.

페이지로 열기 ↗