오늘은 개발 환경 설정과 요구사항 명세서 작성이 주된 목표이다.
사진처럼 필요한 의존성을 넣어주었다.
깃허브 레포 주소와 로컬 개발 폴더를 연동 시켜두었다.
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. 동행복권 잔액 부족 여부 알림
따라서 이러한 기능들을 제공하기 위해 아래와 같이 요구사항 명세서를 정의하였다.