CI/CD - Jenkins & Tomcat 2

letthem·2025년 3월 21일

LG CNS AM CAMP 1기

목록 보기
37/42
post-thumbnail

docker에 Jenkins 와 tomcat 올라간 상태

docker exec -it jenkins-server bash
cd /var/jenkins_home/workspace/My-Second-Project

Jenkins


  • Maven 빌드를 위해서는 repository 폴더 필요
    -> Jenkins에 Maven 플러그인을 설치하면 Jenkins 컨테이너 내부에 repository 폴더 생성됨
  • repository가 외부에 존재하고(public repository), Jenkins가 Private 클라우드 안에 존재하는 경우
    1. 외부에서 다운로드 받은 후에 Jenkins로 복사
    2. 공유 폴더 사용
    3. private(내부) repository 구성
    4. Proxy -> 인터넷 연결 허용
    5. Maven 빌드 + 이미지 생성 (이 과정에서 원하는 repository 포함) -> 결과물을 배포

빌드해서 jar(결과파일) 만들려고 maven repository 하는 것임

로컬 환경에서 빌드 + Tomcat 서버에 배포

cd C:\Work\git\cicd-web-project
mvn clean compile package -DskipTests=true

target 디렉토리에 var 파일생성 확인



배치 클릭

=> TOMCAT 이라는 WAS 서버에 배포된 것임!


Tomcat 컨테이너 내부 war 파일 업로드 확인

docker exec -it tomcat bash
cd webapps/
ls -al

수작업으로 수정 및 재배포

  1. 소스코드 변경
  2. 다시 빌드 (mvn clean compile package -DskipTests=true)
  3. Tomcat Manager App 가서 이전 war 파일 배치 중지 + 제거
  4. 새로 빌드된 war 파일 배치

수작업 배포 -> downtime이 생긴다

=> Jenkins에서 자동화 해보자 ! ❤️


My-Third-Project


docker network inspect bridge

  • tomcat: 172.17.0.3
  • jenkins-server: 172.17.0.2

Maven + Git + Tomcat 파이프라인 구축

빌드까지 하면 war 파일 얻을 수 있는데
이 war 파일로 무언갈(배포 등) 하려면
빌드 후 조치에 설정해줘야 한다.




=> 배포 잘 됨!!

이제 깃허브에 코드만 바꾸고 커밋했는데
빌드 버튼만 누르면 바로 반영됨 🔽

❓ My-Third-Project 에서 CI/CD가 쓰였을까?

❤️ YES! ✅

CI: git 코드 maven 테스트 -> 빌드하는 과정

  • test 과정
  • compile : 빌드
  • package : war 파일 만들기

CD: tomcat 에 배포하는 과정


Jenkins + Docker runtime

My-Docker-Service

SSH Server + docker runtime 설치

(초록색 터미널)

MacOS 🔽
https://hub.docker.com/r/edowon0623/docker-server
Windows 🔽
https://hub.docker.com/r/edowon0623/docker
docker pull edowon0623/docker:no_iptables

  • Windows4) SSH 서버 (with 도커 + no_iptables) 실행 명령어 (방법4, 위 명령어로 실행되지 않을 경우, iptables 사용하지 않고 실행, Windows 11의 경우)
    docker run --privileged -itd --name docker-server -p 10022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:rw --cgroupns=host edowon0623/docker:no_iptables /usr/sbin/init

  • 도커 컨테이너 내부에 도커를 설치한 형태

접속

ssh root@127.0.0.1 -p 10022 💫💫💫💫💫
P@ssw0rd
-> [root@641fc028e14f ~]#

ssh client
terminus 설치

처음 서버 생성 후 접속 시 docker client만 존재
docker server 시작 필요 🔽

한 번만 하면 됨
systemctl enable docker

도커 기동
systemctl start docker

도커 상태 보기
systemctl status docker

docker version

다른 윈도우 터미널 (노란색) 에서
docker run --privileged -itd --name tomcat-server -p 20022:22 -e container=docker --tmpfs /run --tmpfs /tmp -v /sys/fs/cgroup:/sys/fs/cgroup:rw --cgroupns=host edowon0623/docker:no_iptables /usr/sbin/init

리눅스 ssh client 접속
ssh root@127.0.0.1 -p 20022

노란색을 초록색에 띄우려고 한다 !

  • tomcat server(172.17.0.5) 에서 docker server(172.17.0.4)에 SSH 접속
  • 컨테이너간 통신에서는 포트번호(22) 생략
  • SSH 접속 후 host ID 동일한지 확인

초록색 hostname -i -> 172.17.0.4
노란색 hostname -i -> 172.17.0.5

노란색에서 ssh root@172.17.0.4

[root@641fc028e14f ~]# -> 초록색으로 접속되었다 !! 즉, 어느 PC에서나 접근 가능하다

Jenkins 파이프라인 구성

CI

  1. Jenkins 빌드를 통해 war 파일 생성
  2. (SSH Server + Docker runtime) 컨테이너1에서 war 파일로 Docker Build
  3. 도커허브에 생성된 Docker Image push

CD

  1. (SSH Server + Docker runtime) 컨테이너2에서 Docker Image pull + run

SSH 서버 생성

My-Docker-Project 만들자 (My-Third-Project 가져오기)

dashboard > Jenkins 관리> System

  • Root Directory: .
    • SSH 접속했을 때 루트 디렉토리: 현재 디렉토리( . )

  • Password: P@ssw0rd

생성된 war 파일 전달

  • Remove prefix: target 제거

Jenkins 프로젝트 구성에 Docker Image Build 명령어 추가


; : 명령어의 끝 의미

빌드 결과

[root@641fc028e14f ~]# docker images

여기까지 CI 작업 !!!

0개의 댓글