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

사진처럼 필요한 의존성을 넣어주었다.
깃허브 레포 주소와 로컬 개발 폴더를 연동 시켜두었다.
GitHub Actions를 이용하여 구축하였다.

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
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
#!/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. 동행복권 잔액 부족 여부 알림
따라서 이러한 기능들을 제공하기 위해 아래와 같이 요구사항 명세서를 정의하였다.
