개발 기록

> [ CI/CD ] Docker & Jenkins & Spring boot CI/CD - 1.설계 본문

인프라

> [ CI/CD ] Docker & Jenkins & Spring boot CI/CD - 1.설계

1z 2024. 3. 8. 19:07

 

 

 

 

 

CI(Continuous Integration)
: 코드 변경 사항을 소스 코드 리포지토리에 자동으로 통합하는 것을 말한다.

CD(Continuous Delivery/Deployment) 
- 지속적 제공 : 빌드와 단위 및 통합 테스트를 자동화한 다음 검증된 코드를 리포지토리로 릴리스하는 것의 자동화
- 지속적 배포 : CI 부터 배포까지 모든 과정 자동화

CI/CD Tool:   Jenkins, CircleCI, Travis CI, AWS Code Pipeline/CodeDeploy, GithubAction
(CI/CD 더 알아보기)

 

 

1. CI/CD 환경 준비    

 

▶ 1. AWS EC2 인스턴스 생성 (Ubuntu)

▶ 2. EC2  도커 설치

▶ 3. Docker Hub Repository 생성

4. Github Repository 에  Spring Boot Project 올리기

 


 

2. CI/CD 시나리오  

 

(0) 시나리오

시나리오 A - 컨테이너로 빌드/배포 서버 구분

 

시나리오 A (ec2 인스턴스가 1개일 때) - DIND

 

 시나리오 B - 빌드/배포 서버 분리하여 운영

시나리오 B (ec2 인스턴스가 2개일 때)

 

(1) CI/CD 진행 순서 

branch push 이벤트 발생시 Webhook이 걸려 젠킨스 Pipeline 진행

② 젠킨스가 Build 해 준 결과 도커 이미지로 빌드한다.

③ 도커허브에 ②번에서 발생한 이미지를 올린다.

시나리오 A: host 도커에서  이미지를 pull 받아 컨테이너를 실행한다.

시나리오 B : 배포 서버에서 이미지를 pull 받아 컨테이너를 실행해 자동 배포한다.

 

 

 

(2) CI/CD 구성 순서  

젠킨스 서버 생성

Pull Jenkins image 

젠킨스 컨테이너에 도커 설치(DIND or DOOD)

Jenkins 이미지를 컨테이너로 실행

 

젠킨스 환경 설정

도커허브/깃허브 인증정보 등록

 

Github Wehook 생성

: -젠킨스에서 Github 에서 발생하는 event  구독

 

젠키스 파이프 라인 구성

Github repository 소스코드 내려받기 

②  Gradle Build  : 프로젝트 내부의 gradlew로 build 수행

Docker Image Build

 : 해당 이미지 기반의 컨테이너로 실행될 떄 jar 파일 실행

 : 이미지 태그: github Commit id

Docker Hub Image Push

 

  EC2 SSH 원격 접속

Pull Docker Image

Docker Run

- 기존에 실행중인 컨테이너 종료
- 새로운 컨테이너 구동

 

 

 


3. 배포 이슈   

 

젠킨스 서버에서 이미지를 빌드하고, Spring boot Project 컨테이너를 띄우는 방법에 대해서 여러가지를 시도를 해봤는데 답을 못찾았다.. 

방법 1

: 호스트 도커에 Spring boot Project 컨테이너를 띄운다.

1-1. DOOD 일 때

: 젠킨스 컨테이너와 호스트 도커의 docker.sock 을 볼륨으로 연결한다. 젠킨스 컨테이너에서 발생하는 클라이언트 명령어를 호스트 도커의 데몬이 받도록 한다. (jenkins pipeline ssh step)

1-2. DIND 일 때

EC2 에 원격접속하여 도커 명령어 실행

TCP 소켓 통신으로 호스트 네트워크와 연결하여, 호스트 네트워크에 도커 명령어를 실행한다.

(TCP 활성화 방법, 원격으로 Host Docker 이용방법)

docker.withServer('tcp://swarm.example.com:2376', 'swarm-certs') {
    docker.image('mysql:8-oracle').withRun('-p 3306:3306') {
        /* do things */
    }

 

방법 2

: 빌드서버, 배포서버를 각각 운영한다. 젠킨스 서버에서 배포서버로 원격접속(SSH)을 하여 이미지를 pull 받고 실행한다.  

 

 

참고

https://www.itworld.co.kr/howto/212219#csidx41203997a02377aac4696432a0305c0