CI/CD - Next와 Docker를 같이 쓰니 어렵다.(2)

Marullo·2020년 12월 13일
0

현재 반쪽짜리 CI/CD


구동 방식

나는 Web Server의 역할을 하는 Next.js와
API Server역할을 하는 Express를
각각의 이미지로 만들어, 두개의 컨테이너를 실행시키려고 한다.

  • 서버 Host OS위에 Jenkins와 Docker Engine이 구동된다.
  • Jenkins가 바라보고 있는 origin repo의 branch에서 push가 발생하면, webhook이 동작한다.
  • Github Webhook이 Jenkins를 wake up 시킨다.
  • 깨어난 Jenkins는 origin repo를 가져와서 Shell script를 run.
  • Shell script에서 docker image를 생성하고, container를 run 한다.

문제점

express의 경우, 간단한 DockerFile을 만들고, 프로젝트 레포지토리에 같이 push하면 된다.
Jenkins가 DockerFile을 읽어서, 이미지를 생성하고,
express server 구동에 필요한 환경변수는 docker run 명령어에 -e 옵션으로 넘겨주면 된다.
(물론 필요한 환경변수는 DockerFile이 아니라, Jenkins Workspace에 저장되어 있다.)

반면, Next.js의 경우 상황이 좀 어렵다.
Next image를 생성하기 위한 DockerFile은 다음과 같다.

...
run npm run build 
run npm start
...

Next는 build 시점에, ServerSideProps 함수를 동작시켜, 미리 data를 fetch한 후, HTML 페이지를 렌더링 한다. 만약 data fetch URL이 환경변수로 되어있다면!, build 시점에 환경변수를 가지고 있어야 한다.

express의 경우 docker run -e 형태로 Container를 구동시킬 때 넘겨주면 되었지만, next의 경우는 docker run 시점에 환경변수를 넘겨주는 것이 무의미하다.
따라서 build 시점에 환경변수를 들고 있어야 되는데, DockerFile에 env를 넣어두고 Github에 push한다는 것은 매우 위험한 일이다.

이래서 반쪽짜리 CI/CD라 한 것



해결방안 뇌피셜 List

이것을 해결하기 위한 방법이 무엇일까 많은 고민을 했다.

<1번 뇌피셜>

  1. 환경변수는 repo에 push하지 않고, 서버의 어느 한 디렉토리에 둔다.
  2. DockerFile의 volume 옵션으로(host의 디렉토리 공간을 공유 할 수 있다.) 환경변수를 읽어 온 후, 긁어온 Dockerfile에 삽입하여 build를 한다.

<2번 뇌피셜>

  1. 서버의 디렉토리에 두면, 환경변수 추가 삭제 귀찮다.(ssh 귀찮다.)
  2. 따라서, 내 로컬에 window docker, window Jenkins를 설치,
  3. Webhook으로 Window Jenkins가 동작, volume 옵션을 사용한 DockerFile로 image를 빌드
  4. window Jenkins는 Docker build를 하고, Docker Hub에 image를 push
  5. window Jenkins는, 바로, 서버에 ssh로 접속을 한 후, Docker Hub에서 image를 pull
  6. image를 pull 했으면, 바로 container run..

5주짜리 프로젝트가 1주일도 안남은 시점에서, 솔직히 단계가 너무 많아서 엄두가 안난다. 지금 반쪽 짜리 CI/CD를 그대로 쓰고 싶은 마음이 굴뚝같지만, 대충 한것은 안한 것만도 못해보이니.. 해내야 된다..

이래서 사람들이 DinD, DooD 처럼 Jenkins 자체도 image로 만드는가 싶다.. 힘드니까 나중에 돌려쓰려고

profile
한국외대 중국어&컴공 복수전공 - 세미 전공자의 기술 블로그

0개의 댓글