• 박남준

젠킨스를 활용한 CI/CD 자동화



젠킨스(Jenkins)란?

  • 소프트웨어 개발 시 지속적으로 통합 서비스를 제공하는 툴(CI - Continuous Integration)

  • 다수의 개발자들이 하나의 프로그램을 개발할 때 버전 충돌을 방지하기 위해 각자 작업한 내용을 공유영역에 있는 저장소에 빈번히 업로드함으로써 지속적 통합이 가능

💡 CI/CD란?
  • CI (Continuous Integration) : 여러 개발자들의 코드를 계속해서 통합하는 것

  • CD (Continuous Delivery) : 개발자들이 코드를 계속 작성하면, 사용자 및 내부 사용자들이 계속 쓸 수 있게 만드는 것 → 지속적으로 배포가능한 상태를 유지하는 것

이전의 배포 방식

  • 이전의 배포의 과정

  1. 코드를 코드저장소에 push

  2. 로컬 환경에서 프로젝트 build

  3. 추출물을 테스트 서버로 전송

  4. 배포 스크립트를 통해 배포

  5. 테스트 진행

  6. 테스트 완료 후 코드저장소 release 브랜치에 push

  7. 버저닝 후 로컬 환경에서 프로젝트 빌드

  8. 추출물을 본 서버로 전송

  9. 배포 스크립트를 통해 배포

  • 문제점

  1. 배포의 진행사항, 배포시기, 이슈 등을 수기로 작성하고 개발환경을 프로젝트에 맞게 셋팅해야함

  2. 반복되는 push, build, 전송, 배포 등을 하는데에 불필요한 시간이 많이 듦


젠킨스의 자동화 배포


젠킨스를 사용하는 이유

  • 로컬에서 개발한 소스를 수작업으로 서버에 올린 후 쿠버네티스 클러스터에 컨테이너로 배포한다는 것은 말도 안되는 일!

  • BUT, 쿠버네티스 위에 CI/CD pipeline을 만들면 로컬에서 어플리케이션 개발 후 gitpush하면 자동으로 서버 내 쿠버네티스 클러스터에 배포가 됨

젠킨스의 이점

  • 결합 테스트 환경에 대한 배포 작업 실시

  • 정적 코드 분석에 의한 코딩 규약 준수 여부 체크

  • 자동화 테스트 수행

  • 프로젝트 표준 컴파일 환경에서의 컴파일 오류 검출

  • 프로파일링 툴을 이용한 소스 변경애 따른 성능 변화 감시

동적 젠킨스의 장점

  • 쉽게 확장할 수 있음

고정된 노드가 아니라 동적으로 Pod를 생성하고 없애기 때문에 작업 부하가 커지면 Pod개수만

늘리면 됌

  • 리소스를 효율적으로 사용 가능

노드가 고정되어있지 않으므로 Jenkins 작업이 없을 때는 다른 작업에 리소스를 사용할 수 있음

  • 클러스터를 관리하기 쉬움

클러스터에 대한 모니터링, 로깅, 운영을 전적으로 쿠버네티스에게 맡길 수 있음


동적 젠킨스의 단점

  • Node 생성 시간이 소요

Jenkins 작업을 수행할 때마다 node(pod)를 새로 생성해야 하기 때문에 지연시간이 발생

  • Node의 수행 결과가 사라짐

node에 해당하는 pod는 생성되고 없어짐을 반복한다. 따라서 pod에서 수행한 작업의 결과가

사라지게 된다

  • 디버깅이 어려움

pod가 사라질 때 로그도 함께 사라지므로 디버깅이 어려움


CI/CD pipeline 구성도


  1. 개발자가 개발한 코드를 소스저장소(github, gitlab)에 push

  2. 소스저장소의 WebHooks을 통해 Jenkins이 소스코드를 가져옴

  3. Jenkins에서 테스트, 컨테이너 빌드 등 배포 수행

  4. Docker 저장소에 build, image push 수행

  5. Kubernetes 컨테이너 배포


젠킨스와 쿠버네티스와의 관계

  • 쿠버네티스에 젠킨스를 설치하는 이유

쿠버네티스 환경에서만 동작하는 소스코드가 kube-apiserver와 같은 쿠버네티스 컴포넌트와

상호작용하며 Unit Test를 쿠버네티스 pod에서 실행할 수 있음 젠킨스에서 Volume MountConfigMap, Secret 등의 쿠버네스 기능을 사용할 수 있음

  • 쿠버네티스와 젠킨스의 관계

앞서 CI/CD pipeline 구성을 말한 것처럼, 젠킨스의 플러그인 중 쿠버네티스의 관련 많은 기능

들이 지원되며 쿠버네티스 자동화배포의 최적화 되어있음


젠킨스를 적용한 애자일웍스

  • 화면

스크립트에서 정의한대로 젠킨스이 자동화 빌드를 해줌

  1. 먼저 Checkout을 통해 빌드가능상태인지를 확인함

  2. SpringBootGradle 빌드를 진행

  3. Docker 빌드를 진행

  4. 쿠버네티스 pod를 생성하고 실행시킴

  • 로그

자동화 빌드의 과정을 log을 통해 확인 할 수 있음

  • 빌드진행현황

젠킨스의 Blue Ocean을 통해 빌드 진행 과정을 시각화로 볼 수 있음

현재 빌드를 병렬처리로 진행되어짐

💡 젠킨스 병렬 빌드

  • 비슷한 성격의 Job들을 병렬로 처리함

  • 빌드 시에 속도를 빠르게 간단하게 처리가능해짐

  • parallel로 병렬로 동시에 stagejob을 처리함




마치며,


현재 젠킨스와 같은 많은 툴들이 나와 보다 빠르고 정확하게 자동화 환경을 구축하고 있습니다.

애자일그로스도 시대에 맞는 가장 적합한 기술들을 적용해 ‘애자일’ 다운 모습으로 변화가겠습니다.

이상, 사소한 경험이 뼈가 되고 살이 되는 애자일그로스였습니다.


출처 : https://ikarimov.com/img/pipeline.jpg

조회수 1,884회

최근 게시물

전체 보기