이번에는 저번에 만들었던 소스 코드를 Gihub 에 먼저 배포를 하고, Travis CI 라는 곳에서 소스를 가져간 후에 그 곳에서 소스 코드가 잘 돌아가는지 Test를 한 후 만약 성공한다면 AWS 에 보내서 배포까지 해보자.
Local git -> Github -> Travis CI -> AWS
1. Local Git 에 있는 소스를 Github 저장소에 Push
2. Github Main 저장소에 소스가 Push 되면 Travis CI 에게 소스가 Push 되었다고 전달
3. Travis CI 는 업데이터된 소스를 Github 에서 가지고 온다.
4. Github 에서 가져온 소스의 테스트 코드를 실행
5. 테스트 코드 실행 후 테스트가 성공하면 AWS 같은 호스팅 사이트로 보내서 배포
지금까지는 Travis 에 가입하고 어떤 저장소를 관리할 것인지를 설정해줬다.
이제는 Github 에서 Travis CI 로 소스를 어떻게 전달 시킬 것이며 전달 받은 것을 어떻게 Test 하며 그 테스트가 성공했을 때 어떻게 AWS에 전달해서 배포를 할 것인지를 설정해야한다.
즉 Docker 에서는 Dockerfile , docker-compose.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 supportkim/docker-react-app -f Dockerfile.dev .
script: # 실행할 스크립트 (테스트 실행)
- docker run -e CI=true supportkim/docker-react-app npm run test -- --coverage
after_success: # 테스트 성공 후 할일
- echo "Test success"
해당 소스 코드를 Github 에 다시 push 를 하면 Travis CI 가 yml 파일에 있는 것을 수행한다.
테스트는 성공했고, 이제 AWS 에 배포를 해보자.
원래는 그냥 EC2 에만 배포를 해도 되지만 이번에는 EB 라는 것도 이용해보자.
AWS 에서 EB Dashboard 에 들어가고 애플리케이션 이름을 적어주고 플랫폼에 현재 Docker 를 사용할 것 이기 때문에 Docker 를 지정하고 플랫폼 브랜치는 일반 Linux 로 하고 애플리케이션을 만들면 된다.
deploy: # 배포 관련된 설정
provider: elasticbeanstalk # 외부 서비스 표시(s3,eb,firebase 등)
region: ap-northeast-2 # 현재 사용하고 있는 AWS 의 물리적 장소
app: docker-react-app # 생성한 애플리케이션의 이름
env: "DockerReactApp-env" # eb 에 명시된 env 명
bucket_name: "S3 bucket 이름" # 해당 EB 을 위한 S3 버킷 이름
bucket_path: "docker-react-app" # 애플리케이션의 이름과 동일
on: # 어떤 브랜치에 푸시할 때 AWS 에 배포할 것인지를 설정
branch: main
하지만 이렇게 아무런 인증 없이 Travis CI 에서 마음대로 AWS 에 파일을 전송할 수 없다.
이제는 Travis CI 가 AWS 에 접근할 수 있도록 하는 방법을 알아보자.
인증을 위해서는 API Key 가 필요한데, 어떻게 API Key 를 얻을 수 있을까?
deploy:
provider: elasticbeanstalk
region: ap-northeast-2
app: docker-react-app
env: "DockerReactApp-env"
bucket_name: "S3 bucket 이름"
bucket_path: "docker-react-app"
on:
branch: main
access_key_id: $AWS_ACCESS_KEY
secret_access_key: $AWS_SECRET_ACCESS_KEY
이렇게 Travis CI 가 AWS 에 접근할 수 있도록 만들어줬다.
git add . -> git commit -> git push 를 하게 되면 Travis CI 대시보드를 가보면 현재 push 한 소스 코드를 가지고 실행을 한다.
하지만 에러가 발생한다..
포트 맵핑을 하지 않아서 발생한 에러이다.
이제는 Github 에 Main 브랜치에 푸시를 하면 모든 프로세스가 한 번에 돌아가고 앱이 배포가 된다.
작업에서 환경 종료를 눌러야 과금이 생기지 않는다..!
# .dockerignore
package-lock.json
node_modules
# Dockerfile.dev
FROM node:16-alpine
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
CMD ["npm" , "run" , "start"]
# Dockerfile
FROM node:16-alpine as builder
WORKDIR '/app'
COPY package.json .
RUN npm install
COPY . .
RUN npm run build
FROM nginx
COPY --from=builder /app/build /usr/share/nginx/html
# docker-compose-dev.yml
version: '3' # 도커 컴포즈 버전
services: # 이곳에 실행하려는 컨테이너들을 정의
react: # 컨테이너 이름
build: # 현 디렉토리에 있는 Dockerfile 사용
context: . # 도커 이미지를 구성하기 위한 파일과 폴더들이 있는 위치 (현재는 Dockerfile.dev 와 같은 경로에 있기 때문에 . 으로 명시)
dockerfile: Dockerfile.dev # 도커 파일 어떤 것인지 지정
ports: # 포트 매핑 -> 로컬 포트 : 컨테이너 포트
- "3000:3000"
volumes: # 로컬 머신에 있는 파일들 맵핑
- /usr/src/app/node_modules
- ./:/usr/src/app
stdin_open: true # 리액트 앱을 끌때 필요 (버그 수정)
tests:
build:
context: .
dockerfile: Dockerfile.dev
volumes:
- /usr/src/app/node_modules
- ./:/usr/src/app
command: ["npm" , "run" , "test"]
# docker-compose.yml
version: "3"
services:
web:
build:
context: .
dockerfile: Dockerfile
ports:
- "80:80"
IAM 설정
AWSElasticBeanstalkMulticontainerDocker
AWSElasticBeanstalkWebTier
AWSElasticBeanstalkWorkerTier
ElasticBeanstalk 환경 만들기
react 앱을 github 에 올려서 자동으로 테스트를 하고 EB 를 통해 배포를 하도록 한다.
name: Deploy Frontend
# Main 브랜치에 push 를 했을때만 아래에 있든 task 를 실행
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# docker Login
- run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
# Dockerfile.dev 로 build
- run: docker build -t supportkim/react-test -f Dockerfile.dev .
# 위에서 만든 image 로 run (test)
- run: docker run -e CI=true supportkim/react-test npm test
- name: Generate deployment package
run: zip -r deploy.zip . -x '*.git*'
# EB 에 배포
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v18
# 필요한 accessKey , secretKey 넣어주기
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
application_name: react-docker-gh-test
environment_name: React-docker-gh-test-env
existing_bucket_name: elasticbeanstalk-ap-northeast-2-637423586273
region: ap-northeast-2
version_label: ${{ github.sha }}
deployment_package: deploy.zip
이렇게 설정하고 나고 push 를 하면 github 에 올라가게 되고 바로 Github Action 을 통해서 테스트와 배포가 자동으로 이루어진다.
모든 과정이 끝나고 나면 AWS 의 Elastic Beanstalk Dashboard 가보면 환경을 업데이트가 된다.
이제는 Main 브랜치에 push 하기만 하면 알아서 테스트 후 배포까지 된다.