Skip to content

4. 지속적 통합 지속적 배포

unchaptered edited this page Sep 17, 2022 · 12 revisions

목차

  1. GitHub Action 을 이용한 EC2 자동화
  2. GitHub Action 을 이용한 Test 자동화
  3. GitHub Action 을 이용한 Lambda 자동화

4.1. GitHub Action 을 이용한 EC2 자동화

4.1.1. 구현 동기

팀에서 추구하는 가치인 안정성과 지속적인 협업 을 달성하기 위해서 서로 많은 피드백을 교류하였습니다. 이 과정에서 짧은 기간이지만 BugFix, HotFix 등을 통해서 잦은 재배포를 진행하게 되었습니다.

이러한 과정을 매번 ssh 를 통해서 진행하였고 매번 5분 ~ 10분 씩 시간이 소모되었습니다. 이 시간이 백엔드의 생산성을 저해한다고 판단해서 CI/CD 를 도입해야 한다고 느꼈습니다.

4.1.2. 선택지

  • AWS Codedeploy

    • Codepipeline
      • CI : GitHub 연동을 기본적으로 지원하고 특정 브런치에 push 같은 트리거를 지원합니다.
      • CD : appspec.yml 혹은 ecosystem.json 등을 사용해서 서버를 자동으로 실행할 수 있습니다.
      • Hooks : ~script/before-install.sh 같은 CodeDeploy Hooks 실행에 제한사항이 없습니다.
      • ENV : CodePipeline 에 작업을 추가할 때, 환경변수를 json 파일안에 "namespace": "value" 구조로 넣어서 사용해야 합니다.
      • Pricing : 프리티어는 활성 CodePipeline 1 개 무료, 초과분은 개당 1$ / 1 month.
    • GitHub Action
      • GitHub 에 종속적인 툴이며, 별도로 S3 버킷 이 필요합니다.
      • CI : GitHub 의 Shell 에서 작동되며 특정 브런치에 push 뿐만 아니라, PR, Issue, Tags, Release 등의 다양한 상황에서도 트리거 작동이 가능합니다.
      • CD : 다양한 외부 공급자(CodeDeploy) 와 협력하여 많은 사이트에 배포 자동화를 제공해줍니다.
      • Hooks : ~script/before-install.sh 같은 CodeDeploy Hooks 실행에 제한사항이 없습니다.
      • ENV : GitHub secret variables 을 이용하여, .env 파일을 생성하고 직접 변수를 주입할 수 있습니다.
      • Pricing : 개인 및 팀 단위에서는 월간/일간 제한시간을 기준으로 무료이며, 팀 단위는 44$ / 1 month, 1 people 기업에서는 231$ / 1 month, 1 people 의 비용이 요구 됩니다.
  • 서드파티 어플리케이션

    • Circle CI
      • 통합 부터 배포까지 결합된 상태로 사용하는 서비스 입니다.
      • CI :GtiHub 연동을 기본적으로 지원하고 특정 브런치에 push 같은 트리거 지원됩니다.
      • CD : 모든 코드를 Docker 기반으로 배포를 하기 때문에, Docker 를 잘 모르는 사용자는 이후의 고도화 단계 진행에 어려움을 겪을 수 있습니다.
      • ENV : 서비스 자체에서 안에 환경변수 를 주입해주는 서비스가 제공 되고 있습니다. 예) NODE_VERSION=16 이런 식으로 가능합니다.
      • Pricing : 기본적으로 Free 를 제공, 추가적인 기능은 비용 청구 발생합니다.
    • Travis CI
      • 통합 부터 배포까지 결합된 상태로 사용하는 서비스 입니다.
      • CI :GitHub 연동을 기본적으로 지원하고 특정 브런치에 push 같은 트리거 지원됩니다.
      • CD : .travis.yml 을 기반으로 손쉬운 배포 자동화를 지원됩니다.
      • ENV : 서비스 자체에서 안에 환경변수 를 주입해주는 서비스가 제공되고 있습니다.
      • Pricing : 기본적으로 10000 Credit 을 한정 으로 무료인데, 생각보다 빨리 사라질 뿐더러 그 이후의 비용 청구가 개인 기준, 69$ / 1 month , 759$ / 1 year 으로 너무 비쌉니다.
    • Cyclic.sh
      • 통합 부터 배포까지 결합된 상태로 사용되는 서비스 입니다.
      • 최근에 나온 서비스고 무료 DynamoDB Storage 같은 저장 공간을 제공해줍니다.
      • 컨테이너, 이미지 기반이 아니라 서버리스 로 배포가 됩니다.
      • CI : GitHub 연동이 기본적으로 하고 특정 브런치에 push 같은 트리거 지원됩니다.
      • CD : 기본적으로 별도의 설정파일이 크게 필요 없이 배포 자동화를 지원합니다.
      • ENV : 서비스 자체에서 안에 환경변수 를 주입해주는 서비스가 제공되고 있습니다.
      • Pricing : 현재 단계에서는 영원히 무료 로 명시되어 있습니다.

4.2.3 구현 상황

저희 팀이 조사한 3개의 서드파티 어플리케이션 은 각각 다음과 같은 큰 결점을 가지고 있었습니다.

  1. Circle CI : 무조건 Docker 로 배포가 진행
  2. Travis CI : 무조건 Price 가 청구됨
  3. Cyclic.sh : 초기 버전이라서 안정성이 불확실

따라서 최대한 무료, 낮은 의존성, 높은 안전성 을 가지고 있는 솔루션을 채택하고 싶었습니다. 이에 2 개의 서비스의 장점은 다음과 같았습니다.

  1. AWS CodePipeline : AWS 인프라 차원에서 trigger 설정 및 작동
  2. GitHub Action : GitHub 차원에서 trigger 설정 및 작동
선택지 장점 단점
AWS CodePipeline 편리하게 설정할 수 있음 AWS 인프라에 대한 의존성이 강해짐
GitHub 에 대한 CI 를 작성하는 것과 거리감이 심함
VSC 에서 이를 수정하기 힘들어짐
GitHub Action 확장성이 좋아서 다른 Infra Provider 에도 배포 가능
GitHub 에 다양한 기능과 결합하여 사용 가능
GitHub worflows 라는 다소 낯선 파일이 필요함
CodeDeploy 와의 직접적인 커넥션이 사라지며, S3 버킷에 업로드를 해야함

둘 다 무료였기 때문에, 저희는 조금 어렵더라도 의존성 및 확장성 에 큰 장점을 가지고 있는 GitHub Action 을 선택하게 되었습니다.


4.2.1. 구현 동기

2022-09-12 에 22개의 API 중에서 20개가 구현되었습니다.
2022-09-17 에 중간 발표가 있었으며, 이에 따라서 추가 기능이 나오기 전에 테스트 자동화 를 구현해두고 싶었습니다.

시간이 날 때마다, 유닛 테스트를 작성해가면서 서버를 더욱 안전하게 만들면서 리팩토링을 진행하고 싶었습니다.

따라서, 특정한 상황에서 테스트 코드 가 자동으로 실행되어 서버 코드의 변경에 따라서 자연스럽게 테스트 코드를 재실행하게 만들고 싶었습니다.

4.2.2. 구현 상황

현재는 다음과 같이 2가지 상황에서 worflows - Automated-Jest 가 실행되고 있습니다.

  1. develop : PR
  2. test/** : push

해당 workflows2 개의 step 로 이루어진 1 개의 job 으로 구성되어 있습니다.

  • step 1. Prepare Environment and Dependencies, and then Run Jest
  • step 2. IF Failure and Close PR

4.3. GitHub Action 을 이용한 Lambda 자동화

작성 A