도커 - 간단한 테스트와 배포

1. Travis CI


  • Github에서 진행되는 오픈소스 프로젝트를 위한 지속적인 통합 서비스
  • Github repository에 있는 프로젝트를 특정 이벤트에 따라 자동으로 테스트, 빌드하거나 배포 가능
  • Private repository의 경우 유료


흐름

그림1

  1. 로컬 Git에 있는 소스를 Github에 푸시
  2. Github master 저장소에 소스가 push되면 Travis CI에게 소스가 Push되었다고 전달
  3. Travis CI는 업데이트 된 소스를 Github에서 가져옴
  4. 깃헙에서 가져온 소스의 테스트 코드를 실행
  5. 테스트 코드 실행 후 테스트 성공시 AWS 같은 호스팅 사이트로 보내서 배포


2. travis.yml


Travis CI를 이용해서 테스트 코드를 실행하고 애플리케이션을 배포하기 위해서는 travis.yml으로 설정 작업을 해야한다.

그림2


# .travis.yml
sudo: required

language: generic

services:
  - docker

before_install:
  - echo "start creating an image with dockerfile"
  - docker build -t backtony/react -f Dockerfile.dev .

script: 
  - docker run -e CI=true backtony/react npm run test -- --coverage

after_success:
  - echo "TEST success"
  • .travic.yml은 앞에 .을 붙임
  • sudo : 관리자 권한 갖기
  • language : 언어(플랫폼) 선택
  • services : 도커 환경 구성
  • before_install : 스크립트를 실행할 수 있는 환경 구성(테스트 전 해야할 작업)
  • -e CI=true : Travis CI에서 이 부분이 없으면 에러가 남
  • script : 실행할 스크립트(테스트 실행 작업)
  • after_success : 테스트 성공 후 할 작업
  • – –coverage : 테스트 내용을 상세하게 확인


3. AWS 알아보기


EC2란?

  • Amazon Elastic Compute Cloud(Amazon EC2)는 클라우드에서 확장식 컴퓨팅 제공
  • 하드웨어에 선투자할 필요 없이 더 빠르게 애플리케이션 개발 배포 가능
  • 원하는 만큼 가상 서버를 구축하고 보안 및 네트워크 구성과 스토리지 관리 가능
  • 요구 사항이나 갑작스러운 인기 증대 등 변동 사항에 따라 신속하게 규모 확장, 축소가 가능해 서버 트래픽 예측 필요성이 줄어듬

간단하게 한대의 컴퓨터를 임대한다고 생각하면 된다. 그 컴퓨터에 OS를 설치하고 웹서비스를 위한 프로그램들(웹서버, DB)를 설치해서 사용하면 되는 것이다. 1대의 컴퓨터를 하나의 EC2 인스턴스라고 한다.


EB란?

그림3

  • AWS Elastic Beanstalk 는 Apache, NginX같은 친숙한 서버에서 Java, NET, PHP, Node.js, Pythonm Ruby, Go 및 Docker와 함께 개발된 웹 응용프로그램 및 서비스를 배포하고 확상하기 쉬운 서비스
  • EC2 인스턴스나 데이터베이스 같은 많은 것들을 포함한 환경을 구성하며 만들고 있는 소프트웨어를 업데이트 할때마다 자동으로 이 환경을 관리


로드 밸런서

그림4

  • Elastic Beanstalk 안에서 관리
  • 트래픽이 적을 때는 로드 밸랜서 하나와 EC2 하나만으로 관리
  • 트래픽이 많을 때는 EC2하나로 관리 불가능 -> EC2가 하나 더 증가하면서 로드 밸런서를 통해서 요청들을 분산
  • 이런 식의 동작 과정을 Elastic Beanstalk 이 알아서 처리해줌


4. 배포하기


#.travis.yml

sudo: required

language: generic

services:
  - docker

before_install:
  - echo "start creating an image with dockerfile"
  - docker build -t backtony/react -f Dockerfile.dev .

script: 
  - docker run -e CI=true backtony/react npm run test -- --coverage

deploy:
  edge: true
  provider: elasticbeanstalk
  region: ap-northeast-2
  app: docker-react-app
  env: DockerReactApp-env
  bucket_name: elasticbeanstalk-ap-northeast-2-972153559337
  bucket_path: docker-react-app
  on:
    branch: master
  • provider : 외부 서비스 표시(s3, elaticbeanstalk, firebase 등등)
  • region : 현재 사용하고 있는 AWS의 서비스가 위치하고 있는 물리적 장소
    • 한국이라면 ap-northeast-2
  • app : 생성된 애플리케이션의 이름
  • env : 추가적으로 설정하지 않으면 app의름을 붙여서 자동으로 생성됨
    • 웹사이트에 적혀있으니 그것 참고해서 작성
  • bucket_name : elasticbeanstalk 을 위한 s3 버켓 이름
    • Travis CI에서 AWS elasticbeanstalk을 통해 소스 배포과정에서 바로 elastic으로 가는게 아니라 travis에서 가지고 있는 파일을 압축해서 먼저 S3로 보내므로 필요함
    • elasticbeanstalk을 생성할 때 S3가 자동적으로 생성 됨, 웹사이트에서 참고하여 작성
  • bucket_path : 애플리케이션 이름과 동일
  • on branch : 어떤 브랜치에 push를 할때 AWS에 배포할 것인지


소스 파일 전달하기 위한 접근 요건

그림3

IAM

그림4

  • Secret Key를 받기 위해서는 IAM USER을 생성해야 함
  • AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹서비스
  • IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어
  • 발급받은 엑서스 키와 비밀 엑세스키를 Travis.yml 파일에 적어줘야 Travis CI에서 AWS에 엑세스 가능
#.travis.yml

sudo: required

language: generic

services:
  - docker

before_install:
  - echo "start creating an image with dockerfile"
  - docker build -t backtony/react -f Dockerfile.dev .

script: 
  - docker run -e CI=true backtony/react npm run test -- --coverage

deploy:
  edge: true
  provider: elasticbeanstalk
  region: ap-northeast-2
  app: docker-react-app
  env: DockerReactApp-env
  bucket_name: elasticbeanstalk-ap-northeast-2-********
  bucket_path: docker-react-app
  on:
    branch: master
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_ACCESS_KEY
  • 액세스키를 추가했지만 그냥 그대로 적으면 다른 사람들이 볼 수 있으므로 private한 곳에 작성하고 가져와서 사용해야 함
  • Travis CI 홈페이지에서 해당 리포지토리의 Settings에 Environment Variables에 설정
  • 작성한 Name앞에 $을 붙여주기



본 포스팅은 인프런 John Ahn님의 ‘따라하며 배우는 도커와 CI환경’ 강의를 듣고 정리한 내용을 바탕으로 복습을 위해 작성하였습니다. [강의 링크]


© 2021. By Backtony