이전 게시글에서는 Docker를 설치하고 작동 테스트까지 완료했다.
이제 애플리케이션을 개발하고, 배포하면 될 것 같지만 아직 한 발 남았다. CI/CD 환경을 구축해보자.
그전에 잠깐, CI/CD란 도대체 뭘까?
CI/CD는 소프트웨어 개발과 배포를 자동화하고 효율화하는 DevOps 개념이며,
CI(Continuous Integration, 지속적 통합)와 CD(Continuous Deployment, 지속적 배포)로 나뉘어진다.
CI(Continuous Integration, 지속적 통합)
수정된 코드를 공유 저장소에 통합하는 과정을 일컫는다.
코드 변경 시 자동으로 빌드 후 테스트를 통해 문제가 발생했는지 즉시 확인한다.
CD(Continuous Deployment)
CI이후 수정된 코드를 운영 서버 혹은 테스트 서버에 자동 배포하는 과정을 일컫는다.
사람의 개입 없이 코드가 Merge될 때 곧바로 서비스에 적용된다.
CD를 통해 빠르고 안정적이게 배포를 진행할 수 있으며, 자동화로 휴먼에러를 감소시킬 수 있다.
간단히 말하면 수정된 코드를 빌드하고 테스트 후, 서버에 배포하는 과정을 자동화하는 것을 말한다.
대표적인 도구로는 GitHub Actions, Jenkins, GitLab CI/CD가 있다.
만약 코드를 수정 후 이를 배포하는 과정을 손수 진행한다면
- 코드를 수정 후
Pull Request를 날린다.main(혹은dev) 브랜치에서 프로젝트를 빌드하고 테스트를 수행한다.- 테스트를 성공했다면 이를
Docker Hub에Push한다.- 배포 환경에서 (예를 들면
AWS EC2) 어플리케이션 이미지를Pull한 후 실행한다.
매우 귀찮고 휴먼 에러의 가능성도 굉장히 높다.
반면 CI/CD 환경이 잘 구축된 프로젝트의 경우 Pull Request 딸깍 한 번으로 위의 모든 과정이 자동으로 처리된다.

이제 CI/CD에 대해서 대충 이해했다. 이제 각 도구별 특징을 비교해보고, 환경을 직접 구축해보자.

GitHub에 내장된CI/CD도구로,.github/workflows/*.yml경로에 워크플로우를 작성한다면 자동 실행된다.
Marketplace에 내장된 다양한액션을 통해테스트,배포등을 미리 구성할 수 있다.
GitHub사용자라면 누구나 쉽게 설정할 수 있으며, 클라우드 기반으로 동작하며 별도 인프라가 필요하지 않다.
하지만GitHub를 사용하지 않는 환경에서는 사용하지 못한다.

가장 오래되고 강력한 오픈소스
CI/CD도구로, 다양한플러그인기반으로 확장될 수 있다.
수천개의 플러그인으로 개발자 임의로커스터마이징이 쉽다.
또, 다른 형상 관리 시스템에 종속적이지 않아독립적으로 사용 가능하다.
하지만 설정이 비교적 복잡하며, 별도의 인프라를 필요로 하며 개발자가 보안 설정을 직접 관리해야 한다.

GitLab에 내장된CI/CD도구로,GitLab의 리포지토리, 이슈 관리, 배포 등을 모두 통합한다.
.yml파일 기반으로 파이프라인을 구성할 수 있으며, 자체GitLab Runner를 설정 가능하다.
하지만GitHub보다 사용자가 적으며 비교적 초기 설정이 복잡하다.