CI/CD 자동배포
CI (Continuous Intergration) - 지속적 통합
- 설정 브랜치로 머지하면 자동으로 build, jar파일 생성
- 여러명이 하나의 코드에 대해 수정을 해도 지속적인 통합 관리가 가능함.
- 고객의 요구사항에 빠르게 대응하기 위해 나온 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 포트는 최신화 되어 임시 포트로 남아있는 것이다.