목적 | GitHub 커밋 → Jenkins 빌드 → Docker 이미지 생성 및 배포 자동화 파이프라인 구축 |
환경 | 온프레미스 서버 A, B (임의 지정) |
역할 분담 | 역할 1: CI, 역할 2: CD (서로 교대 수행) |
툴 체계 | GitHub, Jenkins, Maven, Ansible, Docker, Docker Hub |
조건
- Jenkins가 GitHub에서 Java 웹 애플리케이션 소스 코드를 main 브랜치 기준으로 pull 받는다.
- Maven을 이용해 Jenkins가 프로젝트를 빌드하고 .war 파일을 생성한다.
- 생성된 .war 파일을 기반으로 Docker Tomcat 컨테이너에 배포한다.
- Tomcat은 기존 실행 중인 컨테이너를 중지하고 새 컨테이너를 자동으로 띄워야 한다.
- Jenkins Job은 GitHub Webhook 트리거로 자동 실행되도록 설정한다.
- Docker로 띄운 Tomcat은 8090 포트를 사용해 외부에 서비스된다.
파이프라인 구성
CI
- GitHub 저장소에 소스코드 커밋
- Jenkins가 GitHub로부터 변경사항을 감지하여 Pull
- Maven 또는 Gradle을 통해 .war 등 실행 가능한 빌드 산출물 생성
CD
- Jenkins 결과물 기반으로 Docker 이미지 빌드 (Ansible 사용)
- Docker Registry (Docker Hub 등)에 이미지 Push
- 원격 Docker 서버에서 컨테이너 자동 배포 및 서비스 실습
서버 권한 구성
젠킨스 설치
# 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
환경 구성
플러그인
Maven intergration plugin
github plugin
docker commons plugin
Publish Over SSH
Tools ->
Maven 경로 지정 : mvn -v 를 통해 확인
java 경로 지정 : mvn -v 를 통해 확인
System ->
SSH 설정
SSH sever 서버 생성 후 값 입력 및 패스워드 입력
자동화 ITEM 구성
자동화는 git에 패키지가 업로드 되고 빌드를 진행하며
빌드가 성공 시에 /opt/ansdoc에 war파일 -> 도커이미지 빌드 후 도커 허브에 업로드 가능하도록 구성한다
#빌드 후 명령어
sudo mkdir /opt/ansdoc
sudo chown ansdocadmin.ansdocadmin /opt/ansdoc
ansible-playbook /opt/ansdoc/4glapp_con.yaml;
sleep 10;
ansible-playbook /opt/ansdoc/ansco.yaml
docker 설치
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable --now docker
자동화 Yaml 파일
1. 도커 이미지 빌드
FROM tomcat:latest
RUN cp -R /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps
COPY ./*.war /usr/local/tomcat/webapps
~
2. 이미지 원격지 이미지 생성 및 업로드
---
- 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. 컨테이너 삭제 및 재생성, 배포 자동화
---
- hosts: project
tasks:
- name: stop_container
shell: docker stop sangmin2
ignore_errors: yes
- name: remove container
shell: docker rm sangmin2
ignore_errors: yes
- name: create container
shell: docker run -d --name sangmin2 -p 8090:8080 klksm2/sangmin2