Project

[Project]CI/CD 자동화 인프라 구축 프로젝트 (Jenkins + Docker + Ansible)

cumo 2025. 4. 30. 12:54

개요

본 프로젝트는 GitHub에 커밋된 Java 웹 애플리케이션 코드를 Jenkins를 통해 자동으로 빌드하고, Ansible을 이용하여 Docker 이미지를 생성 및 배포하는 CI/CD 파이프라인을 구축하는 것을 목표로 합니다.

시스템 아키텍처

  • CI 서버: Jenkins가 설치된 온프레미스 서버 A
  • CD 서버: Docker 컨테이너를 실행하는 온프레미스 서버 B
  • 코드 저장소: GitHub
  • 이미지 저장소: Docker Hub
  • 배포 대상: Tomcat 컨테이너 (포트 8090)

Continuous Integration (CI)

  1. 코드 커밋: 개발자가 GitHub의 main 브랜치에 코드 커밋
  2. Webhook 트리거: GitHub Webhook을 통해 Jenkins 빌드 자동 실행
  3. 빌드 및 패키징: Jenkins가 Maven을 사용하여 .war 파일 생성

Continuous Deployment (CD)

  1. Docker 이미지 생성: Ansible을 통해 .war 파일을 기반으로 Docker 이미지 빌드
  2. 이미지 푸시: 생성된 이미지를 Docker Hub에 푸시
  3. 컨테이너 배포: 원격 서버에서 기존 컨테이너를 중지하고 새로운 컨테이너를 실행하여 서비스 배포

Jenkins 환경 구성

Jenkins 설치

# Jenkins 공식 저장소 설정 파일을 /etc/yum.repos.d/에 다운로드
sudo wget -O /etc/yum.repos.d/jenkins.repo \
    https://pkg.jenkins.io/redhat-stable/jenkins.repo
# Jenkins 패키지 서명 키를 시스템에 등록 (패키지 무결성 확인용)
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
# Jenkins가 의존하는 fontconfig 라이브러리 설치 (그래픽/폰트 처리용)
sudo yum install fontconfig
# Jenkins 실행을 위한 Java 17 설치 (Amazon Corretto는 AWS에서 제공하는 OpenJDK)
sudo dnf -y install java-17-amazon-corretto
# Jenkins 패키지 설치 (이전 단계에서 설정한 저장소에서 설치됨)
sudo yum install jenkins
# systemd 데몬을 다시 로드 (새로운 서비스 유닛 파일을 인식하도록)
sudo systemctl daemon-reload

#접속 후 초기 패스워드 통해 로그인
sudo cat /var/lib/jenkins/secrets/initialAdminPassword

 

Tool 구성

# MVN 설정
mvn -v  # 출력된 maven 경로를 Jenkins > Global Tool Configuration에 등록
# Java 설정
mvn -v
mvn -v  # 출력된 java 경로를 Jenkins > Global Tool Configuration에 등록

플러그인 설치

  • Maven Integration Plugin
  • GitHub Plugin
  • Docker Commons Plugin
  • Publish Over SSH

시스템 설정

  • Maven 경로: mvn -v 명령어를 통해 확인된 경로 설정
  • Java 경로: mvn -v 명령어를 통해 확인된 경로 설정
  • SSH 설정: 원격 서버에 대한 SSH 서버 정보 입력 및 인증 설정

자동화 스크립트 구성

1. Dockerfile 

FROM tomcat:latest
RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps
COPY ./*.war /usr/local/tomcat/webapps

2. Ansible Playbook - 이미지 빌드 및 푸시

Image Build.yaml
---
- hosts: me
  tasks:
    - name: Build and push docker image
      community.docker.docker_image:
        name: klksm2/sangmin2
        source: build
        push: true
        build:
          path: /opt/ans

3. Ansible Playbook - 컨테이너 배포

---
- hosts: project
  tasks:
    - name: Stop existing container
      shell: docker stop sangmin2
      ignore_errors: yes

    - name: Remove existing container
      shell: docker rm sangmin2
      ignore_errors: yes

    - name: Run new container
      shell: docker run -d --name sangmin2 -p 8090:8080 klksm2/sangmin2

최종 출력 결과

후기

해당 프로젝트를 통해 Jenkins 환경과 호환 할 수 있는 Git , Docker , Ansible 을 통해 소스 변경시 자동으로 변경되도록
자동화를 구성함해 봄으로써 각 툴이 어떠한 방식으로 유기적으로 연결되고 실 서비스 환경에서 작업을 수행하고,

다른 도구와 호환 시에는 어떠한 역할을 수행 할 수 있는지 볼 수 있었다. 

 

추후 계획

단순히 tomcat WEB 어플리케이션이 다양한 툴이 복합적으로 각각의 컨테이너로써 작동하고 , 통합적인 시스템을 구성해보고자 한다.