Skip to content

Merge pull request #113 from Leets-Official/refactor#112 #182

Merge pull request #113 from Leets-Official/refactor#112

Merge pull request #113 from Leets-Official/refactor#112 #182

Workflow file for this run

name: Weeth-BE DEV CI/CD
on:
push:
branches: [ "develop" ]
pull_request:
branches: [ "develop" ]
types: [opened, synchronize, reopened]
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
# gradle caching
- name: Gradle Caching
uses: actions/cache@v3
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*gradle*','**/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-
# gradle ๋นŒ๋“œ
- name: Build with Gradle Wrapper
run: ./gradlew build
# ๋นŒ๋“œ๋œ JAR ํŒŒ์ผ ํ™•์ธ
- name: List JAR files
run: ls build/libs
# Docker build & push
- name: Docker build & push
run: |
docker login -u ${{ secrets.DEV_DOCKER_USER_EMAIL }} -p ${{ secrets.DEV_DOCKER_USER_TOKEN }}
docker build -f Dockerfile-dev -t ${{ secrets.DEV_DOCKER_USER_NAME }}/weeth .
docker push ${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
deploy:
runs-on: ubuntu-latest
needs: build
if: github.event_name == 'push'
steps:
- uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.DEV_EC2_SECRET_HOST }}
username: ubuntu
key: ${{ secrets.DEV_EC2_SECRET_PEM }}
envs: GITHUB_SHA
script: |
# Blue-Green Deployment ํฌํŠธ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ์„ค์ •
BLUE_PORT=8080
GREEN_PORT=8081
BLUE_NAME="blue"
GREEN_NAME="green"
# ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ
IS_BLUE_ON=$(sudo docker ps --filter "name=$BLUE_NAME" --filter "status=running" -q)
IS_GREEN_ON=$(sudo docker ps --filter "name=$GREEN_NAME" --filter "status=running" -q)
# ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋”ฐ๋ผ blue/green ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
if [ -n "$IS_BLUE_ON" ]; then
echo "** ${GREEN_PORT} ํฌํŠธ์—์„œ GREEN ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ค€๋น„"
# Docker ์ด๋ฏธ์ง€ pull
sudo docker pull ${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
sudo docker run --name $GREEN_NAME -d -p $GREEN_PORT:$GREEN_PORT \
--env-file ./weeth-dev.env -e TZ=Asia/Seoul -e SERVER_PORT=$GREEN_PORT \
${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
BEFORE_NAME=$BLUE_NAME
AFTER_NAME=$GREEN_NAME
BEFORE_PORT=$BLUE_PORT
AFTER_PORT=$GREEN_PORT
elif [ -n "$IS_GREEN_ON" ]; then
echo "** ${BLUE_PORT} ํฌํŠธ์—์„œ BLUE ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ค€๋น„"
# Docker ์ด๋ฏธ์ง€ pull
sudo docker pull ${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
sudo docker run --name $BLUE_NAME -d -p $BLUE_PORT:$BLUE_PORT \
--env-file ./weeth-dev.env -e TZ=Asia/Seoul -e SERVER_PORT=$BLUE_PORT \
${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
BEFORE_NAME=$GREEN_NAME
AFTER_NAME=$BLUE_NAME
BEFORE_PORT=$GREEN_PORT
AFTER_PORT=$BLUE_PORT
else
echo "** ์ดˆ๊ธฐ ์ƒํƒœ: BLUE ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ค€๋น„"
# Docker ์ด๋ฏธ์ง€ pull
sudo docker pull ${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
sudo docker run --name $BLUE_NAME -d -p $BLUE_PORT:$BLUE_PORT \
--env-file ./weeth-dev.env -e TZ=Asia/Seoul -e SERVER_PORT=$BLUE_PORT \
${{ secrets.DEV_DOCKER_USER_NAME }}/weeth
BEFORE_NAME=$GREEN_NAME
AFTER_NAME=$BLUE_NAME
BEFORE_PORT=$GREEN_PORT
AFTER_PORT=$BLUE_PORT
fi
# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ํ›„ ๋Œ€๊ธฐ
echo "** ์ปจํ…Œ์ด๋„ˆ ์ดˆ๊ธฐํ™” ์ค‘... 30์ดˆ ๋Œ€๊ธฐ"
sleep 30
# Health-Check ์ˆ˜ํ–‰
for i in {1..5}; do
RESPONSE=$(curl -i -s "http://localhost:${AFTER_PORT}/health-check" | grep "HTTP/1.1 200" || echo "fail")
echo "** Health-Check ์‘๋‹ต: $RESPONSE"
if [[ "$RESPONSE" == *"HTTP/1.1 200"* ]]; then
echo "** Health-Check ์„ฑ๊ณต: ์„œ๋ฒ„๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค."
HEALTHY=true
break
else
echo "** Health-Check ์‹คํŒจ, ์žฌ์‹œ๋„ ์ค‘... (${i}/5)"
HEALTHY=false
sleep 5
fi
done
# ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ • ์—…๋ฐ์ดํŠธ
REVERSE_PROXY_CONFIG=$(cat <<EOF
{
admin 0.0.0.0:2020
}
3.38.193.157.nip.io {
reverse_proxy localhost:${AFTER_PORT}
}
EOF
)
# Health-Check ๊ฒฐ๊ณผ ํ™•์ธ
if [ "$HEALTHY" = true ]; then
echo "** Health-Check ์„ฑ๊ณต: ${AFTER_NAME} ์ปจํ…Œ์ด๋„ˆ ์ •์ƒ ์ž‘๋™"
# ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ • ์—…๋ฐ์ดํŠธ
echo "$REVERSE_PROXY_CONFIG" | sudo tee /etc/caddy/Caddyfile
# Caddy ์žฌ์‹œ์ž‘
echo "** Caddy ์„œ๋น„์Šค ์žฌ์‹œ์ž‘"
sudo systemctl reload caddy
# ์ด์ „ ์ปจํ…Œ์ด๋„ˆ ์ค‘์ง€ ๋ฐ ์‚ญ์ œ
echo "** ์ด์ „ ์ปจํ…Œ์ด๋„ˆ(${BEFORE_NAME}) ์ข…๋ฃŒ ๋ฐ ์‚ญ์ œ"
sudo docker stop $BEFORE_NAME || true
sudo docker rm $BEFORE_NAME || true
else
echo "** Health-Check ์‹คํŒจ: ${AFTER_NAME} ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ"
sudo docker stop $AFTER_NAME || true
sudo docker rm $AFTER_NAME || true
echo "** ์ด์ „ ์ปจํ…Œ์ด๋„ˆ(${BEFORE_NAME})๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค"
fi
# ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด๋ฏธ์ง€ ์ •๋ฆฌ
echo "** ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” Docker ์ด๋ฏธ์ง€ ์ •๋ฆฌ"
sudo docker image prune -a -f