CI는 지속적 통합(Continuous Integration)을 의미하고
CD는 지속적 배포(Continuous Deployment)를 의미한다.
두개의 기술을 적절히 사용하면 빌드->테스트->배포의 과정을 자동화 할 수 있다.
CI 단계에서는 빌드/테스트
과정을 자동화 한다.
우리가 코드를 수정하고 이를 반영하는 순간(github 등에 commit 후 push) 해당 변경 사항을 기준으로 프로젝트가 빌드되고 테스트된다.
위에 과정에서 별다른 문제가 없었다면 CD 단계로 넘어간다.
CD는 단계에서는 배포
를 자동화 한다.
CI 단계가 완료되고 검증이 된 빌드본을 바탕으로 프로덕션 환경에 배포된다.
이 두 과정에 공통 키워드는 자동화
이다.
빌드/테스트는 복잡한 과정이 아닌 명령어로 가능한 영역이다.
하지만 코드 작업은 빈번하게 이루어진다. 매번 수정사항이 발생할때마다 빌드를 기다리고, 빌드가 되면 매번 동일한 테스트를 반복하는건 리소스의 낭비다.
빌드/테스트 이후에 서버에 배포하는 과정또한 마찬가지이다.
배포한 파일을 가지고 FTP 프로그램을 키고, 경로를 찾고, 만약에 여기에 몇가지 단순하지만 시간을 잡아먹는 과정이 추가되면, 점점 놓치는 시간이 더 커질 것이다
그렇기에 이 과정을 자동화하기 위해 CI/CD를 사용한다.
현재 내가 사용하는 방식은 github action이다.
아직 CI/CD에 대해 잘 모르기도 하며, 간단하게 사용할 수 있기에 적용시킨 방법이다.
.github/workflows 경로에 .yml 파일을 하나 가져다 놓으면, 해당 파일 내부에 스크립트를 기준으로 동작을 한다.
name: React build
on:
push: # main Branch에서 push 이벤트가 일어났을 때만 실행
branches:
- main
jobs:
build:
runs-on: ubuntu-18.04
steps:
- name: Checkout source code. # 레포지토리 체크아웃
uses: actions/checkout@main
- name: Cache node modules # node modules 캐싱
uses: actions/cache@v1
with:
path: node_modules
key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.OS }}-build-
${{ runner.OS }}-
- name: Install Dependencies # 의존 파일 설치
run: npm install
- name: Build # React Build
env:
CI: ""
run: npm run build
- name: Deploy # S3에 배포하기
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws s3 cp \
--recursive \
--region ap-northeast-2 \
dist s3://sugarghost.shop # dist 폴더에 내용을 s3에 배포
보다 시피 구조가 매우 단순하다.
특정 타겟과 환경을 명시하고
원하는 동작을 run으로 실행시켜 동작한다.
만약 외부에 노출되면 안되는 정보는 github secret 설정을 이용해 명시하면 된다.
CI와 CD는 별개의 존재라서, 다양한 도구들이 존재한다.
다양한 테스팅 라이브러리 또는 Tool 또한 CI의 범주에 포함 될 것이다.
Best 14 CI/CD Tools You Must Know | Updated for 2022의 자료를 확인해보면 정말 다양한 툴들이 존재한다
그중 상위 5개의 툴을 살펴보자면
오픈 소스로 구성되어 아주 다양한 플러그인을 제공하며 다음과 같은 주요 기능이 제공한다고 한다.
주요 기능
주요 기능
로고에서 알 수 있다 시피 JetBrains에서 제공하는 빌드 관리 및 지속적 통합을 위한 서버이다.
주요 기능
주요 기능
최대 100개의 원격 빌드 agents 지원
일괄 테스트를 병렬로 실행하며 신속하게 피드백을 받을 수 있음
이미지를 만들고 레지스트리에 푸쉬함
프로덕션이 잠겨 있는 동안 개발자와 테스터가 온디맨드로 환경에 배포할 수 있도록 해주는 환경별 권한 설정 제공
git 등의 형상 관리에서 새로운 branch를 감지하고 CI 체계를 자동으로 적용
repository에 변화를 감지하는 트리거 빌드 제공
알림 푸쉬
주요 기능으로 쓰인 말이 다른 Tool과 곂치는 부분이 좀 많아보이는 것 같다.
주요 기능
branching tool을 통해 코드 및 프로젝트 데이터 보기, 생성 및 관리
단일 분산 버전 제어 시스템에서 코드 및 프로젝트 데이터를 설계, 개발 및 관리 가능
프로젝트 및 코드에 대한 공동 작업을 위한 단일 정보 소스 및 확장성을 제공
소스 코드의 빌드, 통합 및 검증을 자동화
컨테이너 스캔, 정적 애플리케이션 보안 테스트(SAST), 동적 애플리케이션 보안 테스트(DAST) 및 종속성 스캔을 제공
애플리케이션의 릴리스 및 제공을 자동화하고 단축