Skip to content

Merge pull request #165 from Central-MakeUs/release #61

Merge pull request #165 from Central-MakeUs/release

Merge pull request #165 from Central-MakeUs/release #61

Workflow file for this run

name: Deploy To EC2 (Blue-Green Public)
on:
push:
branches: [ "main", "release" ]
permissions:
contents: read
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 17
- name: Create application.yml
run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml
- name: Build Spring Boot
run: |
chmod +x ./gradlew
./gradlew clean build -x test
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-region: ap-northeast-2
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: Login to ECR
run: |
aws ecr get-login-password --region ap-northeast-2 \
| docker login --username AWS --password-stdin 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com
- name: Build & Push Docker Image
run: |
docker build -t forday .
docker tag forday:latest 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
docker push 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Configure SSH
run: |
mkdir -p ~/.ssh
echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
cat <<EOF >> ~/.ssh/config
Host ec2-server
HostName ${{ secrets.EC2_PUBLIC_IP }}
User ubuntu
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
EOF
- name: Blue-Green Deploy via SSH
run: |
ssh ec2-server << 'EOF'
set -e
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com
echo "โ–ถ Nginx ํ™˜๊ฒฝ ์„ค์ • ํ™•์ธ"
# ํŒŒ์ผ์ด ์—†์œผ๋ฉด ์ƒ์„ฑ
if [ ! -f /etc/nginx/conf.d/service-env.inc ]; then
echo "set \$service_url blue;" | sudo tee /etc/nginx/conf.d/service-env.inc
fi
CURRENT_VAL=$(grep -oP '(?<=set \$service_url ).*(?=;)' /etc/nginx/conf.d/service-env.inc || echo "blue")
if [ "$CURRENT_VAL" = "blue" ]; then
TARGET="green"
TARGET_PORT=8081
OLD_TARGET="blue"
else
TARGET="blue"
TARGET_PORT=8080
OLD_TARGET="green"
fi
echo "โ–ถ ๋ฐฐํฌ ๋Œ€์ƒ: $TARGET (ํฌํŠธ: $TARGET_PORT)"
docker pull 839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
docker stop $TARGET || true
docker rm $TARGET || true
docker run -d \
--name $TARGET \
--restart=always \
-e SPRING_PROFILES_ACTIVE=$TARGET \
-p $TARGET_PORT:8080 \
-e SPRING_DATA_REDIS_HOST=172.17.0.1 \
-e SPRING_DATA_REDIS_PORT=6379 \
839983937363.dkr.ecr.ap-northeast-2.amazonaws.com/forday:latest
echo "โ–ถ ํ—ฌ์Šค ์ฒดํฌ ์‹œ์ž‘"
for i in {1..20}; do
# Spring Boot ๊ธฐ๋ณธ ํ—ฌ์Šค์ฒดํฌ ๊ฒฝ๋กœ(/actuator/health) ๋˜๋Š” ์ง€์ •ํ•˜์‹  ๊ฒฝ๋กœ ํ™•์ธ ํ•„์š”
if curl -sf http://localhost:$TARGET_PORT/health_check; then
HEALTH_OK=true
break
fi
echo "๋Œ€๊ธฐ ์ค‘... ($i/20)"
sleep 5
done
if [ "$HEALTH_OK" != "true" ]; then
echo "โŒ ํ—ฌ์Šค ์ฒดํฌ ์‹คํŒจ"
docker logs $TARGET
exit 1
fi
echo "โ–ถ Nginx ์Šค์œ„์นญ"
echo "set \$service_url $TARGET;" | sudo tee /etc/nginx/conf.d/service-env.inc
sudo nginx -t && sudo nginx -s reload
echo "โ–ถ ์ด์ „ ์ปจํ…Œ์ด๋„ˆ ์ •๋ฆฌ ๋ฐ ๋ฏธ์‚ฌ์šฉ ์ด๋ฏธ์ง€ ์‚ญ์ œ"
docker stop $OLD_TARGET || true
docker rm $OLD_TARGET || true
docker image prune -af
EOF