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)
- 코드 커밋: 개발자가 GitHub의 main 브랜치에 코드 커밋
- Webhook 트리거: GitHub Webhook을 통해 Jenkins 빌드 자동 실행
- 빌드 및 패키징: Jenkins가 Maven을 사용하여 .war 파일 생성
Continuous Deployment (CD)
- Docker 이미지 생성: Ansible을 통해 .war 파일을 기반으로 Docker 이미지 빌드
- 이미지 푸시: 생성된 이미지를 Docker Hub에 푸시
- 컨테이너 배포: 원격 서버에서 기존 컨테이너를 중지하고 새로운 컨테이너를 실행하여 서비스 배포
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 어플리케이션이 다양한 툴이 복합적으로 각각의 컨테이너로써 작동하고 , 통합적인 시스템을 구성해보고자 한다.