Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 무중단 배포로 변경 #311

Merged
merged 1 commit into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions appspec.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ permissions:
group: ubuntu

hooks:
ApplicationStart:
- location: scripts/deploy.sh
timeout: 60
AfterInstall: # 기존 실행되던 애플리케이션 종료
- location : scripts/execute-deploy.sh
timeout: 180
runas: ubuntu
file_exists_behavior: OVERWRITE
89 changes: 89 additions & 0 deletions scripts/deploy-blue-green.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
#!/bin/bash

# jasypt 암호키 설정
source /home/ubuntu/action/scripts/properties.sh

PROJECT_NAME=space-club-backend
REPOSITORY=/home/ubuntu
PACKAGE=$REPOSITORY/action/build/libs/
JAR_NAME=$(ls -tr $PACKAGE | grep 'SNAPSHOT.jar' | tail -n 1)
JAR_PATH=$PACKAGE$JAR_NAME
echo "> build 파일명: $JAR_NAME"

echo "> build 파일 복사"
DEPLOY_PATH=$REPOSITORY/jar/
cp $JAR_PATH $DEPLOY_PATH

echo "> 현재 구동중인 SET 확인"
CURRENT_PROFILE=$(curl -s http://localhost/api/profile)
echo "> $CURRENT_PROFILE"

# 쉬고 있는 set 찾기: set1이 사용중이면 set2가 쉬고 있고, 반대면 set1이 쉬고 있음
if [ $CURRENT_PROFILE == blue ]
then
IDLE_PROFILE=green
IDLE_PORT=8082
elif [ $CURRENT_PROFILE == green ]
then
IDLE_PROFILE=blue
IDLE_PORT=8081
else
echo "> 일치하는 Profile이 없습니다. Profile: $CURRENT_PROFILE"
echo "> BLUE를 할당합니다. IDLE_PROFILE: blue"
IDLE_PROFILE=blue
IDLE_PORT=8081
fi

echo "> application.jar 교체"
IDLE_APPLICATION=$IDLE_PROFILE-SpaceClub.jar
IDLE_APPLICATION_PATH=$DEPLOY_PATH$IDLE_APPLICATION

ln -Tfs $DEPLOY_PATH$JAR_NAME $IDLE_APPLICATION_PATH

echo "> $IDLE_PROFILE 에서 구동중인 애플리케이션 pid 확인"
IDLE_PID=$(pgrep -f $IDLE_APPLICATION)

if [ -z $IDLE_PID ]
then
echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다."
else
echo "> kill -15 $IDLE_PID"
kill -15 $IDLE_PID
sleep 5
fi

echo "> $IDLE_PROFILE 배포"
sudo nohup java -jar $JAR_PATH --spring.profiles.active=develop,$IDLE_PROFILE --jasypt.encryptor.password=${encrypt} > /home/ubuntu/log/nohup_log.out 2> /home/ubuntu/log/nohup_error.out &

echo "> $IDLE_PROFILE 10초 후 Health check 시작"
echo "> curl -s http://localhost:$IDLE_PORT/actuator/health "
sleep 10

for retry_count in {1..10}
do
response=$(curl -s http://localhost:$IDLE_PORT/actuator/health)
up_count=$(echo $response | grep 'UP' | wc -l)

if [ $up_count -ge 1 ]
then # $up_count >= 1 ("UP" 문자열이 있는지 검증)
echo "> Health check 성공"
break
else
echo "> Health check의 응답을 알 수 없거나 혹은 status가 UP이 아닙니다."
echo "> Health check: ${response}"
fi

if [ $retry_count -eq 10 ]
then
echo "> Health check 실패. "
echo "> Nginx에 연결하지 않고 배포를 종료합니다."
exit 1
fi

echo "> Health check 연결 실패. 재시도..."
sleep 10
done

echo "> 스위칭"
sleep 10
$REPOSITORY/scripts/switch.sh
2 changes: 2 additions & 0 deletions scripts/deploy-execute.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/bin/bash
/home/ubuntu/action/scripts/deploy.sh > /dev/null 2> /dev/null < /dev/null &
25 changes: 25 additions & 0 deletions src/main/java/com/spaceclub/global/profile/ProfileController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.spaceclub.global.profile;

import lombok.RequiredArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Arrays;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class ProfileController {

private final Environment env;

@GetMapping("/profile")
public String profile() {
return Arrays.stream(env.getActiveProfiles())
.findAny()
.orElseGet(() -> " ");
}

}
2 changes: 2 additions & 0 deletions src/main/resources/application-blue.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
server:
port: 8081
2 changes: 2 additions & 0 deletions src/main/resources/application-green.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
server:
port: 8082
Loading