2편에 이어서 3편도 계속
EC2 와 RDS 프리티어를 구매한 후 세팅까지 완료
자세한 세팅은 나중에 시간 나면 올려보도록 하겠읍니다...
💻 작업 환경
Windows + MacOS
AWS EC2 + RDS
Spring Boot (Gradle)
PostgreSQL
Redis
Docker
🚀 실제 운영 서버에 배포하기
사실 실 배포는 아니지만 어쨌든 개발 서버와 운영 서버를 통합했기 때문에
운영 서버라고 하는게 맞겠지
Deploy 전용 레포지토리를 만들어주고
프록시를 위한 nginx와 쉘 스크립트를 셋팅해준다
📝 deploy.sh
#!/bin/bash
# Installing docker engine if not exists
if ! type docker > /dev/null
then
echo "docker does not exist"
echo "Start installing docker"
sudo apt-get update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
sudo apt update
apt-cache policy docker-ce
sudo apt install -y docker-ce
fi
# Installing docker-compose if not exists
if ! type docker-compose > /dev/null
then
echo "docker-compose does not exist"a
echo "Start installing docker-compose"
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
fi
이건 깃헙 액션에서 제일 처음 실행하는 쉘 스크립트이다
물론 액션에서 바로 명령어를 입력할 수도 있지만
지저분해지니까 따로 빼놓는 게 좋다
나는 도커 이미지를 사용하기 때문에
도커와 도커 컴포즈가 반드시 깔려 있어야한다
따라서 도커와 도커 컴포즈가 설치되어 있는지 확인하고
만약 없으면 다운받아 실행시킨다
도커를 사용하지 않는다면 자바나 파이썬, 노드, npm 등등
셋팅을 확인하는 응용이 가능하겠죠?
📝 deploy.yml
name: Deploy to EC2
on:
workflow_dispatch:
push:
branches:
- main
jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: checkout
uses: actions/checkout@master
- name: create env file
run: |
touch .env
echo "${{ secrets.ENV_VARS }}" >> .env
- name: create remote directory
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
password: ${{ secrets.PASSWORD }}
script: mkdir -p ~/srv/ubuntu
- name: copy source via ssh key
uses: burnett01/rsync-deployments@4.1
with:
switches: -avzr --delete
remote_path: ~/srv/ubuntu/
remote_host: ${{ secrets.HOST }}
remote_user: ${{ secrets.USERNAME }}
remote_key: ${{ secrets.KEY }}
- name: executing remote ssh commands using password
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.KEY }}
script: |
sh ~/srv/ubuntu/deploy.sh
echo "start docker-compose up: ubuntu"
sudo docker-compose -f ~/srv/ubuntu/docker-compose.yml pull
sudo docker-compose -f ~/srv/ubuntu/docker-compose.yml --env-file ~/srv/ubuntu/.env up -d
deploy/main 브랜치를 리스닝하는 액션
실 배포 환경을 위한 .env 파일을 만들어주고
리눅스에 원격 로그인 해서 쉘 명령어까지 입력한다
여기서는 secrets에 여러 환경 변수를 입력해두었는데
- HOST : EC2 public IP
- USERNAME : EC2 username (ubuntu를 사용하기 때문에 기본 ubuntu)
- PASSWORD : EC2 password (기본 패스워드는 없어서 사용하고 싶다면
EC2 콘솔에서 password authentication 세팅해줘야함) - KEY : EC2 pem 키 (windows에서는 ppk로 변환되는데 이거는 잘 안먹으니까 조심)
중간에 rsync 를 사용하는게 있는데
이건 github action runner에 복사된 내 deploy 레포지토리의 소스를
remote, 즉 내 EC2 서버로 동기화하여 복사해주는 리눅스 명령어다
따라서 자동으로 내 레포지토리의 소스가 EC2 까지 복사된다
이후 EC2 서버에 복사된 deploy.sh 파일을 실행하고
도커 셋팅을 완료하면 도커 컴포즈로 서버 배포가 완료된다
📝 docker-compose.yml
version: "3.7"
services:
# redis 설정
redis:
image: "redis:alpine"
network_mode: "host"
# 서버 설정
backend:
image: gengminy/hifi-dev:dev
container_name: backend
network_mode: "host"
env_file:
- .env
# nginx 설정
nginx:
network_mode: "host"
depends_on:
- backend
restart: always
build:
dockerfile: Dockerfile
context: ./nginx
RDS 를 사용하기 때문에
인메모리 DB인 redis 를 제외한 DB관련 컨테이너는 띄우지 않는다
redis는 jwt 리프레시 토큰을 편하게 사용하기 위해 도입했다
nginx를 이용한 프록시 설정으로
80번 포트에서 서버 포트인 8000번 포트로 포워딩 시켰다
nginx는 도커 파일과 default.conf 파일을 따로 두어서 빌드시켰다
단일 서버를 띄우기 때문에 편하게 사용하고자
network_mode 를 host 로 두었다
기본 네트워크 모드는 bridge라서
컨테이너가 독립적으로 존재하는 네트워크를 구성하는데
host로 두게 되면 호스트의 네트워크를 각 컨테이너가 사용하게 된다
이렇게 쓰면 편한게 localhost로도 각 컨테이너에 접근이 가능하다
📝 default.conf
server{
listen 80;
server_name {내 서버 도메인};
access_log /var/log/nginx/access.log backend;
location / {
proxy_pass http://backend:8000;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
nginx에 대해서는 따로 설명을 붙이지 않겠다
80번 포트에서 들어온 요청을 서버 8000번 포트로 포워딩 한다
server_name 은 내가 구매해서 사용중인 도메인을 적어주면 된다
🚀 배포 확인
빌드에 성공한 모습
이후 EC2 서버에 접속해서
sudo docker-compose logs 찍으면 배포가 되었는지 확인할 수 있다
postman에서 리퀘스트 보내도 잘 오는 것을 확인
DB와 redis 관련 동작까지 잘 된다
이렇게 깃헙 액션을 통해 CI/CD 자동화를 해보았는데
처음에는 되게 막막하고 어렵다 생각했는데
자세하게 알아보니까 꽤 재밌었다
물론 하루종일 이거만 붙잡고 있어서 머리가 꽤 아팠는데
아마도 성장통이지 않을까
🔍 Series
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법)
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시)
- [Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 3 (AWS EC2 서버에서 배포)
'🏭 Infra > ⚡ Github Actions' 카테고리의 다른 글
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 2 (스프링 Gradle 빌드 + 도커 푸시) (0) | 2022.08.08 |
---|---|
[Github] Github Actions로 CI/CD 개발 주기 자동화하기 - 1 (깃헙 액션 사용법) (0) | 2022.08.07 |