Devops

지속적 통합 (CI)

지속적 통합의 개념과 중요성

개념 설명

지속적 통합(Continuous Integration, CI) 은 소프트웨어 개발의 일환으로, 개발자들이 변경한 코드를 자주, 자동으로 통합하고 테스트하는 프로세스입니다. CI의 주요 목적은 코드 변경 사항이 코드 베이스에 잘 통합되고, 변경 사항이 다른 부분에 문제를 일으키지 않도록 하는 것입니다. 이를 통해 소프트웨어 개발과 배포 과정의 품질을 높이고, 출시 주기를 단축할 수 있습니다.

중요성

지속적 통합은 다음과 같은 이유로 중요합니다:

  1. 빠른 피드백 제공: CI 시스템은 코드 변경 후 자동으로 빌드와 테스트를 수행하여, 문제를 빠르게 발견하고 수정할 수 있습니다. 이를 통해 개발자는 즉시 피드백을 받아 문제를 해결할 수 있습니다.
  2. 코드 품질 향상: 자주 테스트를 수행하여 코드 품질을 유지하고, 버그가 프로덕션에 반영되기 전에 발견할 수 있습니다. 이는 높은 품질의 소프트웨어를 제공하는 데 필수적입니다.
  3. 개발 속도 향상: 자동화된 빌드와 테스트를 통해 개발 속도가 빨라지고, 개발자들이 코드 통합과 테스트에 소비하는 시간을 줄일 수 있습니다. 이는 전체 개발 주기를 단축시킵니다.
  4. 효율적인 협업: 여러 개발자가 동시에 작업할 때, 통합 과정에서 발생할 수 있는 충돌을 최소화하고 협업 효율성을 높입니다. CI는 통합 시 발생할 수 있는 문제를 조기에 발견하여 해결할 수 있도록 도와줍니다.

CI 도구 소개

여러 CI 도구들이 존재하며, 그 중에서도 Jenkins, GitLab CI, Travis CI, CircleCI 등이 많이 사용됩니다. 각 도구는 고유한 특징과 강점을 가지고 있습니다.

Jenkins

Jenkins는 오픈 소스 자동화 서버로, 다양한 빌드, 테스트, 배포 작업을 자동화하는 데 사용됩니다. 플러그인 기반의 아키텍처를 가지고 있어 확장성이 뛰어납니다. Jenkins는 대규모 프로젝트에서도 안정적으로 작동하며, 커뮤니티가 활발하게 활동하고 있어 다양한 플러그인을 제공합니다.

GitLab CI

GitLab CI는 GitLab과 통합된 CI/CD 도구로, 코드 리포지토리에 직접 통합되어 사용하기 쉽습니다. 파이프라인 정의 파일인 .gitlab-ci.yml을 통해 빌드, 테스트, 배포 작업을 자동화할 수 있습니다. GitLab CI는 GitLab의 다른 기능들과도 잘 통합되어 있어 일관된 개발 환경을 제공합니다.

Travis CI

Travis CI는 오픈 소스 프로젝트와의 통합이 잘 되어 있는 CI 도구로, GitHub와의 연동이 용이합니다. .travis.yml 파일을 통해 파이프라인을 정의합니다. Travis CI는 설정이 간단하고 빠르게 설정할 수 있어, 소규모 프로젝트나 오픈 소스 프로젝트에서 자주 사용됩니다.

CircleCI

CircleCI는 클라우드 기반의 CI/CD 도구로, 고속 빌드와 테스트 환경을 제공합니다. YAML 파일을 사용하여 설정하며, 다양한 언어와 플랫폼을 지원합니다. CircleCI는 빠른 빌드 시간을 제공하며, 병렬 빌드를 통해 빌드 시간을 단축시킬 수 있습니다.

Jenkins를 이용한 CI 설정

Jenkins 설치 및 초기 설정

설치

Ubuntu에서 Jenkins를 설치하는 방법은 다음과 같습니다:

# 시스템 패키지 업데이트
sudo apt update
 
# Java 설치
sudo apt install openjdk-11-jdk
 
# Jenkins 저장소 추가 및 설치
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins

초기 설정

  1. Jenkins 웹 인터페이스에 접속 (http://<your-server-ip>:8080)
  2. 초기 관리자 비밀번호 입력 (sudo cat /var/lib/jenkins/secrets/initialAdminPassword)
  3. 기본 플러그인 설치
  4. 관리자 계정 생성

Jenkins 파이프라인 구성

Jenkins에서 파이프라인을 구성하기 위해서는 Jenkinsfile을 작성해야 합니다. Jenkinsfile은 파이프라인을 코드로 정의하는 파일입니다.

Jenkinsfile 예제

pipeline {
    agent any
 
    stages {
        stage('Build') {
            steps {
                echo 'Building...'
                sh 'mvn clean package'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
                sh 'mvn test'
            }
        }
        stage('Deploy') {
            steps {
                echo 'Deploying...'
                sh 'scp target/myapp.jar user@server:/path/to/deploy'
            }
        }
    }
}

설명:

  • pipeline {}: 파이프라인의 정의를 시작합니다.
  • agent any: Jenkins 에이전트를 지정합니다.
  • stages {}: 파이프라인의 각 단계를 정의합니다.
  • stage('Build') {}: 빌드 단계입니다. sh 'mvn clean package' 명령을 통해 Maven을 사용하여 빌드합니다.
  • stage('Test') {}: 테스트 단계입니다. sh 'mvn test' 명령을 통해 Maven을 사용하여 테스트를 실행합니다.
  • stage('Deploy') {}: 배포 단계입니다. sh 'scp target/myapp.jar user@server:/path/to/deploy' 명령을 통해 빌드된 파일을 서버로 복사합니다.

Jenkins 프로젝트 설정

  1. 새로운 파이프라인 프로젝트 생성
  2. 소스 코드 관리에서 Git 선택, 저장소 URL 입력
  3. 빌드 트리거 설정 (예: GitHub Webhook)
  4. 빌드 환경 설정 (예: 환경 변수)
  5. Jenkinsfile 경로 설정

이 과정을 통해 Jenkins를 사용하여 CI 파이프라인을 설정하고 실행할 수 있습니다.

GitHub Actions를 이용한 CI 설정

GitHub Actions 소개 및 기본 설정

GitHub Actions는 GitHub에서 제공하는 CI/CD 도구로, 워크플로우를 정의하여 자동화된 빌드, 테스트, 배포를 수행할 수 있습니다. GitHub Actions는 GitHub 리포지토리에 직접 통합되어 사용하기 쉽고, 다양한 이벤트를 트리거로 설정할 수 있습니다.

워크플로우 파일 작성

GitHub 저장소에 .github/workflows 디렉토리를 생성하고, 워크플로우 파일을 작성합니다.

워크플로우 파일 예제

name: CI/CD Pipeline
 
on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
 
jobs:
  build:
    runs-on: ubuntu-latest
 
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
 
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: '11'
 
      - name: Build with Maven
        run: mvn clean package
 
      - name: Run tests
        run: mvn test
 
      - name: Deploy to server
        run: scp target/myapp.jar user@server:/path/to/deploy
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}

설명:

  • name: 워크플로우의 이름을 지정합니다.
  • on: 워크플로우를 트리거하는 이벤트를 정의합니다. 여기서는 pushpull_request 이벤트를 사용합니다.
  • jobs: 워크플로우에서 수행할 작업들을 정의합니다.
  • build: 작업의 이름을 지정합니다.
  • runs-on: 작업이 실행될 환경을 지정합니다. 여기서는 ubuntu-latest를 사용합니다.
  • steps: 각 단계별로 수행할 작업을 정의합니다.
    • actions/checkout@v2: 코드를 체크아웃합니다.
    • actions/setup-java@v1: JDK 11을 설정합니다.
    • run: mvn clean package: Maven을 사용하여 빌드합니다.
    • run: mvn test: Maven을 사용하여 테스트를 실행합니다.
    • run: scp target/myapp.jar user@server:/path/to/deploy: 빌드된 파일을 서버로 복사합니다.

GitHub Secrets 설정

  • GitHub 저장소의 Settings > Secrets에서 새로운 시크릿 추가
  • 예: SSH_PRIVATE_KEY 시크릿 추가

이 과정을 통해 GitHub Actions를 사용하여 CI 파이프라인을 설정하고 실행할 수 있습니다.


이로써 지속적 통합(CI)의 개념과 중요성, CI 도구 소개, Jenkins와 GitHub Actions를 이용한 CI 설정 방법에 대해 알아보았습니다.

이를 통해 개발 프로세스를 자동화하고, 코드 품질을 높이며, 배포 과정을 효율적으로 관리할 수 있습니다

On this page