CI/CD의 CI는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Intergration)을 의미한다.
CI를 성공적으로 구현하면 애플리케이션에 대한 새로운 코드 변경사항이 정기적으로 빌드 및 테스트되어 공유 레포지토리에 통합되어 여러 명의 개발자가 동시에 애플리케이션 개발 코드 작업을 할 경우 충돌할 수 있는 문제를 해결할 수 있다.
CI/CD의 CD는 지속적인 서비스 제공 (Continuous Delivery) 및/또는 지속적인 배포 (Continuous Deployment)를 의미한다. 이 두 용어는 상호 교환적으로 사용된다.
두가지 의미 모두 파이프라인의 추가 단계에 대한 자동화를 뜻하지만 얼마나 많은 자동화가 이루어지고 있는지 설명하기 위해 별도로 사용되기도 한다.
위는 일반적인 앱의 개발및 유지보수 단계이다. 이 과정에서 지속적 통합 및 지속적 전달을 단계별로 나눌 수 있다.
개발자를 위한 자동화 프로세스라고 할 수 있으며 Code - Build - Test 단계에서 실행된다.
이 과정에서 개발자는 코드를 잦게 원격 코드 저장소에 push하고 테스트 및 빌드를 해 빌드의 성공여부와 통합 테스트 결과를 통해 개선 방안을 찾는다.
이러한 과정으로 개발자는 버그를 일찍 발견할 수 있고 테스트가 완료된 코드를 빠른 전달, 지속적인 배포가 가능해진다.
지속적 통합은 모든 코드 변화를 하나의 레포지토리에서 관리하는 것 부터 시작이며 모든 개발팀이 코드 변화를 확인 할 수 있어 투명히 문제점을 파악할 수 있다.
또한 잦은 풀 리퀘스트 (pull request)와 머지 (merge)로 코드를 자주 통합하며 이때 기본적인 테스트도 작동시킬 수 있어 지속적 통합을 통해 개발팀은 각자의 코드를 이른 시점에 합치고 자주 테스트 해볼 수 있다.
지속적 통합이 적용된 개발팀은 코드를 머지하기 전, 이미 빌드 오류나 테스트 오류를 확인하여 훨씬 더 효율적인 개발을 할 수 있다.
지속적인 서비스 제공 및 지속적인 배포를 의미하며 상호 교환적으로 사용되는 이 부분은 Release - Deploy - Operate 단계에서 실행된다.
지속적 배포의 경우 코드 변경 사항의 병합부터 프로덕션에 적합한 빌드 제공에 이르는 모든 단계로 테스트 자동화와 코드 배포 자동화가 포함된다.
이 프로세스를 완료시 프로덕션 준비가 완료된 빌드를 코드 리포지토리에 자동으로 배포할 수 있기 때문에 운영팀이 보다 빠르고 쉽게 애플리케이션을 프로덕션으로 배포할 수 있다.
최근에는 클라우드 기술 발전과 맞물려 지속적 통합과 지속적 배포가 빠른 속도로 진행되어 CI/CD를 하나로 묶어 다루는 경우가 증가하고 있다.
예를 들어 이전엔 배포 자체가 오래걸리고 힘들기에 배포 이전 단계에서 많은 고민을 했다. 서버를 전부 재시작하거나 일부 기능을 제공하지 못하는 경우도 많았기 때문이다. 요즘은 고객의 피드백을 빨리 받기 위함과 서비스를 중단하지 않기 위해서라도 릴리즈만 잘 기록해 두고 바로 배포하는 사례가 증가하고 있다.
지속적 배포의 가장 흔한 사례는 Github Page이다. 지정해 둔 디렉토리에 정해진 방식에 따라 커밋하면 Github Page 가 알아서 해당 index.html 파일과 해당 디렉토리에 있는 파일을 번들링해 Github Page 서버에 업로드한다. 이렇게 자동으로 인터넷에 배포되고 만든 결과물을 쉽게 공유 할 수 있다. 그렇게 공유된 결과물에 대해 피드백도 받을 수 있으므로 지속적 배포라고 할 수 있다.
CI/CD는 지속적 통합 및 지속적 제공 의 구축 사례만을 지칭할 때도 있고 지속적 통합, 지속적 제공, 지속적 배포 모두를 의미할 때도 있다.
혹은 지속적 서비스 제공이 지속적 배포의 과정까지 포함하는 방식으로 사용되기도 한다.
결과적으로 CI/CD는 파이프라인으로 표현되는 실제 프로세스를 의미하고 애플리케이션 개발에 지속적인 자동화 및 모니터링을 추가하는 것을 의미한다. 이는 사례별로 CI/CD 파이프라인에 구현된 자동화 수준 정도에 따라 그 의미가 달라지낟.
대부분의 기업에서는 CI를 먼저 추가한 다음 클라우드 네이티브 애플리케이션의 일부로서 배포 및 개발 자동화를 구현해 나간다.
github action으로 클라이언트 CI/CD를 구축한 배포링크
name: client
on:
push:
branches:
- reference
jobs:
build:
runs-on: ubuntu-20.04
steps:
- name: Checkout source code.
uses: actions/checkout@v2
- name: Install dependencies
run: npm install
working-directory: ./my-agora-states-client-react
- name: Build
run: npm run build
working-directory: ./my-agora-states-client-react
- name: SHOW AWS CLI VERSION
run: |
aws --version
- name: Sync Bucket
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_EC2_METADATA_DISABLED: true
run: |
aws s3 sync \
--region ap-northeast-2 \
build s3://{버킷이름} \
--delete
working-directory: ./my-agora-states-client-react