test github action
- ๋ฐฑ์๋: Spring Boot
- ๋ฐ์ดํฐ๋ฒ ์ด์ค: MySQL
- ORM: MyBatis
- View: Jsp
- ์ธํ๋ผ:
- Docker & Docker Compose
- Nginx (๋ฌด์ค๋จ ๋ฐฐํฌ)
- ๋ฐฐํฌ ๋ฐฉ์: ๋ธ๋ฃจ/๊ทธ๋ฆฐ ๋ฌด์ค๋จ ๋ฐฐํฌ!!
- CI/CD: GitHub Actions
์ด ํ๋ก์ ํธ๋ Nginx์ ๋ธ๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ ๋ฐฉ์์ ์ฌ์ฉํ์ฌ ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ๊ตฌํํ๊ณ ์์ต๋๋ค.
- Nginx: ํธ๋ํฝ์ ๋ธ๋ฃจ/๊ทธ๋ฆฐ ํ๊ฒฝ์ผ๋ก ๋ผ์ฐํ
- Docker Compose: ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์
- GitHub Actions: CI/CD ์๋ํ
# GitHub์์ ๋ ํฌ์งํ ๋ฆฌ ํฌํฌ (์น ์ธํฐํ์ด์ค์์ ์ํ)
# ํฌํฌํ ๋ ํฌ์งํ ๋ฆฌ ํด๋ก ํ๊ธฐ
git clone https://github.com/your-username/your-repo.git
cd your-repo
# ์๋ณธ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ upstream์ผ๋ก ์ถ๊ฐ
git remote add upstream https://github.com/original-username/original-repo.git
# ๋ชจ๋ ๋ธ๋์น ํ์ธ
git branch -a
# ํ์ํ ๋ธ๋์น๋ก ์ฒดํฌ์์
git checkout mainssh -i your-key.pem ubuntu@your-ec2-public-ip# ๊ธฐ๋ณธ ํจํค์ง ์
๋ฐ์ดํธ
sudo apt-get update
sudo apt-get upgrade -y
# Git ์ค์น
sudo apt-get install -y git
# ํ๋ก์ ํธ ๋๋ ํ ๋ฆฌ ์์ฑ ๋ฐ ์ด๋
mkdir -p ~/app
cd ~/app
# ๋ ํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/your-username/your-repo.git .
# setup.sh ์คํฌ๋ฆฝํธ์ ์คํ ๊ถํ ๋ถ์ฌ
chmod +x setup.sh# ์คํฌ๋ฆฝํธ ์คํ
./setup.shsetup.sh ์คํฌ๋ฆฝํธ๋ ๋ค์ ์์ ์ ์๋์ผ๋ก ์ํํฉ๋๋ค:
- ์์คํ ํจํค์ง ์ ๋ฐ์ดํธ
- Git, curl, wget ๋ฑ ๊ธฐ๋ณธ ๋๊ตฌ ์ค์น
- Docker ๋ฐ Docker Compose ์ค์น
- Docker ๊ถํ ์ค์
- ๋ฐฉํ๋ฒฝ ์ค์ (SSH, HTTP, HTTPS ํฌํธ ์คํ)
- ํ์์กด์ Asia/Seoul๋ก ์ค์
- Swap ํ์ผ ์ค์ (2GB)
- ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ํ ๋ฆฌ ์์ฑ (~/app)
์คํฌ๋ฆฝํธ ์คํ ํ ์๋ฒ๋ฅผ ์ฌ๋ถํ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค:
sudo reboot# EC2 ์ธ์คํด์ค์ ๋ค์ ์ ์
ssh -i your-key.pem ubuntu@your-ec2-public-ip
# app ๋๋ ํ ๋ฆฌ๋ก ์ด๋
cd ~/app
# ์คํฌ๋ฆฝํธ ์คํ ๊ถํ ๋ถ์ฌ
chmod +x scripts/make-executable.sh
bash scripts/make-executable.sh
# ์ด๊ธฐ ๋ฐฐํฌ ํ๊ฒฝ ์ค์
bash scripts/init-deploy.sh YOUR_DOCKER_HUB_USERNAME์ด๊ธฐ ์ค์ ํ ๋ธ๋ฃจ ํ๊ฒฝ์ด ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค.
์น ๋ธ๋ผ์ฐ์ ์์ http://your-ec2-public-ip๋ก ์ ์ํ์ฌ ์คํ๋ง๋ถํธ ์ ํ๋ฆฌ์ผ์ด์
ํ์ธ
- ์ฝ๋๋ฅผ main/master ๋ธ๋์น์ ํธ์ํฉ๋๋ค.
- GitHub Actions๊ฐ ์๋์ผ๋ก CI/CD ํ์ดํ๋ผ์ธ์ ์คํํฉ๋๋ค:
- ์ฝ๋ ๋น๋ ๋ฐ ํ ์คํธ
- Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ Docker Hub์ ํธ์
- ํ์ฌ ๋นํ์ฑ ํ๊ฒฝ(๋ธ๋ฃจ ๋๋ ๊ทธ๋ฆฐ)์ ์ ๋ฒ์ ๋ฐฐํฌ
- ํฌ์ค์ฒดํฌ ํ ์ฑ๊ณต ์ ํธ๋ํฝ ์ ํ
ํ์ํ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋น๋ ๋ฐ ๋ฐฐํฌํ ์ ์์ต๋๋ค:
# ์คํฌ๋ฆฝํธ ์คํ ๊ถํ ๋ถ์ฌ
bash scripts/make-executable.sh
# ๋น๋์ ๋ฐฐํฌ๋ฅผ ํ ๋ฒ์ ์งํ (๋ฐฐํฌ ํ๊ฒฝ ์๋ ์ ํ)
bash scripts/manual-deploy.sh YOUR_DOCKER_HUB_USERNAME
# ๋๋ ํน์ ํ๊ฒฝ์ ๋ฐฐํฌ
bash scripts/manual-deploy.sh YOUR_DOCKER_HUB_USERNAME blue์ด ์คํฌ๋ฆฝํธ๋ ๋ค์ ์์ ์ ์๋์ผ๋ก ์ํํฉ๋๋ค:
- Maven์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋น๋
- Docker ์ด๋ฏธ์ง ๋น๋
- Docker Hub์ ๋ก๊ทธ์ธ ๋ฐ ์ด๋ฏธ์ง ํธ์
- ๋์ ํ๊ฒฝ์ ๋ฐฐํฌ (ํ์ฌ ํ์ฑ ํ๊ฒฝ ์๋ ๊ฐ์ง ํ ๋ฐ๋ ํ๊ฒฝ์ผ๋ก ๋ฐฐํฌ)
# Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ ํธ์
bash scripts/docker-push.sh YOUR_DOCKER_HUB_USERNAME# ๋ธ๋ฃจ ํ๊ฒฝ์ ๋ฐฐํฌ
bash scripts/deploy.sh YOUR_DOCKER_HUB_USERNAME blue
# ๊ทธ๋ฆฐ ํ๊ฒฝ์ ๋ฐฐํฌ
bash scripts/deploy.sh YOUR_DOCKER_HUB_USERNAME greenํ๋ก์ ํธ์ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ต๋๋ค:
scripts/common.sh: ๋ชจ๋ ์คํฌ๋ฆฝํธ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ ํจ์ ๋ชจ์scripts/manual-deploy.sh: ๋น๋๋ถํฐ ๋ฐฐํฌ๊น์ง ๋ชจ๋ ๊ณผ์ ์ ์๋ํํ ํตํฉ ์คํฌ๋ฆฝํธscripts/docker-push.sh: Docker ์ด๋ฏธ์ง ๋น๋ ๋ฐ Docker Hub ํธ์ ์ ์ฉ ์คํฌ๋ฆฝํธscripts/deploy.sh: ๋ฐฐํฌ ์ ์ฉ ์คํฌ๋ฆฝํธ (ํน์ ํ๊ฒฝ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ)scripts/init-deploy.sh: ์ด๊ธฐ ๋ฐฐํฌ ํ๊ฒฝ ์ค์ ์คํฌ๋ฆฝํธscripts/make-executable.sh: ๋ชจ๋ ์คํฌ๋ฆฝํธ์ ์คํ ๊ถํ ๋ถ์ฌ ์คํฌ๋ฆฝํธ
๊ฐ ์คํฌ๋ฆฝํธ๋ ์๋ก ์์กด์ฑ์ด ์์ง๋ง, ํ์์ ๋ฐ๋ผ ๊ฐ๋ณ์ ์ผ๋ก ์คํํ ์ ์์ต๋๋ค.
grep -Po "server app-\K(blue|green)(?=:8080 weight=10;)" nginx/nginx.confdocker ps# Nginx ๋ก๊ทธ ํ์ธ
docker logs nginx
# ๋ธ๋ฃจ ํ๊ฒฝ ๋ก๊ทธ ํ์ธ
docker logs app-blue
# ๊ทธ๋ฆฐ ํ๊ฒฝ ๋ก๊ทธ ํ์ธ
docker logs app-green๋ฐฐํฌ๊ฐ ์คํจํ ๊ฒฝ์ฐ, ์ด์ ํ๊ฒฝ์ผ๋ก ๋กค๋ฐฑํ ์ ์์ต๋๋ค:
# ํ์ฌ ํ์ฑํ๋ ํ๊ฒฝ์ด ๋ธ๋ฃจ๋ผ๋ฉด, ๊ทธ๋ฆฐ ํ๊ฒฝ์ผ๋ก ๋กค๋ฐฑ
bash scripts/deploy.sh YOUR_DOCKER_HUB_USERNAME green
# ํ์ฌ ํ์ฑํ๋ ํ๊ฒฝ์ด ๊ทธ๋ฆฐ์ด๋ผ๋ฉด, ๋ธ๋ฃจ ํ๊ฒฝ์ผ๋ก ๋กค๋ฐฑ
bash scripts/deploy.sh YOUR_DOCKER_HUB_USERNAME blue- ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋๋ ๋ฒ๊ทธ ์์ ์ ์ํ ๋ธ๋์น ์์ฑ:
git checkout -b feature/๊ธฐ๋ฅ๋ช
# ๋๋
git checkout -b fix/๋ฒ๊ทธ๋ช
- ์์ ์๋ฃ ํ ๋ณ๊ฒฝ์ฌํญ ์ปค๋ฐ:
git add .
git commit -m "feat: ๊ธฐ๋ฅ ์ค๋ช
" # ๋๋ "fix: ๋ฒ๊ทธ ์์ ์ค๋ช
"- ์๊ฒฉ ์ ์ฅ์์ ํธ์:
git push origin feature/๊ธฐ๋ฅ๋ช
- GitHub์์ Pull Request ์์ฑ ํ ์ฝ๋ ๋ฆฌ๋ทฐ ์์ฒญ
# ์๋ณธ ๋ ํฌ์งํ ๋ฆฌ์ ์ต์ ๋ณ๊ฒฝ์ฌํญ ๊ฐ์ ธ์ค๊ธฐ
git fetch upstream
# ํ์ฌ ๋ธ๋์น์ ๋ณ๊ฒฝ์ฌํญ ์ ์ฉ
git merge upstream/main
# ๋๋ ํ ๋ฒ์ ๊ฐ์ ธ์์ ์ ์ฉ
git pull upstream main๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์์ Docker Hub ์์ด ์ง์ Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ Docker Hub๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋ก์ปฌ์์ ์ง์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ์คํํฉ๋๋ค.
ํ๋ก์ ํธ๋ ๋ก์ปฌ ๋ฐฐํฌ๋ฅผ ์ํ ๋ณ๋์ Docker Compose ํ์ผ(docker-compose-local.yml)์ ์ ๊ณตํฉ๋๋ค.
์ด ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค:
- ๋จ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค ์คํ (Blue/Green ๋ฐฐํฌ ๋์ )
- ๋ก์ปฌ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ
- ํฌํธ ์ง์ ๋ ธ์ถ (8080)
- ๋ก์ปฌ์ฉ Nginx ์ค์ ์ฌ์ฉ (
nginx-local.conf)
# ๋ฐฐ์น ์คํฌ๋ฆฝํธ ์คํ
deploy-local.bat# ์คํฌ๋ฆฝํธ ์คํ ๊ถํ ๋ถ์ฌ
chmod +x deploy-local.sh
# ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ์คํ
./deploy-local.sh- Maven์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋น๋:
# Windows
mvnw clean package -DskipTests
# Linux/Mac
./mvnw clean package -DskipTests- Docker Compose๋ก ์คํ:
docker-compose -f docker-compose-local.yml down
docker-compose -f docker-compose-local.yml up -d --build- ์ ํ๋ฆฌ์ผ์ด์
์ ์:
- Nginx๋ฅผ ํตํ ์ ์: http://localhost
- ์ง์ ์ ์: http://localhost:8080
- ์ปจํ ์ด๋ ์ํ ํ์ธ:
docker ps- ๋ก๊ทธ ํ์ธ:
# Nginx ๋ก๊ทธ
docker logs nginx-local
# ์ ํ๋ฆฌ์ผ์ด์
๋ก๊ทธ
docker logs app-local
# MySQL ๋ก๊ทธ
docker logs mysql-local- ์ปจํ ์ด๋ ์ค์ง:
docker-compose -f docker-compose-local.yml down- ๋ณผ๋ฅจ์ ํฌํจํ ์ ์ฒด ํ๊ฒฝ ์ ๊ฑฐ:
docker-compose -f docker-compose-local.yml down -v- ๋ก์ปฌ ๋ฐฐํฌ๋
nginx-local.confํ์ผ์ ์ฌ์ฉํฉ๋๋ค. ์ด ํ์ผ์ ๋จ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. nginx.confํ์ผ์ ๋ธ๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ๋ฅผ ์ํ ์ค์ ์ด๋ฏ๋ก ๋ก์ปฌ ๋ฐฐํฌ์๋ ์ฌ์ฉํ์ง ์์ต๋๋ค.- ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ๋ก๊ทธ๋ฅผ ํ์ธํ์ฌ ๋ฌธ์ ๋ฅผ ์ง๋จํ์ธ์.
CI/CD ํ์ดํ๋ผ์ธ์ ์ํด ๋ค์ ์ํฌ๋ฆฟ์ ์ค์ ํด์ผ ํฉ๋๋ค:
DOCKER_HUB_USERNAME: Docker Hub ์ฌ์ฉ์๋ชDOCKER_HUB_TOKEN: Docker Hub ์ก์ธ์ค ํ ํฐSERVER_HOST: ๋ฐฐํฌ ์๋ฒ ํธ์คํธ (EC2 ํผ๋ธ๋ฆญ IP)SERVER_USERNAME: ๋ฐฐํฌ ์๋ฒ ์ฌ์ฉ์๋ช (์: ubuntu)SERVER_SSH_KEY: ๋ฐฐํฌ ์๋ฒ SSH ๊ฐ์ธํคSERVER_PORT: SSH ํฌํธ (๋ณดํต 22)
์์ธํ ๋ฌด์ค๋จ ๋ฐฐํฌ ๊ตฌ์ฑ ๋ฐฉ๋ฒ์ BLUEGREEN-DEPLOY.md ๋ฌธ์๋ฅผ ์ฐธ์กฐํ์ธ์.