LOTTO-PILOT 프로젝트 1일차

이정빈·2024년 7월 14일
1
post-thumbnail

오늘은 개발 환경 설정과 요구사항 명세서 작성이 주된 목표이다.

개발 환경 설정

Spring Boot


사진처럼 필요한 의존성을 넣어주었다.

GitHub

1. 깃허브 레포 생성 및 연동

깃허브 레포 주소와 로컬 개발 폴더를 연동 시켜두었다.

2. 자동 CI / CD 구축

GitHub Actions를 이용하여 구축하였다.

CI.yml

name: CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:
    runs-on: ubuntu-22.04
    env:
      working-directory: lotto-pilot

    steps:
      - name: 체크아웃
        uses: actions/checkout@v3

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: application.yml 생성
        run: |
          mkdir ./src/main/resources # resources 폴더 생성
          cd src/main/resources 
          echo "${{ secrets.APPLICATION }}" > ./application.yml

      - name: 빌드
        run: |
          chmod +x gradlew
          ./gradlew build -x test
        shell: bash

CD.yml

name: CD

on:
  push:
    branches: [ "main" ]

jobs:
  deploy-ci:
    runs-on: ubuntu-22.04
    env:
      working-directory: lotto-pilot

    steps: 
    - uses: actions/checkout@v3

    - name: Set up JDK 21
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '21'

    - name: application.yaml 생성
      run: | 
          mkdir ./src/main/resources # resources 폴더 생성
          cd src/main/resources
          echo "${{ secrets.APPLICATION }}" > ./application.yml

    - name: 빌드
      run: |
          chmod +x gradlew
          ./gradlew build -x test
      shell: bash

######## 여기까지는 CI.yaml와 동일 #########

    - name: docker build 가능하도록 환경 설정
      uses: docker/setup-buildx-action@v2.9.1
      
    - name: docker hub에로그인
      uses: docker/login-action@v2.2.0
      with:
        username: ${{ secrets.DOCKERHUB_LOGIN_USERNAME }}
        password: ${{ secrets.DOCKERHUB_LOGIN_ACCESSTOKEN }}

    - name: docker image 빌드 및 푸시
      run: |
        docker build --platform linux/amd64 -t alenjb/lotto-pilot .
        docker push alenjb/lotto-pilot

  deploy-cd:
    needs: deploy-ci
    runs-on: ubuntu-22.04
    steps:
    - name: 도커 컨테이너 제거
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.RELEASE_HOST }}
        username: ${{ secrets.RELEASE_USERNAME }}
        key: ${{ secrets.RELEASE_KEY }}
        script: |
            docker rm -f lotto-pilot-8080 || true
    
    - name: 도커 컨테이너 실행
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.RELEASE_HOST }}
        username: ${{ secrets.RELEASE_USERNAME }}
        key: ${{ secrets.RELEASE_KEY }}
        script: |
            cd ~
            ./deploy.sh

deploy.sh

#!/bin/bash

nginx_config_path="/etc/nginx"
all_port=("8080" "8081")
available_port=()
server_name=lotto-pilot

docker_ps_output=$(docker ps | grep $server_name)
running_container_name=$(echo "$docker_ps_output" | awk '{print $NF}')
blue_port=$(echo "$running_container_name" | awk -F'-' '{print $NF}')
web_health_check_url=/actuator/health

if [ -z "$blue_port" ]; then
    echo "> 실행 중인 서버의 포트: 없음"
else
    echo "> 실행 중인 서버의 포트: $blue_port"
fi

# 실행 가능한 포트 확인 ( all_port 중 blue_port를 제외한 port )
for item in "${all_port[@]}"; do
    if [ "$item" != "$blue_port" ]; then
        available_port+=("$item")
    fi
done

# 실행 가능한 포트 없으면 끝내기
if [ ${#available_port[@]} -eq 0 ]; then
    echo "> 실행 가능한 포트가 없습니다."
    exit 1
fi

green_port=${available_port[0]}

echo "----------------------------------------------------------------------"
# docker image pull
echo "> 도커 이미지 pull 받기"
docker pull alenjb/${server_name}

# green_port로 서버 실행
echo "> ${green_port} 포트로 서버 실행"
echo "> docker run -d --name ${server_name}-${green_port} -p ${green_port}:8080 -e TZ=Asia/Seoul alenjb/${server_name}"
docker run -d --name ${server_name}-${green_port} -p ${green_port}:8080 -e TZ=Asia/Seoul alenjb/${server_name}
echo "----------------------------------------------------------------------"

# green_port 서버 제대로 실행 중인지 확인
sleep 10
for retry_count in {1..10}
do
    echo "> 서버 상태 체크"
    echo "> curl -s http://localhost:${green_port}${web_health_check_url}"
		# http://localhost:{그린포트}{health check 주소} -> nginx
    response=$(curl -s http://localhost:${green_port}${web_health_check_url})
    up_count=$(echo $response | grep 'UP' | wc -l)

    if [ $up_count -ge 1 ]
    then
        echo "> 서버 실행 성공"
        break
    else
        echo "> 아직 서버 실행 안됨"
        echo "> 응답 결과: ${response}"
    fi
    if [ $retry_count -eq 10 ]
		then
        echo "> 서버 실행 실패"
        docker rm -f ${server_name}-${green_port}

        exit 1
    fi
    sleep 2
done
echo "----------------------------------------------------------------------"

# nginx switching
echo "> nginx 포트 스위칭"
echo "set \$service_url http://127.0.0.1:${green_port};" | sudo tee ${nginx_config_path}/conf.d/service-url.inc
sudo nginx -s reload

sleep 1

echo "----------------------------------------------------------------------"
# nginx를 통해서 서버 접근 가능한지 확인
response=$(curl -s http://localhost${web_health_check_url})
up_count=$(echo $response | grep 'UP' | wc -l)
if [ $up_count -ge 1 ]
then
    echo "> 서버 변경 성공"
else
    echo "> 서버 변경 실패"
    echo "> 서버 응답 결과: ${response}"
    exit 1
fi

# blue_port 서버 있다면 중단
if [ -n "$blue_port" ]; then
    echo "> 기존 ${blue_port}포트 서버 중단"
    echo "> docker rm -f ${server_name}-${blue_port}"
    sudo docker rm -f ${server_name}-${blue_port}
fi

요구사항 명세서

이 프로그램의 핵심 기능은 크게 4가지다.

1. 정해진 알고리즘에 따라 로또 번호 추출

2. 추출된 번호를 통해 자동 로또 구매

3. 로또 번호 당첨 내역 조회

4. 동행복권 잔액 부족 여부 알림

따라서 이러한 기능들을 제공하기 위해 아래와 같이 요구사항 명세서를 정의하였다.

profile
사용자의 입장에서 생각하며 문제를 해결하는 백엔드 개발자입니다✍

0개의 댓글