← 전체 글로 돌아가기

웹 개발

앱 버전을 올렸는데 실제로는 올라가지 않았을 때

배포했는데 사용자들이 여전히 이전 버전을 보고 있다면, 캐시나 버전 태그를 확인해야 한다.

배포했는데 사용자들이 여전히 이전 버전을 보고 있다면, 답답한 상황이다. 버전 번호는 올라갔는데 실제 코드는 안 바뀐 걸 수도 있다.

배포된 버전이 맞는지 확인하기

먼저 서버에 올라간 파일이 실제로 최신인지 본다.

# 배포된 파일의 타임스탐프
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로 캐시를 삭제하라고 안내한다.

마지막 확인

버전이 제대로 올라갔는지 확인하려면:

  1. 서버의 파일 수정 시간이 배포 시간보다 최신인가?
  2. 파일 내용이 실제로 바뀌었는가?
  3. 캐시 헤더가 제대로 설정돼 있는가?
  4. 배포 로그에 성공이라고 나와 있는가?
  5. 사용자의 브라우저 캐시를 삭제했는가?

모두 맞다면 버전이 제대로 올라간 것이다.