9oormthonUNIV 스터디 프로젝트

Jenkins + Docker를 활용한 기본 CI/CD 파이프라인 구축

연향동큰손 2025. 5. 10. 23:23

Jenkins와 Docker를 활용하여 CI/CD 파이프라인을 구축하는 과정을 공부했다.

 

사용되는 것

1) 두개의 EC2서버

  • Jenkins
  • Spring 서버

2) github webhook

 

3) jenkins-pipline

 

4) jenkinsFile

 

5) docker-compose

 

CI/CD 흐름

1. GitHub에서 코드 푸시

  • GitHub Webhook → Jenkins로 알림

2. Jenkins Pipeline 실행 (CI 단계)

  • Docker Image 빌드
  • 빌드된 이미지를 Docker Hub 저장소에 업로드
  • DooD방식 사용

3. Spring EC2 서버로 배포 (CD 단계)

  • EC2에 SSH 접속하여 최신 이미지로 컨테이너 재배포

 

구현 방법

 

1. jenkinsfile 생성

pipeline {
    agent any

    environment {
        DOCKER_IMAGE = "yangwoohyeon/jenkins-practice"
        DEPLOY_HOST = "ubuntu@Ec2인스턴스 IP 주소"

    }

    stages {

        stage('Build') {
            steps {
                sh './gradlew clean build -x test'
            }
        }

        stage('Docker Build') {
            steps {
                sh "docker build -t $DOCKER_IMAGE ."
            }
        }

        stage('Push to Docker Hub') {
            steps {
                withCredentials([usernamePassword(credentialsId: 'dockerhub-credentials', usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
                    sh 'echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin'
                    sh "docker push $DOCKER_IMAGE"
                }
            }
        }

        stage('Deploy to EC2-2') {
            steps {
                sshagent(['ec2-key']) {
                   sh """
                                           ssh -o StrictHostKeyChecking=no $DEPLOY_HOST "docker pull $DOCKER_IMAGE"
                                           ssh -o StrictHostKeyChecking=no $DEPLOY_HOST "cd ~/deploy && docker-compose down"
                                           ssh -o StrictHostKeyChecking=no $DEPLOY_HOST "cd ~/deploy && docker-compose up -d"
                                       """
                }
            }
        }

    }
}

 

 

 

2. Dockerfile 생성

FROM openjdk:21
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

 

 

3. docker-compose.yml 생성

version: '3'

services:
  jenkins:
    image: jenkins/jenkins:lts
    container_name: jenkins_cicd
    user: root
    ports:
      - "8080:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home
      - /var/run/docker.sock:/var/run/docker.sock

volumes:
  jenkins_home:

 

4. EC2(Jenkins) - Jenkins Container 실행

EC2(Jenkins)에서 Jenkins Container 실행

docker-compose up -d

 

 

이후 [server ip]:8080 로 접속하면 Jenkins UI가 보이게 된다.

 

비밀번호를 입력하라고 나오는데 해당 명령어를 통해 확인 가능하다.

docker logs jenkins

 

 

플러그인 설치는 Install suggested plugins 로 진행해주면 다운로드가 진행된다.

 

5. EC2(Jenkins) - Jenkins Job 설정

jenkins에 로그인을 하게 되면 다음과 같은 화면이 보이게 된다.

 

여기서 `새로운 Item` 을 클릭하여 pipeline을 생성해준다.

 

 

Pipeline 선택

 

 

GitHub project 선택 후 Project Url에 깃허브 리포지토리 주소 입력.

 

Triggers는 GitHub hook trigger for GITScm polling을 선택 해준다.

 

GitHub hook trigger 설정은 아래 블로그 글을 참고 했다.

 

Jenkins 깃허브 훅 설정 - GitHub hook trigger for GITScm Polling 설정하기

Jenkins에서 CI/CD를 구축하다 보니 "빌드 유발"에서 GitHub hook trigger for GITScm Polling가 존재했고 이에 이것을 어떻게 설정하는지 설명하고자 한다. 1. Github에서 세팅하기 1-1. Settings 들어가기 Jenkins의 CI

curiousjinan.tistory.com

 

Definition은 Pipeline script from SCM으로 선택해준다.

이렇게 해줘야 github 리포지토리에 있는 Jenkinsfile을 읽어서 파이프라인 작업을 수행할 수 있다.

Repository URL에는 깃허브 리포지토리 URL을 넣고 public 리포지토리인경우 Credential을 none으로 지정해준다.

Branch Specifier는 변경사항이 push될 브랜치로 설정하면 된다. 여기서 내 브랜치명은 main이라서 /*main으로 수정해줬다.

 

만약 private 리포지토리라면 Credentials값을 추가하여 연동해줘야 한다.

 

[Jenkins]Git 연동하기(Git Token 발급 + Jenkins Credential 등록)

안녕하세요 오늘은 git 에서 Token을 발급받아 Jenkins Credential에 등록해보겠습니다!먼저 Github Settings -> Developer settings -> Personal access token 항목에 들어갑니다 이후 Generate new

velog.io

 

 

6. DockerHub Repository 생성

 

Jenkins에서 빌드된 Docker 이미지를 DockerHub에 등록하기 위해  DockerHub에 리포지토리를 생성해줘야 한다.

 

 

7. Docker Hub Token 발급, jenkins Credentials에 등록

 

 

8. Jenkins Container 내부 접속 후 docker-cli 설치

Container 내부에서 도커를 사용하기 위해 DooD방식을 사용했다.

Docker out of Docker(DooD)란 호스트 도커 데몬이 사용하는 소켓을 공유하여 도커 클라이언트 컨테이너에서 컨테이너를 실행시키는 것을 말한다.

 

Jenkins Container로 접속

docker exec -it jenkins bash

 

그리고 Docker Cli를 설치한다.

apt-get update
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
apt-get install docker-ce-cli

 

 

9. Jenkins에 SSH 키 등록

 

  • Credentials > SSH username with private key
  • ID: ec2-key
  • Username: ubuntu
  • Private Key: .pem 키 내용 직접 입력

 

 

10.EC2(Jenkins) - SSH  Agent Plugin 설치

설치!

 

 

이제 로컬 환경에서 리포지토리로 push해주면 jenkins에서 Docker Image를 빌드하고 Docker Hub에 업로드 된 후 EC2(Spring)에 반영되는 것을 확인할 수 있다.