도커 - 간단한 테스트와 배포
in Docker
1. Travis CI
- Github에서 진행되는 오픈소스 프로젝트를 위한 지속적인 통합 서비스
- Github repository에 있는 프로젝트를 특정 이벤트에 따라 자동으로 테스트, 빌드하거나 배포 가능
- Private repository의 경우 유료
흐름
- 로컬 Git에 있는 소스를 Github에 푸시
- Github master 저장소에 소스가 push되면 Travis CI에게 소스가 Push되었다고 전달
- Travis CI는 업데이트 된 소스를 Github에서 가져옴
- 깃헙에서 가져온 소스의 테스트 코드를 실행
- 테스트 코드 실행 후 테스트 성공시 AWS 같은 호스팅 사이트로 보내서 배포
2. travis.yml
Travis CI를 이용해서 테스트 코드를 실행하고 애플리케이션을 배포하기 위해서는 travis.yml으로 설정 작업을 해야한다.
# .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란?
- AWS Elastic Beanstalk 는 Apache, NginX같은 친숙한 서버에서 Java, NET, PHP, Node.js, Pythonm Ruby, Go 및 Docker와 함께 개발된 웹 응용프로그램 및 서비스를 배포하고 확상하기 쉬운 서비스
- EC2 인스턴스나 데이터베이스 같은 많은 것들을 포함한 환경을 구성하며 만들고 있는 소프트웨어를 업데이트 할때마다 자동으로 이 환경을 관리
로드 밸런서
- 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에 배포할 것인지
소스 파일 전달하기 위한 접근 요건
IAM
- 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앞에 $을 붙여주기