1. Github Action에서 클라우드의 shellscript 실행하기
이전까지 jar파일을 클라우드 서버에 전송하는 것 까지 진행시켰다.
이제 서버에 전송 후 이전에 쓰던 것을 끄고 새로운 것을 켜주는 쉘스크립트를 작성해야한다. 다만 그 전에 쉘스크립트 파일을 실행하는 로직을 github action에 추가해주어야한다.
folder_path="/home/shellScript/newFolder"
mkdir $folder_path
쉘스크립트는 위와 같이 매우 간단하게 새로운 폴더를 하나 만드는 것으로 하였다.
# 쉘스크립트 파일 실행
- name: Execute shell script on remote server
env:
SSH_PASSWORD: ${{ secrets.SSHPASSWORD }}
run: |
sshpass -p "$SSH_PASSWORD" ssh -o StrictHostKeyChecking=no -p {{포트번호}} {{IP}} 'bash /home/shellScript/github_action_shell.sh'
쉘스크립트 경로도 자신에 맞게 설정하자.
새롭게 폴더가 생긴 것을 확인했다!
그러므로 이제 github action 의 파일을 수정할 일은 없다. 이제 blue green 배포방식을 실행하는 쉘 스크립트를 작성해야한다.
2. Blue-Green을 위한 shellscript 작성
로드밸런서로 Nginx를 사용한다. Nginx는 클라우드에 접속하는 모든 요청을 먼저 Nginx가 받게 된다. 그리고 Nginx Config에 따라 어떤 포트로 연결시킬지 결정한다. 그래서 아래와 같은 그림이 가능해진다.
그래서 Nginx를 활용한 블루그린 배포가 가능하다. 8080포트를 가리키고 있다가 새로운 jar파일이 들어오면 8081 포트로 nginx 설정을 변경해주면 된다. 이것을 위한 쉘스크립트 작성이 필요하다.
#!/bin/bash
# JAR 파일 경로
JAR_PATH="당신의경로.jar"
# 현재 사용 중인 포트 확인
PORT_8080_IN_USE=$(lsof -i :8080 -t)
PORT_8081_IN_USE=$(lsof -i :8081 -t)
# 현재 환경이 블루 환경인지 그린 환경인지 확인
if [ -n "$PORT_8080_IN_USE" ]; then
# 8080 포트가 사용 중이면, 8080 환경은 블루 환경이므로 8081에 그린 환경 배포
echo "Port 8080 is in use. Deploying to port 8081 (Green environment)."
# 새로운 버전 배포 (그린 환경)
nohup java -jar -Dspring.profiles.active=green -jar $JAR_PATH > /dev/null 2>&1 &
# Nginx를 그린 환경(8081)으로 연결
sed -i 's/8080/8081/g' /etc/nginx/sites-available/default
systemctl reload nginx
# 블루 환경 종료 (8080 포트 종료)
echo "Stopping Blue environment on port 8080."
kill -9 $PORT_8080_IN_USE
elif [ -n "$PORT_8081_IN_USE" ]; then
# 8081 포트가 사용 중이면, 8081 환경은 그린 환경이므로 8080에 블루 환경 배포
echo "Port 8081 is in use. Deploying to port 8080 (Blue environment)."
# 새로운 버전 배포 (블루 환경)
nohup java -jar -Dspring.profiles.active=blue -jar $JAR_PATH > /dev/null 2>&1 &
# Nginx를 블루 환경(8080)으로 연결
sed -i 's/8081/8080/g' /etc/nginx/sites-available/default
systemctl reload nginx
# 그린 환경 종료 (8081 포트 종료)
echo "Stopping Green environment on port 8081."
kill -9 $PORT_8081_IN_USE
else
# 포트가 비어 있으면 8080에서 시작
echo "No ports in use. Starting application on port 8080."
nohup java -jar -Dspring.profiles.active=blue -jar $JAR_PATH > /dev/null 2>&1 &
sed -i 's/8081/8080/g' /etc/nginx/sites-available/default
systemctl reload nginx
fi
echo "Deployment completed."
blue-green 배포는 사실상 순환관계다. 지금은 그린이지만 이후엔 블루가 된다. 그래서 8080이 블루와 그린을 순환하고 8081도 마찬가지다. 그래서 지금 사용되고 있는 포트가 결국은 블루이다.
자, 이제 이것을 github action에서 배포 후 실행되도록 하고 main branch에 푸쉬해보자
@RestController
public class PageController {
private final Environment environment;
public PageController(Environment environment) {
this.environment = environment;
}
@GetMapping("/index")
public String index(){
String port = environment.getProperty("local.server.port");
return "Currently running on port: " + port;
}
}
사용중인 포트번호를 확인하기 위한 간단한 컨트롤러 추가
클라우드에 잘 입력된 것을 확인! 그렇다면 이제 위 문구를 조금 바꿔서 다시 푸쉬해보자
public String index(){
String port = environment.getProperty("local.server.port");
return "Second Push Currently running on port: " + port;
}
Second Push 를 추가하고서 푸쉬하면
포트번호가 잘 바뀐 것을 확인할 수 있다.
추가적으로 지금은 바로 포트를 종료하지만 조금 더 놔두면서 롤백을 대비하거나 바로 변경하지 않고 테스트를 하는 방법도 있다고 한다.
지금까지 아주 간단하게 Github action부터 배포까지 과정을 구현했는데 docker를 사용해 배포하는 방법도 있다. 보통 도커로 사용하던데 난 왜 도커까지 필요한건지 이해하지 못했다..
아무래도 작은 프로젝트여서 그럴 수 있겠다.
'Dev > Spring Boot' 카테고리의 다른 글
[SpringBoot] Github Action을 사용한 jar빌드 후 전송 (0) | 2024.12.11 |
---|---|
[Spring Security] 수동 로그인 구현하기 (0) | 2024.10.29 |
[Spring Security] 스프링시큐리티의 기본 로그인을 사용하지 못했던 문제 (0) | 2024.10.27 |
[JPA] 인덱싱을 통한 SELECT 성능 향상 (0) | 2024.10.22 |
Java로 문자열 xml 파일 파싱 (0) | 2024.09.20 |