웹 개발
앱 버전을 올렸는데 실제로는 올라가지 않았을 때
배포했는데 사용자들이 여전히 이전 버전을 보고 있다면, 캐시나 버전 태그를 확인해야 한다.
배포했는데 사용자들이 여전히 이전 버전을 보고 있다면, 답답한 상황이다. 버전 번호는 올라갔는데 실제 코드는 안 바뀐 걸 수도 있다.
배포된 버전이 맞는지 확인하기
먼저 서버에 올라간 파일이 실제로 최신인지 본다.
# 배포된 파일의 타임스탐프
ls -lah /opt/myapp/public/app.js
# 파일 내용에 버전이 들어 있는가?
head -20 /opt/myapp/public/app.js | grep -i 'version'
# 현재 실행 중인 프로세스
ps aux | grep app
ls -lah /proc/<pid>/exe
파일 수정 시간이 배포 시간보다 오래됐다면, 배포가 제대로 안 됐다는 뜻이다.
빌드 버전 확인하기
# 빌드된 파일에 버전이 있는가?
grep -r "version" dist/
grep -r "BUILD_TIME" dist/
# 아니면 파일 크기나 내용으로 비교
ls -lah dist/app.js
sha256sum dist/app.js
JavaScript 번들에 버전을 남겨두면, 사용자가 어느 버전을 보고 있는지 확인할 수 있다.
캐시 때문일 가능성
브라우저나 CDN이 캐시해둔 이전 버전을 보여줄 수도 있다.
# 프로덕션 파일의 캐시 헤더 확인
curl -I https://example.com/app.js
# Cache-Control 헤더가 어떻게 설정돼 있는가?
# Cache-Control: max-age=31536000 <- 1년 캐시
# 또는
# Cache-Control: no-cache, no-store <- 캐시 안 함
만약 max-age가 크다면, 구 버전을 계속 캐시할 수 있다. 파일 이름에 해시를 붙여서 app.abc123.js 같이 만들면 캐시를 무시할 수 있다.
버전 태그 확인하기
# 현재 배포된 커밋 확인
git log -1 --format=%H /opt/myapp/
# 또는 태그로 확인
git describe --tags --always
# 마지막 배포 시간
ls -l /opt/myapp/.deploy_time
커밋 해시를 서버에 남겨두면, 어느 버전이 배포됐는지 추적할 수 있다.
배포 로그 확인하기
# 배포 도구의 로그
cat /var/log/deploy.log
journal -u deployment -n 100
# 또는 배포 플랫폼의 대시보드
# Heroku: heroku logs
# AWS: CloudWatch
# Docker: docker logs
배포가 성공했다고 나왔지만, 실제론 실패했을 수도 있다.
버전 번호를 빌드에 포함시키기
앞으로는 이런 문제를 줄이기 위해 버전을 명확히 해두자.
# package.json에서 버전 읽기
VERSION=$(jq -r '.version' package.json)
# 빌드 시 버전 주입
build --define VERSION=$VERSION
# 또는 빌드 날짜 주입
BUILD_DATE=$(date -u +'%Y-%m-%d %H:%M:%S')
이렇게 하면 배포된 파일을 열어봐도 언제 빌드됐는지 알 수 있다.
사용자에게 캐시 삭제 요청하기
혹시 사용자의 브라우저 캐시 때문이라면:
# HTML에 캐시 무시 헤더 추가
<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
# 또는 서비스 워커 업데이트 강제
self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.map(cacheName => caches.delete(cacheName))
);
})
);
});
또는 사용자에게 Ctrl+Shift+Delete로 캐시를 삭제하라고 안내한다.
마지막 확인
버전이 제대로 올라갔는지 확인하려면:
- 서버의 파일 수정 시간이 배포 시간보다 최신인가?
- 파일 내용이 실제로 바뀌었는가?
- 캐시 헤더가 제대로 설정돼 있는가?
- 배포 로그에 성공이라고 나와 있는가?
- 사용자의 브라우저 캐시를 삭제했는가?
모두 맞다면 버전이 제대로 올라간 것이다.