본문 바로가기

DevOps

GitHub Actions와 Jenkins 차이: CI/CD 도구 선택 기준

반응형

CI/CD 도구를 선택할 때 "Jenkins가 레거시니까 GitHub Actions로 가자"라는 판단은 위험합니다. 팀 규모, 빌드 볼륨, 보안 요구사항, 운영 역량에 따라 적합한 도구가 다릅니다. 이 글에서는 두 도구의 구조적 차이를 분석하고, 상황별 선택 기준을 정리합니다.

핵심 요약

  • GitHub Actions는 GitHub과 통합된 SaaS CI/CD 서비스로, 별도 인프라 운영 없이 시작할 수 있습니다.
  • Jenkins는 자체 호스팅 오픈소스 CI/CD 서버로, 높은 유연성과 커스터마이징이 가능하지만 운영 부담이 있습니다.
  • 소규모 팀이 GitHub을 사용하고 있다면 GitHub Actions가 대부분 적합합니다.
  • 빌드 볼륨이 크거나 네트워크 격리 요구사항이 있다면 Jenkins가 비용/보안 측면에서 유리할 수 있습니다.
  • 두 도구를 조합해서 사용하는 패턴(GitHub Actions → Jenkins 배포)도 실무에서 흔합니다.

1. 왜 이 비교가 필요한가

스타트업에서 3명이 개발하다가 팀이 15명으로 성장했습니다. 기존에 GitHub Actions로 잘 돌아가던 파이프라인이 이제 문제를 보입니다.

  • 월 CI/CD 비용이 $300을 넘어가기 시작합니다.
  • iOS + Android + Backend 빌드를 동시에 돌리면 무료 병렬 제한에 걸립니다.
  • 보안 팀이 "빌드 환경에서 소스코드가 외부로 나가면 안 된다"고 요구합니다.

이때 Jenkins로의 마이그레이션을 검토하게 됩니다. 반대로, Jenkins를 5년간 운영하던 팀이 "운영 부담이 너무 크다"며 GitHub Actions로 전환을 검토하기도 합니다.

어느 쪽이 더 좋은 도구가 아니라, 어떤 상황에서 어떤 도구가 적합한지를 이해하는 것이 핵심입니다.

2. 아키텍처 비교

GitHub Actions와 Jenkins 아키텍처 비교
GitHub Actions와 Jenkins 아키텍처 비교

GitHub Actions 아키텍처

GitHub Actions는 SaaS 기반입니다. 사용자는 워크플로우 YAML 파일만 작성하면, GitHub이 Runner를 할당하고 실행합니다.

구성 요소 설명
Workflow 파일 .github/workflows/에 YAML로 정의
GitHub-hosted Runner GitHub이 관리하는 일회성 VM (Ubuntu, Windows, macOS)
Self-hosted Runner 사용자가 직접 운영하는 실행 환경
Marketplace Actions 커뮤니티가 만든 재사용 가능한 액션

핵심 특징: - Ephemeral: 매 실행마다 깨끗한 VM이 할당되고, 실행 후 삭제됩니다. 빌드 간 오염이 없습니다. - 관리 부담 최소: Runner 운영, 보안 패치, 스케일링을 GitHub이 처리합니다. - GitHub 종속: GitHub 저장소 외에서는 사용할 수 없습니다.

Jenkins 아키텍처

Jenkins는 Self-hosted 오픈소스입니다. 사용자가 직접 Jenkins Controller와 Agent를 운영합니다.

구성 요소 설명
Controller 작업 스케줄링, UI, 설정 관리 (Master)
Agent (Node) 실제 빌드를 실행하는 워커
Plugin 1,800개 이상의 확장 플러그인
Jenkinsfile Pipeline을 코드로 정의 (Groovy DSL)

핵심 특징: - 완전한 통제: 네트워크, 스토리지, 보안 정책을 직접 설계합니다. - 높은 유연성: 어떤 SCM, 어떤 클라우드, 어떤 배포 대상이든 플러그인으로 연동 가능합니다. - 운영 부담: Controller 가용성, Agent 스케일링, 플러그인 업데이트, 보안 패치를 직접 해야 합니다.

구조적 차이 요약

비교 항목 GitHub Actions Jenkins
호스팅 SaaS (GitHub 관리) Self-hosted (직접 운영)
실행 환경 Ephemeral VM (매번 새로 생성) Persistent Agent (상시 실행)
설정 방식 YAML Groovy DSL (Jenkinsfile)
확장성 Marketplace Actions Plugins (1,800+)
SCM 연동 GitHub 전용 Git, SVN, Mercurial 등 다양
관리 대상 Workflow 파일만 Controller + Agent + Plugin + 인프라

3. 워크플로우 비교

GitHub Actions와 Jenkins 워크플로우 비교
GitHub Actions와 Jenkins 워크플로우 비교

같은 작업(빌드 → 테스트 → 배포)을 두 도구에서 어떻게 정의하는지 비교합니다.

GitHub Actions

name: CI/CD Pipeline
on:
  push:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'
      - run: npm ci
      - run: npm run build

  test:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci
      - run: npm test

  deploy:
    needs: test
    runs-on: ubuntu-latest
    environment: production
    steps:
      - name: Deploy to ECS
        run: aws ecs update-service --cluster prod --service api --force-new-deployment

특징: - on 블록으로 트리거를 선언적으로 정의합니다. - needs로 Job 간 의존성을 설정합니다. - environment로 배포 보호 규칙(수동 승인)을 적용합니다. - Marketplace Action을 uses로 간단히 가져다 씁니다.

Jenkins (Declarative Pipeline)

pipeline {
    agent any

    stages {
        stage('Build') {
            steps {
                sh 'npm ci'
                sh 'npm run build'
            }
        }

        stage('Test') {
            steps {
                sh 'npm test'
            }
        }

        stage('Deploy') {
            when {
                branch 'main'
            }
            input {
                message "프로덕션에 배포하시겠습니까?"
                ok "Deploy"
            }
            steps {
                sh 'aws ecs update-service --cluster prod --service api --force-new-deployment'
            }
        }
    }

    post {
        failure {
            slackSend channel: '#alerts', message: "빌드 실패: ${env.JOB_NAME}"
        }
    }
}

특징: - Groovy DSL로 작성합니다. 프로그래밍 언어이므로 조건부 로직, 반복, 함수 정의가 자유롭습니다. - input 블록으로 수동 승인을 구현합니다. - post 블록으로 성공/실패 후 처리를 정의합니다. - 커스텀 로직이 복잡해질수록 Jenkins가 유리합니다. 다만 Groovy 학습 곡선이 있습니다.

워크플로우 정의 방식 비교

항목 GitHub Actions Jenkins
언어 YAML (선언적) Groovy DSL (프로그래밍 가능)
학습 곡선 낮음 중간~높음
조건부 로직 if 표현식 (제한적) Groovy 문법으로 자유롭게
재사용 Reusable Workflow, Composite Action Shared Library
트리거 on 블록 (push, PR, schedule 등) Webhook, Poll SCM, Cron, Upstream Job
수동 승인 Environment Protection Rules input 블록
병렬 실행 matrix 전략 parallel 블록
Tip
GitHub Actions의 YAML은 단순한 파이프라인에서 빠르게 작성할 수 있지만, 조건 분기가 복잡해지면 가독성이 떨어집니다. Jenkins의 Groovy는 반대로 초기 학습이 필요하지만, 복잡한 로직을 깔끔하게 표현할 수 있습니다. 파이프라인 복잡도가 판단 기준입니다.

4. 비용 비교

GitHub Actions와 Jenkins 비용 구조 비교
GitHub Actions와 Jenkins 비용 구조 비교

비용 구조가 근본적으로 다릅니다. GitHub Actions는 사용량 기반, Jenkins는 인프라 고정 비용입니다.

GitHub Actions 비용

항목 가격 (2026년 기준)
Public 저장소 무제한 무료
Private 저장소 (Free 플랜) 2,000분/월 무료
Private 저장소 (Team 플랜) 3,000분/월 무료
추가 사용량 (Linux) $0.006/분
추가 사용량 (Windows) $0.010/분
추가 사용량 (macOS) $0.048/분
Self-hosted Runner 무료 (인프라 비용만)

2026년 1월 가격 인하가 적용된 기준입니다. 최신 가격은 GitHub Actions 가격 페이지에서 확인할 수 있습니다.

Jenkins 비용

항목 예상 비용
소프트웨어 라이선스 무료 (오픈소스)
Controller 서버 $50~200/월 (EC2 t3.large 기준)
Agent 서버 (2~4대) $100~400/월
스토리지 (빌드 아티팩트) $20~50/월
운영 인력 DevOps 엔지니어 인건비의 일부
총 인프라 비용 $180~680/월 (규모에 따라)

비용 시나리오 비교

시나리오 A: 소규모 팀 (5명, 일 5회 빌드, 빌드당 10분)

  • GitHub Actions: 월 약 1,500분 → Free 플랜(2,000분)으로 충분 → $0
  • Jenkins: Controller + Agent 최소 구성 → $180+/월

시나리오 B: 중규모 팀 (20명, 일 30회 빌드, 빌드당 15분)

  • GitHub Actions: 월 약 9,000분 → Team 플랜(3,000분) + 초과 6,000분 × $0.006 → 약 $36/월 + Team 플랜 비용
  • Jenkins: 고성능 Controller + Agent 3대 → 약 $400/월 (고정)

시나리오 C: 대규모 팀 (50명, 일 100회 빌드, 빌드당 20분)

  • GitHub Actions: 월 약 40,000분 → 초과 37,000분 × $0.006 → 약 $222/월 (Linux 기준)
  • Jenkins: Agent 6대 + 고가용성 구성 → 약 $680/월 (고정)

다만 시나리오 C에서 macOS 빌드가 포함되면 GitHub Actions 비용이 증가합니다. macOS 빌드가 월 5,000분이면 추가 $240이 발생합니다.

비용 판단 기준
단순히 금액만 비교하면 안 됩니다. Jenkins의 "운영 인력 비용"은 표에 포함되지 않습니다. DevOps 엔지니어가 Jenkins 관리에 주당 4시간을 쓴다면, 그 인건비를 고려해야 합니다. 반대로 GitHub Actions는 Self-hosted Runner를 사용하면 분당 비용을 제거할 수 있지만, Runner 관리 부담이 발생합니다.

5. 운영 부담 비교

운영 영역 GitHub Actions Jenkins
초기 설정 YAML 파일 작성 (30분~) 서버 프로비저닝 + Jenkins 설치 + 플러그인 설정 (반나절~)
보안 패치 GitHub이 Runner에 자동 적용 직접 Jenkins + OS + 플러그인 업데이트
스케일링 자동 (GitHub이 Runner 할당) Agent 수동 추가 또는 Auto Scaling 구성 필요
가용성 GitHub SLA (99.9%) 직접 이중화, 백업, 모니터링 구성
플러그인 관리 Marketplace (버전 고정) 호환성 충돌 직접 관리 (가장 큰 운영 부담)
디버깅 GitHub UI에서 로그 확인 Controller/Agent 로그 직접 분석
백업/복구 불필요 (Workflow는 Git에 저장) Jenkins Home 디렉토리 정기 백업 필요

Jenkins 운영에서 자주 발생하는 문제

  1. 플러그인 충돌: A 플러그인을 업데이트하면 B 플러그인이 깨집니다. 의존성 관계가 복잡해질수록 업데이트가 두려워집니다.
  2. Controller 다운: Jenkins Controller가 죽으면 모든 빌드가 중단됩니다. HA 구성이 없으면 단일 장애점입니다.
  3. Agent 디스크 부족: 빌드 아티팩트와 Docker 이미지가 누적되어 디스크가 가득 찹니다. 정기 정리 크론잡이 필요합니다.
  4. Groovy 보안 이슈: Pipeline에서 실행되는 Groovy 코드는 Controller에서 실행될 수 있어 Script Security 설정이 필요합니다.

GitHub Actions 운영에서 주의할 점

  1. 비용 예측 어려움: 빌드 횟수와 시간에 따라 비용이 변동합니다. 갑자기 PR이 많아지면 예상 외 비용이 발생합니다.
  2. GitHub 장애 영향: GitHub에 장애가 나면 CI/CD도 멈춥니다. 2023-2024년에도 수 차례 장애가 있었습니다.
  3. Workflow 복잡도 한계: 200줄 이상의 Workflow는 가독성이 급격히 떨어집니다. Reusable Workflow로 분리해야 합니다.
  4. Self-hosted Runner 보안: PR 이벤트에서 Self-hosted Runner를 사용하면 외부 기여자의 악성 코드가 내부 네트워크에서 실행될 수 있습니다.

6. 보안 비교

Security Note
CI/CD 도구는 소스코드, 인프라 자격 증명, 프로덕션 배포 권한에 접근합니다. 도구의 보안 모델을 이해하지 않으면 공급망 공격의 진입점이 될 수 있습니다.
보안 항목 GitHub Actions Jenkins
Secret 저장 GitHub Secrets (암호화) Credentials Plugin (Jenkins 내부 암호화)
네트워크 격리 GitHub-hosted Runner는 공용 네트워크 완전한 네트워크 통제 가능
코드 실행 환경 Ephemeral (매번 삭제) → 잔존 데이터 없음 Persistent Agent → 빌드 간 데이터 잔존 가능
공급망 보안 Action SHA 고정으로 완화 Plugin 서명 검증 가능 (제한적)
감사 로그 GitHub Audit Log (Enterprise) 별도 구성 필요
접근 제어 Repository/Organization 권한 기반 Jenkins 자체 RBAC + LDAP/SAML 연동

보안 관점 선택 기준

GitHub Actions가 적합한 경우: - 오픈소스 프로젝트나 코드가 공개되어도 되는 서비스 - 빌드 환경의 격리(Ephemeral VM)가 중요한 경우 - Secret 관리를 단순화하고 싶은 경우 (GitHub Secrets + OIDC)

Jenkins가 적합한 경우: - 소스코드가 외부 서버로 나가면 안 되는 규제 환경 (금융, 의료, 공공) - 빌드 네트워크를 VPC 내부로 완전히 격리해야 하는 경우 - 사내 인증 시스템(LDAP, AD)과 통합해야 하는 경우 - 세밀한 권한 분리가 필요한 대규모 조직

7. 실무 선택 시나리오

시나리오 1: GitHub Actions 선택이 적합한 경우

상황: SaaS 서비스를 개발하는 8명 팀. GitHub을 사용하고, AWS에 배포합니다. 별도 DevOps 엔지니어 없이 백엔드 개발자가 CI/CD를 관리합니다.

선택 근거: - 별도 인프라 운영 인력이 없으므로 SaaS가 적합합니다. - GitHub에 이미 코드가 있으므로 통합이 자연스럽습니다. - 월 빌드량이 Free/Team 플랜으로 커버됩니다. - OIDC로 AWS 인증을 구성하면 장기 자격 증명이 불필요합니다.

주의할 점: - macOS 빌드가 필요하면 Self-hosted Runner를 검토합니다. - 팀이 20명 이상으로 성장하면 비용 구조를 재검토합니다.

시나리오 2: Jenkins 선택이 적합한 경우

상황: 금융 서비스를 운영하는 40명 팀. BitBucket을 사용하고, 온프레미스 + AWS 하이브리드 환경입니다. 전담 DevOps 팀(3명)이 있습니다.

선택 근거: - BitBucket을 사용하므로 GitHub Actions를 쓸 수 없습니다. - 소스코드가 내부 네트워크 밖으로 나가면 안 되는 규제가 있습니다. - 온프레미스 + 클라우드 하이브리드 배포가 필요합니다. - 전담 DevOps 팀이 Jenkins를 운영할 역량이 있습니다. - 빌드 볼륨이 높아 고정 비용 모델이 유리합니다.

주의할 점: - Jenkins Controller HA 구성을 반드시 설계합니다. - 플러그인 업데이트 정책(월 1회 등)을 정합니다. - Configuration as Code(JCasC) 플러그인으로 설정을 코드화합니다.

시나리오 3: 하이브리드 사용

상황: 15명 팀이 GitHub을 사용하지만, 특정 빌드는 내부 GPU 서버에서 실행해야 합니다.

구성: - CI(빌드, 테스트, 보안 스캔): GitHub Actions (GitHub-hosted Runner) - ML 모델 학습/빌드: Jenkins (내부 GPU Agent) - 배포: GitHub Actions (Self-hosted Runner를 VPC 내부에 배치)

이렇게 강점을 조합하는 패턴도 실무에서 흔합니다. GitHub Actions에서 Jenkins 빌드를 트리거하거나, 반대로 Jenkins에서 GitHub API를 호출하는 방식으로 연동합니다.

8. 마이그레이션 고려사항

Jenkins → GitHub Actions 전환 시

고려사항 설명
Shared Library Reusable Workflow 또는 Composite Action으로 재작성
Jenkinsfile 변환 YAML로 수동 전환 (자동 변환 도구는 제한적)
플러그인 대체 Marketplace에서 대응하는 Action 확인
Secret 마이그레이션 GitHub Secrets 또는 외부 Secret Manager로 이전
점진적 전환 신규 프로젝트부터 GitHub Actions 적용, 기존은 유지

GitHub Actions → Jenkins 전환 시

고려사항 설명
인프라 준비 Controller + Agent 서버 프로비저닝
운영 체계 모니터링, 백업, 보안 패치 프로세스 수립
YAML → Groovy Declarative Pipeline 구문으로 변환
트리거 설정 GitHub Webhook 또는 Generic Webhook Trigger 플러그인
팀 교육 Groovy 기본 문법, Jenkins 관리 UI 교육
Tip
마이그레이션은 "빅뱅" 방식보다 점진적 전환이 안전합니다. 신규 서비스부터 새 도구를 적용하고, 안정성이 검증되면 기존 서비스를 순차적으로 전환하는 방식을 권장합니다. 양쪽을 동시에 운영하는 기간이 발생하지만, 전환 실패 시 롤백이 쉽습니다.

9. 종합 비교 테이블

비교 기준 GitHub Actions Jenkins
호스팅 SaaS Self-hosted
초기 설정 시간 30분 반나절~
운영 부담 낮음 높음
유연성 중간 매우 높음
학습 곡선 낮음 (YAML) 중간 (Groovy)
비용 모델 사용량 기반 (분당 과금) 고정 비용 (인프라)
소규모 팀 ✅ 적합 ❌ 과도함
대규모 팀 △ 비용 증가 ✅ 규모의 경제
네트워크 격리 Self-hosted Runner 필요 기본 제공
SCM 종속 GitHub 전용 무관
플러그인/확장 Marketplace (17,000+ Actions) Plugins (1,800+)
커뮤니티 빠르게 성장 중 성숙, 안정적

10. 선택 의사결정 플로우

팀 상황에 따른 선택 기준을 정리합니다.

1단계: SCM 확인 - GitHub을 사용하고 있다면 → GitHub Actions를 우선 검토 - GitLab을 사용한다면 → GitLab CI를 우선 검토 - BitBucket이나 다른 SCM을 사용한다면 → Jenkins 또는 해당 SCM의 CI 도구 검토

2단계: 보안 요구사항 확인 - 소스코드가 외부로 나가면 안 된다 → Jenkins (또는 Self-hosted Runner) - 네트워크 격리가 필수다 → Jenkins - 특별한 보안 요구사항이 없다 → GitHub Actions

3단계: 운영 역량 확인 - 전담 DevOps 팀이 있다 → Jenkins 운영 가능 - 개발자가 CI/CD를 겸임한다 → GitHub Actions (운영 부담 최소화)

4단계: 비용 비교 - 월 빌드량이 2,000분 이하 → GitHub Actions (무료) - 월 빌드량이 높고 macOS 빌드가 많다 → Jenkins (고정 비용이 유리) - 빌드량이 변동이 심하다 → GitHub Actions (사용한 만큼만 과금)

11. 정리

  • GitHub Actions는 "시작이 빠르고 운영 부담이 적은" SaaS CI/CD입니다. GitHub을 사용하는 소규모~중규모 팀에 적합합니다.
  • Jenkins는 "유연성과 통제력이 높은" Self-hosted CI/CD입니다. 대규모 조직, 규제 환경, 복잡한 파이프라인에 적합합니다.
  • 도구 선택은 "팀 규모 × 빌드 볼륨 × 보안 요구사항 × 운영 역량"의 조합으로 결정합니다.
  • 하나를 선택해야 하는 것이 아닙니다. 강점을 조합하는 하이브리드 패턴도 실무에서 흔합니다.
  • "Jenkins가 레거시"라는 인식은 오해입니다. 2026년 현재에도 대규모 조직에서 활발히 사용되고 있습니다. 중요한 것은 도구의 나이가 아니라 팀 상황과의 적합성입니다.

참고 문서

반응형