CI/CD 도구(예: Jenkins, GitHub Actions)의 비교와 선택 기준은 무엇인가요?

김상욱·2025년 1월 12일

CI/CD 도구(예: Jenkins, GitHub Actions)의 비교와 선택 기준은 무엇인가요?

CI/CD 도구는 소프트웨어 개발 프로세스에서 지속적인 통합과 지속적인 배포/전개를 자동화하여 개발자의 생산성을 톺이고, 배포 품질을 향상시키는데 도움을 줍니다. 대표적인 도구로 Jenkins와 Github Actions가 있다.

Jenkins

주요 특징

  • 오픈소스 & 커스터마이징 : Jenkins는 오픈소스 CI/CD 도구로, 수많은 플러그인을 통해 매우 유연하게 커스터마이징 할 수 있습니다. 다양한 언어와 프레임워크를 지원합니다.
  • 독립적인 서버 운영 : Jenkins 서버를 별도로 설치하고 운영해야 하며 서버 관리 및 유지보수에 대한 부담이 있습니다.
  • 플러그인 에코시스템 : 플러그인을 통해 빌드, 테스트, 배포 등 거의 모든 단계에 대해 확장이 가능하지만, 플러그인 간 호환성 문제가 발생할 가능성도 있습니다.

장점

  • 유연성 : 복잡한 빌드 파이프라인 및 커스터마이징이 필요한 환경에서 매우 유용합니다.
  • 대규모 환경 : 대규모 프로젝트나 엔터프라이즈 환경에서 널리 사용되며, 다양한 확장 기능을 제공
  • 다양한 커뮤니티 지원 : 오랜 기간 사용되어 온 만큼, 다양한 자료와 커뮤니티 지원이 있습니다.

단점

  • 설정 및 유지보수 : 초기 설정이 복잡할 수 있고, 서버 유지보수가 필요하여 인프라 관리에 추가적인 노력이 들어갑니다.
  • 플러그인 관리 : 플러그인 업데이트 및 호환성 이슈 관리가 번거로울 수 있습니다.

GitHub Actions

주요 특징

  • GitHub와의 통합 : GitHub Actions는 GitHub 저장소와 밀접하게 통합되어 있어 PR 생성이나 push 등의 이벤트 기반 자동화가 쉽게 가능합니다.
  • YAML 기반 워크플로우 : GitHub Actions는 YAML 파일로 워크플로우를 정의하며, 비교적 간단하고 직관적인 설정이 가능합니다.
  • 관리 부담 경감 : 별도의 CI 서버를 운영할 필요 없이 GitHub에서 관리하므로 초기 설정과 유지보수가 용이합니다.

장점

  • 쉬운 설정 : GitHub 저장소를 사용하고 있다면, 바로 사용할 수 있어 빠른 시작이 가능합니다.
  • 비용 효율성 : 작은 프로젝트나 오픈소스 프로젝트의 경우, 무료 플랜으로도 충분히 활용할 수 있습니다.
  • 자동화 워크 플로우 : 이벤트 기반 트리거로 인해 GitHub 내 활동과 쉽게 연동되어 빌드 및 배포 자동화가 용이합니다.

단점

  • 제한된 유연성 : 복잡하거나 특수한 요구사항이 있는 경우 Jenkins보다 유연성이 떨어질 수 있습니다.
  • 런너 제한 : GitHub Actions의 무료 런너 사용량에는 제한이 있으며, 대규모 프로젝트라면 비용 문제가 발생할 수 있습니다.
  • GitHub 종속성 : GitHub Actions는 GitHub에 종속적이므로 다른 VCS(버전 관리 시스템)를 사용하는 경우에는 분리할 수 있습니다.

선택 기준

프로젝트 및 팀 환경

  • 저장소 위치 : 프로젝트가 GitHub에 있다면 GitHub Actions를 사용하는 것이 설정과 통합 측면에서 유리합니다. GitHub 외의 저장소(GitLab, Bitbucket 등)를 사용하거나 여러 저장소에 걸쳐 CI/CD가 필요하다면 Jenkins가 더 유연할 수 있습니다.
  • 인프라 관리 가능성 : 만약 인프라나 서버 관리에 익숙하지 않다면 GitHub ACtions와 같은 클라우드 기반 CI/CD 도구를 선택하는 것이 초기 부담을 줄일 수 있습니다. 서버 관리나 커스터마이징에 대해 배우고 싶다면 Jenkins로 시작하는 것도 좋은 경험이 될 수 있습니다.

빌드 파이프라인 복잡도

  • 심플한 파이프라인 : 간단한 빌드/테스트/배포 프로세스를 구현하는 경우 GitHub Actions가 더 간단하고 빠르게 설정할 수 있습니다.
  • 복잡한 파이프라인 : 복잡한 파이프라인(예: 다양한 환경 빌드, 특수 플러그인 활용, 다중 단계 워크플로우 등)이 필요한 경우 Jenkins가 제공하는 풍부한 플러그인과 커스터마이징 기능이 유리합니다.

비용 및 유지보수

  • GitHub Actions는 소규모 또는 오픈소스 프로젝트의 경우 무료 플랜이 꽤 유리합니다.

  • Jenkins는 호스팅 시 서버 운영 비용이 발생할 수 있지만, 플러그인이나 기능 면에서 비용보다 효율적일 수 있습니다.

  • 유지보수 요구사항 : 만약 유지보수나 업데이트에 신경 쓰기 부담된다면 클라우드 기반 서비스가 편합니다.


취준 및 신입 Java/Spring 백엔드 개발자로서 CI/CD 개념을 체험하고 실습할 수 있는 몇 가지 아이디어를 소개할게요. 실제 프로젝트 환경에서 경험을 쌓으면서 CI/CD 도구 사용법을 익히는 것은 면접 준비 및 실무에서 큰 도움이 됩니다.


1. GitHub Actions 실습

a. 간단한 Spring Boot 애플리케이션 생성 및 빌드 자동화

  • 프로젝트 생성:
    Spring Initializr(https://start.spring.io/)를 활용하여 간단한 Spring Boot 애플리케이션을 생성합니다. (예: REST API 혹은 간단한 CRUD 애플리케이션)

  • 빌드 도구 선택:
    Maven 또는 Gradle 중 하나를 선택하여 빌드 스크립트를 구성합니다.

  • GitHub 저장소에 올리기:
    GitHub에 새로운 저장소를 생성하고 로컬 프로젝트를 push 합니다.

  • 워크플로우 YAML 파일 작성:
    .github/workflows/ci.yml 파일을 생성하고, 해당 파일 안에 빌드, 테스트, 패키징 단계를 정의합니다. 예를 들어 Maven을 사용하는 경우:

    name: Java CI with Maven
    
    on:
      push:
        branches: [ main ]
      pull_request:
        branches: [ main ]
    
    jobs:
      build:
    
        runs-on: ubuntu-latest
    
        steps:
        - name: Checkout code
          uses: actions/checkout@v3
    
        - name: Set up JDK 11
          uses: actions/setup-java@v3
          with:
            distribution: 'temurin'
            java-version: '11'
    
        - name: Build with Maven
          run: mvn clean install
  • 테스트:
    코드 수정 후 push 및 PR 작업을 통해 GitHub Actions가 정상적으로 빌드, 테스트, 패키징 프로세스를 실행하는지 확인해보세요.


b. Docker 이미지 빌드 및 배포 자동화

  • Dockerfile 작성:
    Spring Boot 애플리케이션을 Docker 이미지로 빌드하기 위한 Dockerfile을 작성합니다.

    FROM openjdk:11-jre-slim
    COPY target/*.jar app.jar
    ENTRYPOINT ["java", "-jar", "/app.jar"]
  • GitHub Actions 워크플로우 확장:
    위의 CI 워크플로우에 Docker 이미지 빌드를 위한 단계를 추가할 수 있습니다.

    - name: Build Docker image
      run: |
        docker build -t my-spring-app:${{ github.sha }} .
  • 로컬 테스트:
    GitHub Actions 결과와 별개로, 로컬에서 docker builddocker run 명령어를 실행해 이미지가 잘 실행되는지 테스트해보세요.


2. Jenkins 실습

Jenkins 실습은 다소 인프라 관리가 필요하기 때문에 아래와 같이 단계별 실습을 추천합니다.

a. Jenkins 설치 및 초기 설정

  • Jenkins 설치:
    로컬 머신(예: Docker 컨테이너, VirtualBox, 또는 클라우드 인스턴스)에 Jenkins를 설치합니다.
    • Docker 컨테이너를 사용한다면, 아래와 같은 명령어로 설치할 수 있습니다.
      docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts
  • 플러그인 설치:
    Maven, Git 등의 기본 플러그인을 설치하고, 필요에 따라 Docker 플러그인 등 추가 플러그인을 설치해보세요.

b. Jenkins 파이프라인 작성

  • 파이프라인 구성:
    Jenkins의 “Pipeline” 기능을 사용하여 Jenkinsfile을 작성합니다. 예를 들어, GitHub에 있는 Spring Boot 프로젝트를 빌드하는 파이프라인:

    pipeline {
        agent any
    
        stages {
            stage('Checkout') {
                steps {
                    git url: 'https://github.com/your-username/your-spring-app.git', branch: 'main'
                }
            }
            stage('Build') {
                steps {
                    sh 'mvn clean install'
                }
            }
            stage('Test') {
                steps {
                    sh 'mvn test'
                }
            }
        }
    }
  • 실행 및 결과 확인:
    Jenkins 웹 UI에 접속하여 파이프라인을 실행하고, 빌드와 테스트 단계가 성공하는지 확인해보세요.


추가 실습 아이디어

  • 테스트 자동화:
    단위 테스트, 통합 테스트 자동화 워크플로우를 추가하여 코드 변경시 자동으로 테스트가 돌도록 해보세요.

  • 알림 설정:
    빌드 실패 시 이메일 혹은 Slack 알림을 설정해서 CI/CD 파이프라인과 개발 환경 사이의 연동을 경험해볼 수 있습니다.

  • 환경 분리:
    staging 및 production 환경으로 배포하는 과정을 간단하게 실습해보고, GitHub Actions나 Jenkins에서 멀티 스테이지 파이프라인을 구현해보세요.


이러한 실습 과정은 취업 준비 및 실제 개발 환경에서 CI/CD 프로세스를 이해하는 데 큰 도움이 됩니다. 처음에는 GitHub Actions와 같은 간단한 도구로 시작하고, 점차 Jenkins와 같은 더 복잡한 도구도 경험해 보면서 CI/CD 자동화의 전체 흐름을 익혀보세요.

0개의 댓글