본문 바로가기
SpringBoot/배포 및 운영

CI/CD (GitHub Actions, Jenkins)

by DEVLIB 2025. 4. 16.
728x90

CI/CD란?

단계
설명
CI (Continuous Integration) 코드 푸시마다 자동 빌드/테스트
CD (Continuous Deployment) 테스트 통과 시 자동 배포까지 실행

1. GitHub Actions로 CI/CD 구현

.github/workflows/deploy.yml

name: Spring Boot CI/CD

on:
  push:
    branches: [ "main" ]

jobs:
  build-deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set up JDK
        uses: actions/setup-java@v3
        with:
          java-version: '17'

      - name: Grant execute permission for Gradle
        run: chmod +x ./gradlew

      - name: Build with Gradle
        run: ./gradlew clean build

      - name: Deploy to EC2
        uses: appleboy/scp-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ec2-user
          key: ${{ secrets.EC2_KEY }}
          source: "build/libs/*.jar"
          target: "/home/ec2-user"

      - name: Run on EC2
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.EC2_HOST }}
          username: ec2-user
          key: ${{ secrets.EC2_KEY }}
          script: |
            pkill -f 'java -jar' || true
            nohup java -jar /home/ec2-user/myapp-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

GitHub Secrets 설정

이름 설명
EC2_HOST EC2 퍼블릭 IP
EC2_KEY .pem 내용 전체 복사
EC2_USERNAME 일반적으로 ec2-user

2. Jenkins로 CI/CD 구현

구성 요소

  • Jenkins 설치 (EC2 또는 로컬)
  • Git, Java, Gradle 설치
  • Jenkins Pipeline 플러그인 설치

Jenkinsfile (프로젝트 루트에 생성)

pipeline {
    agent any

    stages {
        stage('Clone') {
            steps {
                git 'https://github.com/your-repo/spring-boot-project.git'
            }
        }

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

        stage('Deploy') {
            steps {
                sh '''
                scp -i ~/.ssh/your-key.pem build/libs/*.jar ec2-user@your-ec2:/home/ec2-user/
                ssh -i ~/.ssh/your-key.pem ec2-user@your-ec2 << EOF
                pkill -f 'java -jar' || true
                nohup java -jar /home/ec2-user/myapp-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
                EOF
                '''
            }
        }
    }
}

Jenkins는 빌드 상태 UI 제공, 다양한 플러그인 지원 등의 장점이 있습니다.


GitHub Actions vs Jenkins 비교

항목 GitHub Actions Jenkins
설치 여부 없음 (GitHub 내장) 서버 직접 설치
설정 방식 YML 파일 UI + Jenkinsfile
적합 대상 소형 프로젝트, GitHub 기반 기업용, 다양한 VCS 연동
확장성 Actions 마켓 활용 플러그인 무한 확장
UI/모니터링 간단한 로그 강력한 빌드 대시보드

마무리 요약

단계 설명
CI 빌드 + 테스트 자동화
CD EC2 배포 자동화
GitHub Actions 빠른 구성, 깃허브에 최적화
Jenkins 확장성↑, 복잡한 워크플로우 가능
공통 요소 SSH, JAR 복사, nohup java -jar 실행
LIST

'SpringBoot > 배포 및 운영' 카테고리의 다른 글

로그 관리(Logback, Log4j2)  (0) 2025.04.16
AWS EC2에 배포하기  (0) 2025.04.16
Spring Boot 패키징(JAR, WAR)  (1) 2025.04.15