본문 바로가기
프로젝트/Careers

Jenkins를 사용한 CD 구성

by 에어컨조아 2021. 8. 12.

각종 단위테스트, 빌드 테스트 등을 통과한 검증된 코드들은 실제 운영서버에 배포되어야 합니다.
이를 자동화 하기위해 Jenkins를 사용하였습니다.
이번 포스팅은 Jenkins를 사용하여 CD를 구현한 내용에 대해서 정리글이 될 것 같습니다.

🤔 서버에 배포 시 어떤 방식을 사용해야하나?

제가 생각했을 때 배포 방식은 크게 2가지 였습니다.

  1. 깃헙에 있는 코드를 clone하여 build후 실행시키는 것을 자동화하자
  2. 도커파일을 만들어서 도커허브에 올려둔 후 각 서버들은 pull받아 사용하자

결론적으로는 2번을 선택하여 배포를 하였습니다. 2번은 선택한 이유는 배포할 서버에 소스코드를 배포한다는 부분이 보안적으로 미흡하다 판단하였고, 빌드로 인한 서버쪽이 지저분해질 것 같았습니다. 또한 서버에 환경구성할 때 최소한의 패키지만 설치하길 원했습니다. 그래야 나중에 Scale out 시 별다른 무리없이 확장 할 수 있기 때문입니다.

뭐든지 단순한게 좋은 것 같습니다. 😅

그렇다면 Dockerfile을 어떻게 만들까요?? 이에대한 설명은 Spring 공식문서에 자세하게 나와있어 생략하도록 하겠습니다.

해당 문서를 통해서 Dockerfile을 만든 후 build하여 이미지로 만든 후 도커허브에 오려두어 서버가 pull받아 사용하도록 groovy 스크립트를 작성하였습니다.

자세한 스크립트 코드는 깃헙에 가셔서 Jenkinsfile-CD로 확인하실 수 있습니다.

그러면 CI때와 마찬가지로 파이프라인을 구성해 보겠습니다.
일단 CD구성에 필요한 플러그인을 설치합니다.

플러그인

Publish Over SSH 플러그인

sshPublisher를 사용하여 원격서버에 명령을 전달해야 하기때문에 을 설치합니다.

❗주의 : 이때 configName은 Jenkins 시스템 설정에서 SSH Servers를 설정한 서버들의 이름과 동일해야 합니다.

docker-pipeline 플러그인

pipeline 버전 2.5부터는 공식적으로 Jenkins에서 도커와 상호작용 하기 위해 내장된 플러그인을 지원합니다. 해당 플러그인을 설치하여 Jenkins에서 도커를 사용할 수 있도록 셋팅합니다.

❗미설치 시 groovy.lang.missingpropertyexception no such property docker for class groovy.lang.binding 에러 발생.

파이프라인 설정방법

우선 깃허브 프로젝트를 설정합니다.

빌드 트리거를 설정하여 깃허브에서 이슈가 발생 시 이벤트를 통해서 감지하도록 합니다.

GitHub hook trigger for GITScm polling은 깃헙에 push 요청이 들어올때 이를 감지하는 이벤트 입니다.

이젠 파이프라인을 설정해보겠습니다.

빌드 트리거에서 push이벤트를 감지 후 Refspec을 설정하여 많은 브렌치 중 특정 브렌치의 이벤트만 수신하여 동작하도록 설정할 수 있습니다. 해당 프로젝트에서는 배포는 main 브렌치를 설정하였습니다.

마지막으로 해당 파이프라인은 깃헙에 있는 Jenkins 스크립트 파일을 읽어 동작하므로 해당 스크립트 파일명을 동일하게 적어줍니다.

배포 시 주의 사항

도커 허브 연동

Jenkins를 통해서 Docker-hub에 배포를 하기위해서는 Jenkins에서 해당 Docker-hub로 접속할 수 있어야 합니다. 이를 설정하기 위해서 Jenkins에 docker-hub에 로그인한 Id, pw를 입력하여야 합니다.

이때 주의해야될 점은 프로젝트에 만든 Jenkinsfile-CD의 내용을 보면 registryCredential설정한 부분이 있습니다.

registryCredential = 'docker-hub'


해당 설정한 docker-hub와 Jenkins에 docker-hub계정을 등록 시 ID를 동일하게 설정해주셔야 합니다.

env파일을 사용하여 설정값 전달

진행하고있는 프로젝트는 세션 스토리지, Mysql 등의 설정값들이 필요합니다.

이러한 설정값들은 private한 정보들이기 때문에 각각의 서버에다가 직접 .env파일을 만들어서 도커컨테이너를 실행할때 해당 환경변수 파일을 매개변수로 전달받아 동작하도록 설정하였습니다.

❗주의 : 애플리케이션을 docker로 배포함에 따라 반드시 다른 서버들과 통신하기위한 포트를 열어두어야 합니다. 예를들어 구성되어있는 Mysql서버가 기본포트인 3306으로 동작하고 있다면 docker를 실행 시 port를 바인딩하여 수신 및 요청할 수 있도록 합니다.

Reference

https://spring.io/guides/gs/spring-boot-docker/
https://plugins.jenkins.io/publish-over-ssh/
https://www.jenkins.io/doc/book/pipeline/docker/

댓글