feat: 댓글과 사용자를 분리 (#460) #116
This file contains 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: Development CD | |
on: | |
workflow_dispatch: | |
push: | |
branches: [ "backend" ] | |
permissions: | |
contents: read | |
jobs: | |
deploy: | |
runs-on: development | |
steps: | |
- uses: actions/checkout@v3 | |
- name: 빌드 | |
working-directory: ./backend | |
run: | | |
chmod +x ./gradlew | |
./gradlew bootjar | |
- name: 빈 포트 찾기 | |
id: port | |
shell: bash {0} | |
run: | | |
if [ -z "$(lsof -i:8080)" ]; then | |
echo "green=8080">>$GITHUB_OUTPUT | |
echo "server1=8081">>$GITHUB_OUTPUT | |
echo "server2=8082">>$GITHUB_OUTPUT | |
elif [ -z "$(lsof -i:8081)" ]; then | |
echo "green=8081">>$GITHUB_OUTPUT | |
echo "server1=8080">>$GITHUB_OUTPUT | |
echo "server2=8082">>$GITHUB_OUTPUT | |
elif [ -z "$(lsof -i:8082)" ]; then | |
echo "green=8082">>$GITHUB_OUTPUT | |
echo "server1=8080">>$GITHUB_OUTPUT | |
echo "server2=8081">>$GITHUB_OUTPUT | |
fi; | |
- name: JAR 파일 복사 | |
working-directory: ./backend | |
shell: bash {0} | |
run: | | |
mkdir -p /home/ubuntu/backend | |
cp -f build/libs/DigginRoom-0.0.1-SNAPSHOT.jar /home/ubuntu/backend/ | |
- name: 빈 포트에 새 어플리케이션 실행 | |
working-directory: /home/ubuntu/backend | |
env: | |
RUNNER_TRACKING_ID: "" | |
GREEN: ${{ steps.port.outputs.green }} | |
run: | | |
nohup java -jar \ | |
-Dspring.profiles.active=develop \ | |
-Dserver.port=$GREEN \ | |
-Dserver.shutdown=graceful \ | |
-DDEV_DATASOURCE_URL=${{ secrets.DEV_DATASOURCE_URL }} \ | |
-DDEV_DATASOURCE_USERNAME=${{ secrets.DEV_DATASOURCE_USERNAME }} \ | |
-DDEV_DATASOURCE_PASSWORD=${{ secrets.DEV_DATASOURCE_PASSWORD }} \ | |
-DCLIENT_ID=${{ secrets.CLIENT_ID }} \ | |
-DCLIENT_SECRET=${{ secrets.CLIENT_SECRET }} \ | |
-DREDIRECT_URI=${{ secrets.REDIRECT_URI }} \ | |
DigginRoom-0.0.1-SNAPSHOT.jar & | |
- name: 어플리이션이 접속 가능한 상태가 되도록 기다린다 | |
shell: bash {0} | |
env: | |
GREEN: ${{ steps.port.outputs.green }} | |
run: | | |
while [ "$(curl -o /dev/null -s -w %{http_code} localhost:$GREEN/join/exist?username=admin1234)" != 200 ] | |
do | |
echo "새로운 어플리케이션을 띄우는 중입니다."; | |
done | |
- name: 기존 버전의 어플리케이션을 확인한다. | |
id: version | |
shell: bash {0} | |
env: | |
GREEN: ${{ steps.port.outputs.green }} | |
SERVER1_PORT: ${{ steps.port.outputs.server1 }} | |
SERVER2_PORT: ${{ steps.port.outputs.server2 }} | |
run: | | |
function getVersion { | |
version=$(curl -s -H "Content-Type: application/json; charset=utf-8" -X GET http://localhost:$1/manage/info | jq -r '.version') | |
if [ -z $version ]; then | |
version="1.0.0" | |
fi; | |
echo ${version} | |
} | |
SERVER1_VERSION=$(getVersion $SERVER1) | |
SERVER2_VERSION=$(getVersion $SERVER2) | |
NOW_SERVER_VERSION=$(getVersion $GREEN) | |
NOW_MAJOR_VERSION=$(echo $NOW_SERVER_VERSION | cut -d "." -f1) | |
NOW_MINOR_VERSION=$(echo $NOW_SERVER_VERSION | cut -d "." -f2) | |
SERVER1_MAJOR_VERSION=$(echo $SERVER1_VERSION | cut -d "." -f1) | |
SERVER1_MINOR_VERSION=$(echo $SERVER1_VERSION | cut -d "." -f2) | |
SERVER2_MAJOR_VERSION=$(echo $SERVER2_VERSION | cut -d "." -f1) | |
SERVER2_MINOR_VERSION=$(echo $SERVER2_VERSION | cut -d "." -f2) | |
GREEN_VERSION="$NOW_MAJOR_VERSION.$NOW_MINOR_VERSION" | |
if [ -z $SERVER1_MAJOR_VERSION ] && [ -z $SERVER2_MAJOR_VERSION ]; then | |
echo "서버가 한 대도 띄워져있지 않습니다. 서버 1에 배포" | |
BLUE_PORT=$SERVER1_PORT | |
RETAIN_PORT=$GREEN | |
RETAIN_VERSION="$SERVER2_MAJOR_VERSION.$SERVER2_MINOR_VERSION" | |
elif [ -z $SERVER1_MAJOR_VERSION ]; then | |
if [ $SERVER1_MAJOR_VERSION -eq $NOW_MAJOR_VERSION ] && [ $SERVER2_MINOR_VERSION -eq $NOW_MINOR_VERSION ]; then | |
echo "서버 2에 한 대만 띄워져있습니다. 기존 서버와의 MAJOR/MINOR 버전이 동일합니다. 서버 2에 블루그린 배포 - 1" | |
BLUE_PORT=$SERVER2_PORT | |
RETAIN_PORT=$GREEN | |
RETAIN_VERSION="$SERVER1_MAJOR_VERSION.$SERVER1_MINOR_VERSION" | |
else | |
echo "서버 2에 한 대만 띄워져있습니다. 기존 서버와의 MAJOR or MINOR 버전이 다릅니다. 서버 1에 배포 - 2" | |
BLUE_PORT=$SERVER1_PORT | |
RETAIN_PORT=$SERVER2_PORT | |
RETAIN_VERSION="$SERVER2_MAJOR_VERSION.$SERVER2_MINOR_VERSION" | |
fi; | |
elif [ -z $SERVER2_MAJOR_VERSION ]; then | |
if [ $SERVER1_MAJOR_VERSION -eq $NOW_MAJOR_VERSION ] && [ $SERVER1_MINOR_VERSION -eq $NOW_MINOR_VERSION ]; then | |
echo "서버 1에 한 대만 띄워져있습니다. 기존 서버와의 MAJOR/MINOR 버전이 동일합니다. 서버 1에 블루그린 배포 - 1" | |
BLUE_PORT=$SERVER1_PORT | |
RETAIN_PORT=$GREEN | |
RETAIN_VERSION="$SERVER2_MAJOR_VERSION.$SERVER2_MINOR_VERSION" | |
else | |
echo "서버 1에 한 대만 띄워져있습니다. 기존 서버와의 MAJOR or MINOR 버전이 다릅니다. 서버 2에 블루그린 배포 - 2" | |
BLUE_PORT=$SERVER2_PORT | |
RETAIN_PORT=$SERVER1_PORT | |
RETAIN_VERSION="$SERVER1_MAJOR_VERSION.$SERVER1_MINOR_VERSION" | |
fi; | |
elif [ $SERVER1_MAJOR_VERSION -eq $NOW_MAJOR_VERSION ] && [ $SERVER1_MINOR_VERSION -eq $NOW_MINOR_VERSION ]; then | |
echo "서버 1과의 MAJOR/MINOR 버전이 동일합니다. 서버 1에 블루그린 배포 - 1" | |
BLUE_PORT=$SERVER1_PORT | |
RETAIN_PORT=$GREEN | |
RETAIN_VERSION="$SERVER2_MAJOR_VERSION.$SERVER2_MINOR_VERSION" | |
elif [ $SERVER2_MAJOR_VERSION -eq $NOW_MAJOR_VERSION ] && [ $SERVER2_MINOR_VERSION -eq $NOW_MINOR_VERSION ]; then | |
echo "서버 2와의 MAJOR/MINOR 버전이 동일합니다. 서버 2에 블루그린 배포 - 2" | |
BLUE_PORT=$SERVER2_PORT | |
RETAIN_PORT=$GREEN | |
RETAIN_VERSION="$SERVER1_MAJOR_VERSION.$SERVER1_MINOR_VERSION" | |
elif [ $SERVER1_MAJOR_VERSION -eq $SERVER2_MAJOR_VERSION ] && [ $SERVER1_MINOR_VERSION -le $SERVER2_MINOR_VERSION ]; then | |
echo "새로운 서버의 MAJOR or MINOR버전이 업그레이드 되었습니다. 서버 1의 MINOR 버전이 서버 2보다 낮습니다. 서버 1에 블루그린 배포 - 3"; | |
echo "$SERVER1_VERSION 의 어플을 강제 업데이트하세요." | |
BLUE_PORT=$SERVER1_PORT | |
RETAIN_PORT=$SERVER2_PORT | |
RETAIN_VERSION="$SERVER2_MAJOR_VERSION.$SERVER2_MINOR_VERSION" | |
elif [ $SERVER1_MAJOR_VERSION -eq $SERVER2_MAJOR_VERSION ] && [ $SERVER1_MINOR_VERSION -gt $SERVER2_MINOR_VERSION ]; then | |
echo "새로운 서버의 MAJOR or MINOR버전이 업그레이드 되었습니다. 서버 2의 MINOR 버전이 서버 1보다 낮습니다. 서버 2에 블루그린 배포 - 4" | |
echo "$SERVER2_VERSION 의 어플을 강제 업데이트하세요." | |
BLUE_PORT=$SERVER2_PORT | |
RETAIN_PORT=$SERVER1_PORT | |
RETAIN_VERSION="$SERVER1_MAJOR_VERSION.$SERVER1_MINOR_VERSION" | |
elif [ $SERVER1_MAJOR_VERSION -lt $SERVER2_MAJOR_VERSION ]; then | |
echo "새로운 서버의 MAJOR or MINOR버전이 업그레이드 되었습니다. 서버 1의 MAJOR 버전이 서버 2보다 낮습니다. 서버 1에 블루그린 배포 - 5"; | |
BLUE_PORT=$SERVER1_PORT | |
RETAIN_PORT=$SERVER2_PORT | |
RETAIN_VERSION="$SERVER2_MAJOR_VERSION.$SERVER2_MINOR_VERSION" | |
elif [ $SERVER1_MAJOR_VERSION -gt $SERVER2_MAJOR_VERSION ]; then | |
echo "새로운 서버의 MAJOR or MINOR버전이 업그레이드 되었습니다. 서버 2의 MINOR 버전이 서버 1보다 낮습니다. 서버 2에 블루그린 배포 - 6" | |
BLUE_PORT=$SERVER2_PORT | |
RETAIN_PORT=$SERVER1_PORT | |
RETAIN_VERSION="$SERVER1_MAJOR_VERSION.$SERVER1_MINOR_VERSION" | |
else | |
echo "::error title=배포 실패::케이스를 구분할 수 없습니다. 서버 1: $SERVER1_VERSION 서버 2: $SERVER2_VERSION 새로운 서버: $NOW_VERSION"; | |
exit 1; | |
fi; | |
echo "blue=$BLUE_PORT">>$GITHUB_OUTPUT | |
echo "retain=$RETAIN_PORT">>$GITHUB_OUTPUT | |
echo "green_version=$GREEN_VERSION">>$GITHUB_OUTPUT | |
echo "retain_version=$RETAIN_VERSION">>$GITHUB_OUTPUT | |
- name: NGINX의 리버스 프록시 설정을 변경한다. | |
env: | |
GREEN: ${{ steps.port.outputs.green }} | |
RETAIN: ${{ steps.version.outputs.retain }} | |
GREEN_VERSION: ${{ steps.version.outputs.green_version }} | |
RETAIN_VERSION: ${{ steps.version.outputs.retain_version }} | |
shell: bash {0} | |
run: | | |
INC_CONTENTS="if (\$http_version = \"$RETAIN_VERSION\") { | |
proxy_pass http://localhost:$RETAIN; | |
} | |
if (\$http_version = \"$GREEN_VERSION\") { | |
proxy_pass http://localhost:$GREEN; | |
} | |
proxy_pass http://localhost:$RETAIN;" | |
echo $INC_CONTENTS | sudo tee /etc/nginx/conf.d/port.inc; | |
- name: NGINX reload 를 진행한다. | |
shell: bash {0} | |
run: | | |
sudo nginx -s reload; | |
- name: 기존 어플리케이션을 종료한다 | |
shell: bash {0} | |
env: | |
BLUE: ${{ steps.version.outputs.blue }} | |
run: | | |
PROCESS_ID="$(lsof -i:$BLUE -t)" | |
if [ -n "$PROCESS_ID" ]; then | |
sudo kill -15 $PROCESS_ID | |
echo "구동중인 애플리케이션을 종료했습니다. (pid : $PROCESS_ID, port : $BLUE)\n" | |
fi | |