2.2.3 CI 파이프라인 구축을 위한 도구 및 기술

Jenkins를 이용한 파이프라인 구축

Jenkins란?

Jenkins는 오픈 소스 자동화 서버로, CI/CD 파이프라인의 구축 및 자동화에 널리 사용됩니다. Jenkins의 큰 장점 중 하나는 플러그인 생태계가 매우 풍부하다는 것입니다. 거의 모든 작업을 자동화하고 확장할 수 있는 플러그인이 존재합니다.

파이프라인 구축 방법

  1. Jenkins 설치: Jenkins는 Docker 컨테이너, macOS, Windows, Linux 등 다양한 플랫폼에서 실행될 수 있습니다. 공식 웹사이트에서 가이드를 따라 설치합니다.
  2. 플러그인 설치: Jenkins 대시보드에서 ‘관리' > ‘플러그인 관리'로 이동하여 필요한 플러그인(예: Git, Maven, Docker)을 설치합니다.
  3. 새로운 Item 생성: Jenkins 대시보드에서 ‘새로운 Item 생성'을 선택하고, 파이프라인 프로젝트를 설정합니다.
  4. 파이프라인 스크립트 작성: ‘파이프라인' 섹션에서 파이프라인 스크립트를 작성합니다. Jenkinsfile을 사용하여 SCM에서 파이프라인을 관리하는 것이 좋습니다.
pipeline {
   agent any

   environment {
      // 환경 변수 설정
      DOCKER_IMAGE = 'myapp:${BUILD_NUMBER}'
      DOCKER_CREDS_ID = 'docker-hub-credentials'
   }

   stages {
      stage('Checkout') {
         steps {
            checkout scm
         }
      }

      stage('Build') {
         steps {
            script {
               // Maven을 사용하여 Java 애플리케이션 빌드
               sh 'mvn clean package'
            }
         }
      }

      stage('Test') {
         steps {
            script {
               // JUnit 테스트 실행
               sh 'mvn test'
            }
         }
      }

      stage('Build Docker Image') {
         steps {
            script {
               // Docker 이미지 빌드
               sh "docker build -t ${DOCKER_IMAGE} ."
            }
         }
      }

      stage('Push Docker Image') {
         steps {
            script {
               // Docker Hub에 로그인
               withCredentials([usernamePassword(credentialsId: DOCKER_CREDS_ID, usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS')]) {
                  sh "echo ${DOCKER_PASS} | docker login -u ${DOCKER_USER} --password-stdin"
               }
               // Docker 이미지 푸시
               sh "docker push ${DOCKER_IMAGE}"
            }
         }
      }

      stage('Cleanup') {
         steps {
            script {
               // 빌드 후 정리 작업
               sh 'echo Cleaning up...'
            }
         }
      }
   }

   post {
      success {
         echo 'Build, Test and Deployment processes were successful.'
      }
      failure {
         echo 'The process failed.'
      }
   }
}

이 파이프라인 스크립트는 실제 프로젝트에서 다음과 같은 과정을 자동화합니다:

  1. Checkout: 소스 코드를 버전 관리 시스템에서 체크아웃합니다.
  2. Build: Maven을 사용하여 Java 애플리케이션을 컴파일하고 패키지합니다.
  3. Test: Maven과 JUnit을 사용하여 자동화된 단위 테스트를 실행합니다.
  4. Build Docker Image: Dockerfile을 기반으로 Docker 이미지를 빌드합니다.
  5. Push Docker Image: 빌드된 Docker 이미지를 Docker Hub에 푸시합니다.
  6. Cleanup: 필요한 정리 작업을 실행합니다.
  7. post 섹션은 파이프라인의 성공 또는 실패 후 실행할 단계를 정의합니다, 성공 또는 실패 메시지를 출력합니다.

장점

  • 매우 유연하고 확장 가능합니다.
  • 방대한 플러그인 생태계를 보유하고 있습니다.
  • 거의 모든 프로그래밍 언어와 기술 스택을 지원합니다.

적합한 사용 사례

  • 복잡한 파이프라인이 필요한 대규모 프로젝트
  • 고도의 커스터마이징이 필요한 환경

Travis CI를 이용한 파이프라인 구축

Travis CI란?

Travis CI는 GitHub 프로젝트를 위한 지속적인 통합 서비스로, GitHub 저장소와의 긴밀한 통합이 특징입니다. .travis.yml 파일에 프로젝트의 CI 파이프라인을 정의하여 사용합니다.

파이프라인 구축 방법

  1. Travis CI와 GitHub 연동: Travis CI 웹사이트에서 GitHub 계정으로 로그인하고, CI를 적용할 저장소를 활성화합니다.
  2. .travis.yml 작성: 프로젝트 루트에 .travis.yml 파일을 생성하고, 빌드, 테스트, 배포 등의 단계를 정의합니다.
   language: java
   jdk:
     - openjdk11
   
   # Travis CI 환경에서 캐시할 디렉토리를 지정하여 빌드 시간을 단축시킵니다.
   cache:
     directories:
       - $HOME/.m2
       - $HOME/.gradle
   
   # 빌드 전에 필요한 설정이나 종속성을 설치합니다.
   before_install:
     - chmod +x gradlew
   
   # 빌드 스크립트 섹션
   script:
     # Gradle을 사용하여 빌드합니다.
     - ./gradlew clean build
     # Gradle을 사용하여 유닛 테스트를 실행합니다.
     - ./gradlew test
     # 소나큐브를 사용하여 코드 품질을 분석합니다.
     - if [ "$TRAVIS_BRANCH" == "main" ]; then ./gradlew sonarqube; fi
   
   # 배포 섹션
   deploy:
     # 조건부 배포: main 브랜치에 푸시되었을 때만 배포합니다.
     on:
       branch: main
     provider: heroku
     app: your-heroku-app-name
     api_key:
       secure: "YOUR_ENCRYPTED_API_KEY"
     # 배포 전 스크립트를 실행합니다. 예를 들어, 마이그레이션 스크립트 등을 실행할 수 있습니다.
     before_deploy:
       - echo "Deployment is starting..."
     # 배포 후 스크립트를 실행합니다.
     after_deploy:
       - echo "Deployment is finished."
   
   # 빌드 성공 또는 실패 시 알림을 설정합니다.
   notifications:
     email:
       recipients:
         - your-email@example.com
       on_success: change # default: change
       on_failure: always # default: always

.travis.yml 파일은 다음과 같은 과정을 자동화합니다:

  1. 환경 설정: Java JDK 버전 설정, 캐시 디렉토리 지정으로 빌드 시간 단축, 실행 권한 변경 등을 수행합니다.
  2. 빌드 및 테스트: Gradle을 사용하여 애플리케이션을 빌드하고, 유닛 테스트를 실행합니다.
  3. 코드 품질 검사: main 브랜치에 대해서만 소나큐브를 통한 코드 품질 검사를 수행합니다.
  4. 조건부 배포: main 브랜치에 코드가 푸시될 때 Heroku에 자동으로 배포합니다. 배포 전후에 특정 스크립트를 실행할 수 있습니다.
  5. 알림: 빌드의 성공 또는 실패에 따라 지정된 이메일로 알림을 보냅니다.

장점

  • GitHub 프로젝트와의 높은 통합도
  • 사용이 간편하고 설정이 단순합니다.

적합한 사용 사례

  • 간단하고 빠르게 설정을 원하는 소규모에서 중규모 프로젝트.
  • GitHub에 호스팅된 프로젝트에서 CI/CD 파이프라인을 쉽게 구축하고자 할 때.

GitHub Actions를 이용한 파이프라인 구축

GitHub Actions란?

GitHub Actions는 GitHub 내에서 직접 CI/CD 파이프라인을 구축, 테스트, 배포할 수 있게 해주는 도구입니다. GitHub 저장소의 이벤트(예: 푸시, 풀 리퀘스트)에 반응하여 작업을 실행할 수 있으며, 워크플로우는 .github/workflows 디렉토리 내의 YAML 파일로 정의됩니다.

파이프라인 구축 방법

  1. 워크플로우 파일 생성: 프로젝트의 .github/workflows 디렉토리에 YAML 형식의 워크플로우 파일을 생성합니다.
  2. 워크플로우 정의: 빌드, 테스트, 배포 등의 단계를 워크플로우 파일에 정의합니다.
name: Node.js CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [12.x, 14.x]

    steps:
    - uses: actions/checkout@v2

    - name: Use Node.js $
      uses: actions/setup-node@v1
      with:
        node-version: $
        
    - name: Install dependencies
      run: npm install
      
    - name: Run linter
      run: npm run lint

    - name: Run tests
      run: npm test

    - name: Build
      run: npm run build

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main' && job.status == 'success'

    steps:
    - uses: actions/checkout@v2

    - name: Deploy to GitHub Pages
      uses: peaceiris/actions-gh-pages@v3
      with:
        github_token: $
        publish_dir: ./build

.github/workflows/main.yml 파일은 다음 단계로 구성됩니다:

  1. 트리거: main 브랜치에 대한 pushpull_request 이벤트에 의해 파이프라인이 실행됩니다.
  2. 빌드 및 테스트:
    • Node.js의 여러 버전을 사용하여 매트릭스 빌드를 설정합니다.
    • 종속성을 설치하고, 코드 스타일을 검사하는 린터를 실행한 후, 유닛 테스트를 진행합니다.
    • 애플리케이션을 빌드합니다.
  3. 조건부 배포:
    • 빌드 및 테스트 작업이 성공적으로 완료된 후에만 배포 작업이 실행됩니다.
    • GitHub Pages로 정적 파일을 배포합니다. 이때, GitHub의 토큰을 사용해 권한을 부여받습니다.

장점

  • GitHub 저장소와의 깊은 통합.
  • 별도의 CI 서비스 계정이나 인프라 설정 없이 사용 가능.
  • 리눅스, 윈도우, macOS 환경에서의 실행 지원 및 Docker 컨테이너 내에서 작업 실행 가능.

적합한 사용 사례

  • GitHub를 사용하는 모든 프로젝트.
  • 빠르고 간단하게 CI/CD 파이프라인을 구축하고자 하는 경우.
  • 다양한 플랫폼과 언어에 대한 지원이 필요한 경우.
각 도구는 다양한 프로젝트 요구와 환경에 맞춰 선택될 수 있습니다. Jenkins는 매우 유연하고 확장 가능하며, 
Travis CI는 GitHub 프로젝트와의 통합을 중시하고, GitHub Actions는 GitHub 내에서 완벽하게 통합된 경험을 제공합니다. 
각각의 도구는 특정한 상황과 요구 사항에 따라 최적의 선택이 될 수 있습니다.

source: DevOps/2.Continuous_Integration_(CI)/2.2.Building_CI_Pipelines/2.2.3.md