[AWS] 09. Jenkins CI/CD & Git Webhooks & SpringBoot

나도 가보자·2024년 7월 21일
post-thumbnail

💡 Git Webhooks란?

Git Webhook는 리포지토리 또는 조직에서 특정 작업이 발생할 때마다 외부 웹 서버로 전달할 알림 웹 서비스이다.


🔨 Jenkins CI/CD 초기 환경설정

1) Jenkins & Git Webhooks 연동

  • Github Repository로 이동 후 Settings 버튼을 클릭한다.

  • Webhooks 탭 클릭 후, Add webhook 버튼을 클릭한다.

  • Payload URL란에 아래의 형식으로 입력한다.

http://{서버 DNS 혹은 호스트 IP 주소}/github-webhook/
  • Content typeapplication/json 형식을 선택한다.


2) Docker SpringBoot Image 실행 환경 구성

  • 애플리케이션 프로젝트 최상단 루트에 Dockerfile을 생성한다.
# Java 21을 포함한 경량 JRE 이미지를 기반으로 설정
FROM bellsoft/liberica-openjdk-alpine:21

# 빌드된 JAR 파일을 컨테이너 이미지 내로 복사
COPY build/libs/itzip-0.0.1-SNAPSHOT.jar app.jar

# 컨테이너가 시작될 때 JAR 파일을 실행하는 명령어 설정
CMD ["java", "-jar", "app.jar"]
  • Docker-Compose 위한 docker-compose-springboot.yml을 파일 작성한다.
version: '3.9'

services:
  dev-backend:
    build:
      context: ./itzip_back
      dockerfile: Dockerfile
    image: jdk-21-spring-boot-3.3.1:latest
    container_name: dev-springboot
    ports:
      - "8080:8080"
    environment:
      - TZ=Asia/Seoul
    networks:
      - dev

networks:
  dev:
    external: true

3) Jenkins Gradel Build전 application.yml 복사

  • Add Credentials 버튼 클릭 후 Kind 영역에서 Secret file 선택 후 프로젝트 application.yml 파일 삽입한다.

4) Jenkins Pipeline Item 생성

  • + 새로운 item 버튼을 클릭한다.

  • item name 입력 후 Pipeline을 선택한다.


5) Pipeline 구성 설정

  • Item 설명란을 작성한다.
  • Do not allow the pipeline to resume if the controller restars : 파이프라인 실행 충돌을 방지한다.
  • GitHub Project : GitHub 프로젝트 주소을 연결한다.
  • GitHub hook trigger for GITScm polling : Git Webhooks 웹 서비스를 연결한다.

  • Definition 옵션에 Pipeline script 항목을 선택한다.
  • Script란에 Pipeline Code를 입력한다.

pipeline {
    agent any
        
    stages {
        
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/ITZipProject/itzip_back.git' // Git 저장소에서 main 브랜치 체크아웃
            }
        }
        
        stage('secret.yml download') {
            steps { 
            	// Secret file이 담긴 Credentials ID명 입력
                // dbConfigFile 변수에는 저장된 application.yml이 존재
                withCredentials([file(credentialsId: 'itzip_back_.env_file_for_springboot', variable: 'dbConfigFile')]) { 
                    sh '''
                        pwd
                        cp $dbConfigFile ./src/main/resources // application.yml를 해당 경로로 복사
                    '''
                }
            }
        }
        
        stage('Build') {
            steps {
                sh './gradlew clean'  // 이전 빌드 아티팩트 제거
                sh './gradlew build'  // 새로운 빌드 실행
            }
        }
        
        stage('Docker-Compose Build and Deploy') {
            steps {
                sh '''
                    cd ..
                    docker-compose -f docker-compose-springboot.yml down || true
                    docker rmi jdk-21-spring-boot-3.3.1:latest || true
                    docker-compose -f docker-compose-springboot.yml up -d --build
                '''
                /*
                 * 기존에 실행 중인 spring-boot 컨테이너가 존재할 경우 중지
                 * 기존의 jdk-21-spring-boot-3.3.1 이미지가 존재할 경우 제거
                 * 새로운 Docker 이미지를 빌드하여 태그 지정
                 * 새로 빌드된 이미지를 사용하여 컨테이너 실행
                 */
            }
        }
    }
}
profile
Developer CodeJesterND

0개의 댓글