TIL

CI/CD 자동배포

Big Iron 2023. 3. 23. 04:40

CI (Continuous Intergration) - 지속적 통합

  • 설정 브랜치로 머지하면 자동으로 build, jar파일 생성
  1. 여러명이 하나의 코드에 대해 수정을 해도 지속적인 통합 관리가 가능함.
  2. 고객의 요구사항에 빠르게 대응하기 위해 나온 XP의 실천방안

CD (Continuous Deployment) - 지속적 배포

  • 설정 브랜치로 git push > 생성된 jar파일 AWS에 업로드, 배포

  • 빌드의 결과물을 프로덕션으로 자동, 지속 배포.

  • CI의 연장선 개념


아래는 ci(지속적 통합)를 위한 간단한 yml파일 준비 예시

# 브랜치는 main(최종 dev 배포만을 위한 브랜치) - dev(각 개발 브랜치 합치는 브랜치{빌드 및 테스트 검사}) - feature/1-어쩌구(각 개발 브랜치) 

name: Java CI with Gradle

# 'feature/'로 시작하는 브랜치에서 push하면 워크플로우를 실행.
on:
  push:
    branches:
      - 'feature/*' 

permissions:
  contents: read

# ubuntu-latest 경로에서 실행
jobs:
  build-and-test:
    runs-on: ubuntu-latest

    steps:

    # 1. 워크플로우 실행 전에 checkout 필요.
    - uses: actions/checkout@v3

    # 2. JDK 17 버전 설치 (다른 JDK 버전 설치 가능.)
    - name: JDK 17 설치
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'temurin'

    # 3. gradle clean build 및 test 실행.
    - name: Gradle로 빌드 및 테스트
      run: ./gradlew clean build test

    # 4. 빌드 및 테스트가 성공 ? merge : false
    # git merge "${GITHUB_REF#refs/heads/}" --no-ff 명령 = 현재 브랜치(푸시하려는 브랜치)의 변경 사항을 다른 브랜치로 병합하는데 사용
    # ${GITHUB_REF}는 refs/heads/branch-name 형식으로 현재 브랜치의 전체 참조를 포함하는 GitHub Actions에서 제공하는 환경 변수
    - name: dev 브랜치로 병합
      if: ${{ success() }}  
      # 빌드와 테스트가 성공한 경우 아래 실행.
      run: |
        git checkout dev
        git merge "${GITHUB_REF#refs/heads/}" --no-ff
        git push origin dev


개발자가 직접 코드를 병합하고 빌드, 테스트를 검증하는 것은 많은 시간이 소요되고 귀찮으며 프로젝트의 크기가 커질수록 양이 많아질 수밖에 없다. 이를 개선한 것이 CI/CD라고 보면 편할 것 같다. -> 개발 환경 구축

그러나 CI/CD만 가지고 개발 환경이 완벽하다곤 할 수 없다. CI로 코드의 통합이 이뤄지고 CD를 통해 자동 배포가 실행되는데 새로운 서버를 배포하기 위해 기존 서버는 종료되고 새로운 서버가 시작된다. 이러한 과정 중간에 고객, 사용자가 서버를 사용할 수 없는 시간이 발생한다. 예를 들어 8080 포트 하나로 서버가 돌아가는데 자동 배포를 위해 이 8080포트의 기존 서버가 종료되고 8080포트에서 새로운 서버가 시작되는 것이다. 이를 보완하기 위해 무중단배포 라는 것이 있다.

무중단배포의 개념을 짧게나마 설명하자면 8080, 8081, 8082 등 한개 이상의 서버가 있다고 가정하겠다. 기존 배포중이던 8080서버에서 버전 업데이트가 진행되어 새로운 버전이 배포되어야 할 때 8080포트가 종료되는 동시에 8080포트와 똑같은 버전인 8081 포트가 자동적으로 배포된다. 그리고 8080포트의 업데이트가 완료되면 다시 8081포트가 꺼지는 동시에 8080포트가 연결된다. 그리고 8081 포트는 최신화 되어 임시 포트로 남아있는 것이다.