카테고리 없음

[따라하며 배우는 도커와 CI환경] 8. 간단한 어플을 실제로 배포해보기(테스트 & 배포 부분)

bona.0 2023. 2. 6. 22:06

본 포스팅은 인프런에서 강의하시는 John Ahn님의 '따라하며 배우는 도커와 CI환경'이라는 강의를 보며

제가 이해한 내용을 정리하는 포스팅입니다. 

 

전체 개발 순서

 

깃허브에 코드 올리기

  • Github에서 NEW REPOSITORY 만들기
  • 로컬 git 저장소 만들기 : [c]git init[\c]
  • 현재까지의 소스를 로컬 git 저장소에 저장[c]git add .; git commit -m "first commit"[\c]
  • 로컬 git 저장소와 Github Remote을 연결시키기 [c]git remote add origin GIT_REPO_URL[\c]
  • 로컬 git 저장소에 있는 소스를 github에 업로드 시키기: [c]git push origin[\c]

 

Travis CI란?

Travis CI는 Github에서 진행되는 오픈소스 프로젝트를 위한 지속적인 통합(Continuous Integration) 서비스이다. 2011년에 설립되어 2012년에 급성장하였으며 Ruby언어만 지원하였지만 현재 대부분의 개발 언어를 지원하고 있다. Travis CI를 이용하면 Github repository에 있는 프로젝트를 특정 이벤트에 따라 자동으로 테스트, 빌드하거나 배포할 수 있다. 

 

Travis CI 사용 순서: 로컬 Git➡Github➡Travis CI➡AWS

 

 

.travis.yml 파일 작성하기(테스팅까지)

Travis CI를 이용해서 테스트 코드를 실행하고 애플리케이션을 배포까지 해주어야한다. 이를 위해 travis.yml파일을 작성해보자.

sudo: required # 관리자 권한 갖기

language: generic # 언어 선택

services:
  - docker # 도커 환경 구성

before_install: # 스크립트를 실행할 수 있는 환경 구성
  - echo "start creating an image with dockerfile"
  - docker build -t bona/docker-react-app -f Dockerfile.dev . # 이미지 빌드

script: # 실행할 스크립트
  - docker run -e CI=true bona/docker-react-app npm run test -- --coverage
  	# --coverage: 자세히 빌드 결과보기

after_success: # 테스트 성공 후 일
  - echo "Test Success"

이 파일을 Github에 올리면(git push), Travis CI가 인식하고 travis.yml 파일을 실행시킴

 

 

AWS 알아보기

EC2란

Amazon Elastic Compute Cloud(Amazon EC2)는 Amazon Web Services(AWS) 클라우드에서 확장식 컴퓨팅을 제공한다. 한대의 컴퓨터를 임대한다고 생각하면 되고, 하나의 컴퓨터를 EC2 인스턴스라고 한다.

 

EB란

AWS Elastic Beanstalk는 Apache, Nginx 같은 친숙한 서버에서 Java, NET, PHP, Node.js, Python, Ruby, Go 및 Docker와 함께 개발된 웹 응용 프로그램 및 서비스를 배포하고 확장하기 쉬운 서비스이다.

Elastic Beanstalk는 하나의 환경이고, 그 안에 여러개의 EC2 인스턴스나, DB, 로드밸런서 등을 넣을 수 있다.

EB를 사용하는 이유

인스턴스 수가 많아진다면 로드발란서가 요청을 자동으로 분배해줄 수 있기 때문.

 

.travis.yml 파일 작성하기(배포 부분)

테스트에 성공한 소스를 AWS Elastic Beanstalk에 자동으로 배포하는 부분을 travis 파일에 넣어줘보자.

EB가 생성될 때 자동적으로 s3 bucket이 생성되고. Travis CI는 travis에서 가지고 있는 파일들을 압축해서 s3에 보낸다.

deploy:
  edge: true
  provider: elasticbeanstalk # 외부 서비스 표시(s3, elasticbeanstalk, firebase)
  region: ap-northeast-2 # 현재 aws 서비스의 물리적 장소
  app: docker-react-app # 생성된 어플리케이션 이름
  # env: DockerReactApp-env # 생량한다면 자동으로 'app이름-env' 형태로 생성됨
  bucket_name: elasticbeanstalk-ap-northeast-2-972153559337 # 해당 elasticbeanstalk을 위한 s3
  bucket_path: docker-react-app # app 이름과 동일
  on:
    branch: master  # Github의 어떤 브랜치에 Push를 할 때 AWS에 배포를 할 것인지

 

Travis CI의 AWS접근을 위한 API 생성

현재까지 .travis.yml에서 한 일

  • aws에 어떤 파일을 전해줄건지
  • aws의 어떤 서비스를 이용할건지
  • 부수적인 설정

➡ Travis CI와 AWS가 소통을 할 수 있기 위해서 인증하는 부분을 설정해야 한다.

.travis.yml은 깃헙의 public repository에 있기 때문에 이 파일 안에 key 값을 직접적으로 명시하면 안된다. 따라서 다른 곳에 적고 그것을 가져와야 한다.

Travis 웹 사이트 대시보드의 설정의 Environment Variables에 AWS_ACCESS_KEY , AWS_SECRET_ACCESS_KEY를 직접 설정해준다.

# deploy: 밑부분에
	  access_key_id: $AWS_ACCESS_KEY
   	  secret_access_key: $AWS_SECRET_ACCESS_KEY

 

최종 배포 후 Port 매핑으로 인해 발생하는 오류

Nginx가 기본적으로 80번 포트를 사용하기 때문에 Dockerfile에 EXPOSE 80을 넣어줘서 nginx 컨테이너의 포트를 열어주어야 한다

 

리벅시 프록시 구성은 이 블로그에 잘 나와있다.