본문 바로가기

에러 해결

배포를 두번 해야 되는 문제를 해결해보자

배경

배포 과정에서 서비스가 멈추는 것을 방지하기 위해 blue green 방식을 사용하고 있었다.

 

jenkins 파이프라인을 사용해서 CI/CD를 자동화한다.

최신코드를 가져와서 빌드하고 빌드 파일을 전송하고 배포 스크립트를 실행시킨다. 

 

was는 A포트와 B포트 둘 중 하나에서 동작하고

현재 운영중인 버전이 A포트에서 동작한다면 새로 배포되는 버전은 B포트로 실행되고

헬스체크 이후 A포트에서 동작 중인 버전은 종료된다.

 

nginx는 reverse proxy로 사용되고 upstream 설정을 통해서 내부 was로 요청을 전달한다.

현재 운영중인 버전이 A포트에서 동작하고 새로 배포되는 버전이 B포트로 실행된다면 

nginx upstream에 B포트가 추가되어서 잠시동안 A포트와 B포트가 공존하게 된다.

이후 새로 배포되는 버전이 헬스체크를 통과하면 nginx upstream에서 A포트가 제거된다.

 

문제

이 프로젝트를 하는 팀에는 배포 룰이 있었다.

jenkins는 CI/CD를 자동화하는 툴이지만 배포를 할 때마다 jenkins에 들어가서 수동으로 한번 더 버튼을 눌러야했다.

왜 이렇게 해야하는지 아무도 모르고 있었고 모두가 관습적으로 하고 있었다.

 

이 문제를 해결하기 위해 운영 서버에서 여러가지 정보를 수집했다. 

정상적인 상황이라면 was가 A포트와 B포트 둘 중 하나만 실행되고 있어야하지만

프로세스를 조회해봤을 때 was가 A포트와 B포트 둘 다 실행되고 있었다.

A포트의 was는 정상 실행 중인 상태였고 B포트의 was는 응답을 하지 못하는 hang 상태였다.

 

원인

배포 스크립트에는 아래 명령어를 통해 해당 포트를 가진 pid를 조회하고 kill하고 있었다.

pid = $(lsof -i :"$port" -t)
kill -15 "$pid"

 

새로 B포트로 was를 실행할 경우

사전에 위 스크립트 로직을 사용해서 B포트를 가진 pid를 kill하는데

pid가 한개가 아닌 여러개가 조회되면서 kill을 제대로 못하고 있었다.

그래서 이후에 B포트로 was를 실행하면 포트가 이미 존재한다는 오류가 발생했던 것이다.