FDE 캡스톤: 창고가 같은 주문을 세 번 받았다 · 초록불 다음의 한 건 · 실습
1.5.0 은 접수됨을 띄웠지만 창고엔 주문이 없었다
목표
releases/<판> 과 current 심링크로 배포하고, 헬스체크와 스모크 시험을 거쳐 실패하면 직전 판으로 되돌려 기록하는 스크립트를 만든다. 보존 정리에서 current 와 직전 판을 지킨다.
왜 중요한가
헬스체크는 프로세스가 살아 있는지를, 스모크는 업무 한 건이 끝까지 되는지를 묻는다. 고객사의 지난 배포는 앞의 질문만 하고 끝나 밤새 주문을 잃었다.
판을 디렉터리로 나누고 심링크 하나로 전환하면 되돌림도 같은 동작 하나가 된다. 다만 전환하는 순간 current 가 사라지거나, 옛 프로세스가 대신 초록불을 켜거나, 정리 스크립트가 돌아갈 판을 지우면 구조가 있어도 사고가 난다.
채점기는 매번 다른 판 번호로 정상·스모크에서만 깨지는·뜨자마자 죽는·늦게 뜨는 빌드를 만들어 여러분의 스크립트를 실행하고, 로그 문구가 아니라 실제로 응답하는 판과 심링크를 다시 잰다.
예상 60분이다. 기본 세션이 끝나기 전에 +시간으로 연장하자(최대 180분). 세션이 끝나면 /root 의 파일은 사라지니 스크립트는 따로 보관한다.
단계
1. 빌드 orderapp-1.4.0.tar.gz 를 /root/site/releases/1.4.0 에 풀고, /root/site/current 심링크가 그 디렉터리를 가리키게 한다.
2. /root/release/switch.sh ROOT 판 을 만든다. 없는 판은 거부하고, current 가 사라지는 순간 없이 한 번에 전환한다.
3. /root/release/deploy.sh ROOT 빌드 PORT 를 만든다. 풀기·전환·옛 프로세스 교체·헬스체크(version 확인)·스모크 주문·deploy.log 기록까지 정상 빌드로 통과시킨다.
4. deploy.sh 가 스모크에 실패하면 current 를 직전 판으로 되돌리고 그 판을 다시 띄운 뒤 rolled_back·reason smoke 를 기록하고 종료 코드 2 로 끝나게 한다.
5. deploy.sh 의 헬스체크가 뜨자마자 죽는 판은 health 로 되돌리고, 2.5초 늦게 뜨는 정상 판은 기다려서 배포하게 한다. 대기 상한은 10초다.
6. /root/release/prune.sh ROOT KEEP 을 만든다. mtime 최신 KEEP 개를 남기되 current 와 직전 판은 지울 목록에서 뺀다.
7. 네 번 배포(마지막은 스모크 실패)와 보존 1 정리를 이어서 해도 기록·남은 판·응답하는 판이 맞는지 확인한다.
8. 고객의 1.5.0 을 deploy.sh 로 /root/site(포트 8480)에 배포해 결과를 보고, /root/release/incident.json 에 사건을 기록한다.
참고
- 재료: 실행 계약 /opt/lab/p1a-release/CONTRACT.md, 고객 메모 /opt/lab/p1a-release/README.md, 빌드 /opt/lab/p1a-release/builds/
- 빌드 안 보기: tar -tzf 빌드 파일, tar -xzOf 빌드 파일 VERSION
- 심링크 확인: readlink /root/site/current, ls -la /root/site
- 직접 시험: bash /root/release/deploy.sh /tmp/try /opt/lab/p1a-release/builds/orderapp-1.4.0.tar.gz 18480; cat /tmp/try/deploy.log
- 흔한 실수: ln -sf 에서 -n 빠뜨리기, 앱을 띄울 때 출력을 파일로 돌리지 않기(스크립트가 끝나지 않는다), 헬스체크에서 판을 확인하지 않기, 최신순으로만 정리하기.
- 시험용으로 띄운 앱은 끝나면 그 배포 루트의 shared/app.pid 로 골라 끈다.
단계 8개
- 첫 판을 손으로 풀고 current 걸기
- current 를 한 번에 바꾸는 전환 스크립트
- 풀고 바꾸고 띄우고 스모크까지
- 스모크가 깨지면 직전 판으로 되돌리기
- 죽은 판은 빨리, 늦은 판은 기다려서
- 정리하다 돌아갈 판을 지우지 않기
- 네 번 배포하고 정리해도 맞는 기록
- 고객의 1.5.0 을 배포하고 사건 기록 남기기