Develop and Deploy Process

barely-works·2020년 4월 26일
0

telegram-bot

목록 보기
8/9

현재 개발에서 배포(?)까지 이루어지는 단계는 다음과 같다.

  1. Local 에서 개발 및 테스트

    • Python Script 가 다른 API 들을 호출하는 형식이라 local 에서도 prod 와 같은 환경으로 테스트가 가능하다. 다만 local 과 prod 를 분리하는 flag 가 존재하여 local 에서는 실제 유저에게 메시지가 가지 않도록 한다. default 는 local 이고 docker image 가 실행 될 때 prod 환경 변수를 넣어준다. (쓰다보니 local 에서 docker image 로 test 하면 prod 옵션이 들어가겠네.)
  2. 기능 구현이나 수정 및 테스트가 완료되면 Github 에 commit & version tag & push

    • Conventional commit 을 준수하려고 노력 중에 있고, goreleaser 와 같은 tool 을 사용하고 있지는 않다. 후에 프로젝트가 커지면 쓸 수 있게 미리 준수 중 (https://www.conventionalcommits.org/en/v1.0.0/#examples)

    • Tag 로 versioning 을 꼭한다. 후에 dockerize image 와 version tag 를 맞춘다

  3. Version 을 tag 로 docker image 를 생성 및 push 한다.

    • integration test 가 생기면 image 를 대상으로 띄워서 하도록 추가 예정

-- 여기까지가 backend engineer 로서의 역할. Git 에 Commit 과 Tag Versioning 이, Docker hub 에 Image 와 Tag Versioning 이 완료.

이상적으로는 Docker image 생성과 push 는 Github 에 연동된 Circle CI 와 같은 툴을 이용해 자동으로 되어야 한다. 해당 내용도 추가 예정. 해당 CI 에서 docker image build 및 push 이후, k8s 혹은 직접 업데이트 된 이미지를 내려받고 띄우는 작업까지 해야 함.

현재로서는 instance 가 한대이므로 ssh 로 접속해서 docker run 으로 실행 중. 위의 작업과 아래 작업을 분리해서 script 로 만들어서 실행 중이다.

#!/bin/sh

CYAN='\033[0;36m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color

NEW_TAG=$1
CC_TYPE=$2 # fix, feat, chore, test, docs, ...
COMMIT_MSG=$3

DOCKER_HUB="zechery/bitfront-price-alert"
NEW_IMAGE="$DOCKER_HUB:$NEW_TAG"

# commit
printf "${CYAN}Commit and push to Git ${CC_TYPE}: ${COMMIT_MSG} ${NC}\n"
git commit -am "$CC_TYPE: $COMMIT_MSG"
git push origin master

# tag
printf "${CYAN}Add and push a tag ${NEW_TAG}: ${COMMIT_MSG}${NC}\n"
git tag -a "$NEW_TAG" -m "$NEW_TAG: $COMMIT_MSG"
git push origin "$NEW_TAG"

# docker build & push
printf "${CYAN}Build new Docker image ${NEW_IMAGE}${NC}\n"
docker build -t "$NEW_IMAGE" .
printf "${CYAN}Push new Docker image ${NEW_IMAGE}${NC}\n"
docker push "$NEW_IMAGE"

printf "${GREEN}Completed successfully${NC}\n"

실행하면 아래와 같이 동작한다.

이후 instance 에 ssh 로 접속, deploy script 를 실행시키고 Git 에 올라온 최신 tag 와 Docker 에 올라온 이미지의 최신 tag 를 비교하여 같은 버젼인 경우 기존 컨테이너들을 중지 및 삭제 시킨 후 이미지를 실행시킨다.

#!/bin/sh

CYAN='\033[0;36m'
GREEN='\033[0;32m'
NC='\033[0m' # No Color

# validate if both git and docker have the same tag
LAST_TAG=$(./get_last_tag.sh) # execute and capture stdout
STATUS=$? # find out exit status
if [ $STATUS -eq 0 ]; then
  printf "${CYAN}Current Git and Docker tag: ${LAST_TAG}${NC}\n"
else
  printf "${LAST_TAG}"
  exit 1
fi

# start deploying
DOCKER_HUB="zechery/bitfront-price-alert"
NEW_IMAGE="$DOCKER_HUB:$LAST_TAG"
printf "${CYAN}Deploy ${NEW_IMAGE}${NC}\n"

# stop and remove current containers
printf "${CYAN}Stop all running containers:${NC}\n"
docker stop "$(docker ps -aq)"
printf "${CYAN}Remove all containers:${NC}\n"
docker rm "$(docker ps -aq)"

# pull and run the new image
printf "${CYAN}Run ${NEW_IMAGE}:${NC}\n"
docker run -d "$NEW_IMAGE"

# done deploying, display images and containers
#printf "${CYAN}Docker images:${NC}\n"
#docker images
printf "${CYAN}Docker containers:${NC}\n"
docker ps
printf "${GREEN}Deployed ${NEW_IMAGE}${NC}\n"

아마 이미지가 조금 크거나 무거웠다면 version check -> image download -> 기존 container 중단 및 삭제 -> 새로운 image 실행으로 순서를 바꿔서 download 하는 동안 service 중단 시간을 줄였을 텐데 일단 run 한번으로 끝내고 있음. 이것도 추후에 순서 변경 예정.

실행을 하면 아래와 같이 실행된다.

새로 배포 된 버젼 로그들로 ELK 에서 바로 확인 가능

API 서버 같은 서비스라면 NewRelics 를 달아서 ELK 와 함께 알림을 PagerDuty 에 연동해서 이상상황에서 on-call 에게 노티 및 필요시 escallation 까지 하면 더 아름답겠다. 언제 누구와 협업을 해도 되는 구조와 시스템으로, 계속 스케일링이 가능한 구조로 만들어 가는 것으로.

profile
another backend engineer

0개의 댓글