Travis CI 와 Docker 를 이용해 자동 배포하기 (feat.AWS EB)

2022. 7. 12. 13:46☁️ Cloud

Travis CI 의 가입과정과 github 연동 과정은 생략. 

 

Travis CI 의 흐름

이건 Travis 에만 한정된 내용은 아니고, github action, Jenkins, 등 다양한 CI tool 에 공통되는 내용이라 생각한다. 

 

.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 tbnsok/docker-react-app -f Dockerfile.dev ./

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

after_success:
  - echo "Test success"
  • sudo : 관리자 권한 찾기
  • language : 언어 (플랫폼) 선택
  • services : 도커 환경 구성
  • before_install : 스크립트를 실행할 수 있는 환경 구성
    • docker build -t <사용자 아이디/이미지 이름> -f <개발환경 전용 도커파일> ./
  • script : 실행할 스크립트 (테스트 실행)
    • docker run -e CI=true <사용자 아이디/이미지 이름> npm run test --coverage
    • 해당 도커 이미지 실행 후 테스트 까지 수행하는 명령어
  • after_success : 테스트 성공 후 할 일

 

 

 

.travis.yml 파일 작성 완료 후 소스코드를 github 에 푸시해주면 자동으로 Travis CI 에서 빌드가 진행된다. 

 

 

Travis CI 에서 테스트가 성공적으로 수행됐으니, 다음 단계로 AWS 같은 클라우드 호스팅 서비스에 배포를 해보자!

 

AWS Service 간단히 살펴보기

  • EC2 (Elastic Compute Cloud)
    • AWS 클라우드에서 제공하는 확장식 컴퓨팅으로, 하드웨어에 투자할 필요 없이 애플리케이션을 개발하고 배포할 수 있다. EC2 를 사용해 원하는 만큼 가상 서버를 구축하고 보안 및 네트워크 구성과 스토리지 관리가 가능하다.
    • 쉽게 말해, EC2 인스턴스를 생성한다는 것은, 한대의 컴퓨터를 임대하는 것과 같다. 그 컴퓨터에 OS를 설치하고 웹서비스를 위한 프로그램(웹서버, DB 등) 을 설치하여 사용할 수 있다. 1대의 컴퓨터를 하나의 EC2 인스턴스라고 부른다.
  • EB(Elastic Beanstalk)
    • EB 는 EC2 인스턴스나 DB 처럼 다양한 요소를 포함한 "환경"을 구성하며 만들고 있는 소프트웨어를 업데이트 할 때 마다 자동으로 이 환경을 관리해준다.
    • EB 는 환경이다. 어떤 환경이냐? 다양한 클라우드 컴퓨팅 서비스로 구성된 환경이다.

 

 

AWS EB 생성

 

하단의 환경 생성 버튼을 눌러준다. 

 

Elastic Beanstalk 이 정상적으로 생성됐다.

 

Docker 를 플랫폼으로 사용하는 EB 가 생성됐다. 이제 해당 EB 에 Travis CI 가 소스코드를 배포할 수 있도록 세팅 해주자. 

 

 

기존에 작성해뒀던 .travis.yml 파일에 아래처럼 Deploy 설정을 추가 작성해주자. 

sudo: required

language: generic

services:
  - docker

before_install:
  - echo "start Creating an image with dockerfile"
  - docker build -t tbnsok/docker-react-app -f Dockerfile.dev ./

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

after_success:
  - echo "Test success"
  
-- 여기 아래부터 추가
deploy:
  provider: elasticbeanstalk
  region: "us-east-1"
  app: "docker-react-app"
  env: "Dockerreactapp-env"
  bucket_name: "elasticbeanstalk-us-east-1-084448106455"
  bucket_path: "elasticbeanstalk-us-east-1-084448106455"
  on:
    branch: main
  access_key_id: $AWS_ACCESS_KEY
  secret_access_key: $AWS_SECRET_ACCESS_KEY

 

  • provider : 외부 서비스 표시 (elasticbeanstalk, s3, firebase 등)
  • region : 현재 사용하고 있는 AWS 의 물리적 장소
  • app : 생성한 애플리케이션 이름
  • env : 환경 이름
  • bucket_name : 해당 EB 를 위한 S3 버킷 이름. Travis CI 에서 보낸 소스코드를 압축하여 S3 에 저장하기 때문에 설정이 필요하다. 
  • on.branch : Github Repository 에서 어떤 브랜치에 푸시 됐을 때 AWS 로 자동 배포할 지 설정한다. 

 

 

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

위에서 deploy 설정을 통해 Travis CI 와 AWS 간의 연결을 설정했지만, Travis CI 가 AWS 에 실질적으로 접근하기 위해선 인증 관련 키가 필요하다.

.travis.yml 파일에 AWS 에서 제공하는 Access_key 와 Secret_access_key 를 입력해줘야 한다. IAM 유저를 생성하여 키 값을 발급받자. 

다음 버튼을 계속 눌러 사용자를 생성한다. 

IAM 사용자를 발급받은 이유는 access key 와 Secret access key 를 얻기 위함이었다. 위 두 값은 한번 발급 받으면 다시 알 수 있는 방법이 없기 때문에 메모장 같은 곳에 꼭 복사를 해두자. 

이제 이 key 를 .travis.yml 파일에 삽입하면 되는데, 잘 아시다시피 .travis.yml 파일은 깃허브에 올라가는 공개 파일이다. access key 같은 민감정보를 그대로 드러낼 수 없기 때문에, Travis 웹사이트의 해당 저장소에 키 값을 저장하는 방식을 택할 수 있다. 

 

Travis CI 대시보드로 가서 settings 버튼을 누른다. 

AWS IAM 유저 설정으로 발급 받은 key 를 Environment Variables 에 저장해준다. 이로써 민감 정보인 키 값을 github 로부터 감출 수 있다. 

.travis.yml 의 deploy 설정 중 access_key_id 와 secret_access_key 의 value 자리에 $AWS_ACCESS_KEY, $AWS_SECRET_ACCESS_KEY 를 설정해주면 된다.

 

이로써 Travis CI 가 AWS 의 EB 에 접근할 수 있게 됐다. 이제는 Github 의 main 브랜치에 소스를 PUSH 하면 자동으로 AWS 에 소스코드가 전달되어 배포할 수 있게 됐다!