Merge pull request #165 from Central-MakeUs/release #61
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |