popmate Backend CI/CD

Jenkins, Docker

Posted by 김우원 on September 3, 2023

안녕하세요, 김우원입니다.

이번 포스트에서는 저희 born-stew팀의 popmate SpringBoot 프로젝트의 CI/CD 환경이 어떻게 구성되어 있는지 소개해 드리겠습니다.

CI/CD

CI/CD (Continuous Integration/Continuous Deployment)는 애플리케이션 개발 단계를 자동화 하여 더욱 짧은 주기로 고객에게 제공하는 방법입니다.

CI

CI(Continuous Integration)는 개발자를 위한 자동화 프로세스인 지속적인 통합을 의미합니다. CI가 제대로 구현되면, 코드의 새로운 변경 사항이 정기적으로 빌드 및 테스트를 거쳐 공유 레포지토리에 병합됩니다.

CD

CD는 두 가지 용어가 상호 교환하여 사용됩니다.

  • 지속적인 서비스 제공(Continuous Delivery)

    개발자들이 적용한 변경 사항이 테스트를 거쳐 레포지토리에 자동으로 업로드됩니다.

  • 지속적인 배포(Continuous Deployment)

    개발자의 변경 사항을 레포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것을 의미합니다.

CI/CD Flow

popmate CI/CD

popmate의 CI는 Github과 Github Action을 사용합니다. 개발자가 코드를 작성하고 Github에 PR을 날리면, GitHub Action이 Merge를 하기전에 프로젝트를 빌드하고, 테스트하는 과정 자동으로 수행합니다. 이 과정에서 문제가 발생하지 않으면 Merge를 할 수 있습니다.

코드가 배포 브랜치에 Merge가 되면, Jenkins가 WebHook을 통해 신호를 받아 CD 과정을 수행하도록 하였습니다.

image-20230903233506309

Jenkins

젠킨스(Jenkins)는 지속적 통합 및 지속적 배포(CI/CD)를 지원하는 오픈 소스 자동화 도구로, 소프트웨어 개발 프로세스를 자동화하고 효율적으로 관리하는 데 사용됩니다.

젠킨스의 프로젝트 구성(Freestyle)을 마지막으로 글을 마무리하도록 하겠습니다.

  1. 소스 코드 관리

    레포지토리 url을 설정합니다. 저희 처럼 레포지토리가 private인 경우 별도의 Credential 설정이 필요합니다. 그리고 어떤 브랜치의 코드를 배포할지 지정합니다.

    image-20230903225944119

  2. 빌드 유발

    위에서 연결한 레포지토리의 WebHook이 빌드를 유발하도록 하였습니다.

    image-20230903230253329

  3. Build steps

    레포지토리에서 코드를 pull받고, gradlew clean build를 수행합니다. 성공적으로 Build되면, 프로젝트의 Dockerfile을 이용해 프로젝트 이미지를 만들고 DockerHub에 Push합니다.

    1
    2
    3
    4
    5
    6
    
    #spring-boot dockerfile
    FROM openjdk:17-jdk
    LABEL maintainer="dyffh1031@gmail.com"
    ARG JAR_FILE=build/libs/popmate-0.0.1-SNAPSHOT.jar
    ADD ${JAR_FILE} docker-springboot.jar
    ENTRYPOINT ["java","-Dspring.profiles.active=local","-Djasypt.encryptor.password={password}","-jar","/docker-springboot.jar"]
    
    1
    2
    3
    
    docker login -u popmate -p {password}# docker.io
    docker build -t popmate/popmate-spring:0.0.1 .
    docker push popmate/popmate-spring:0.0.1
    
  4. 빌드 후 조치

    빌드가 성공적으로 마무리 되면, Discord로 수행 결과를 팀원에게 알리고, SpringBoot가 실행되고 있는 인스턴스에 SSH를 통해 명령어를 보냅니다. SpringBoot 인스턴스는 도커 허브로 부터 새로운 이미지를 받아 기존 프로그램을 중지하고 변경된 프로젝트를 실행합니다.

    1
    2
    3
    4
    
    docker login -u popmate -p {password}# docker.io
    docker pull popmate/popmate-spring:0.0.1
    docker ps -q --filter name=popmate-spring | grep -q . && docker rm -f $(docker ps -aq --filter name=popmate-spring)
    docker run -d --name popmate-spring -p 8080:8080 popmate/popmate-spring:0.0.1