Spring Boot 프로젝트 CI / CD 구축하기 (항해일지 54일차)

김형준·2022년 7월 1일
6

TIL&WIL

목록 보기
41/45

Intro


  • CI / CD를 구축하며 느낀점
    • Continuous Integration, Continuous Deployment는 빌드, 배포를 자동화하여 개발자가 개발에만 집중할 수 있도록 도와준다. ( 즉, 개발 업무의 효율성이 증가한다.)
    • CI / CD 파이프 라인을 구축할 수 있는 툴 중에 Jenkins와 GitHub Actions가 가장 많이 쓰이는 것 같았는데, 둘의 장단점을 비교하며 우리의 프로젝트에 맞는 (소규모) github actions를 선택했다.
    • Docker는 대규모 프로젝트에서 서버가 많아질 경우 서버 마다의 환경을 동일하게 셋팅하기 편하게 해준 혁신적인 툴이다. (이미지, 컨테이너)
    • 현재 자동 배포까지는 마쳤지만, 추후 시간 여유가 생긴다면 NginX를 통한 무중단 배포도 시도해보면 좋을 것 같다!

CI / CD 구축 과정 및 코드


1) 구축 스펙

  • AWS EC2 ( Amazon Linux 2 AMI)
  • GitHub Actions
  • Docker

2) 구축 시나리오

  1. gradle build (스프링 프로젝트 jar file 빌드)

  2. Docker build (Docker Hub에 이미지 push)

  3. Deploy (리눅스 서버에서 Docker Hub에 올린 이미지 pull 받고 run)


3) 구축 코드

name: Java CI with Gradle

on:
  push:
    branches: [ "master" ]
#  pull_request:
#    branches: [ "master" ]

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: Set up JDK 8
      uses: actions/setup-java@v3
      with:
        java-version: '8'
        distribution: 'temurin'
        
      ## 1) git ignore에 등록된 application.properties 파일 생성해주기
    - name: make application.properties
      run: |
        cd ./src/main/resources
        touch ./application.properties
        echo "${{ secrets.PROPERTIES }}" > ./application.properties
      shell: bash
      
      ## 2) 스프링 프로젝트 jar 파일 빌드
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew build
      
      ## 3) Docker Hub에 이미지 push 하기
    - name: Docker build
      run: |
        docker login -u ${{ secrets.USERNAME }} -p ${{ secrets.PASSWORD }}
        docker build -t mung-friend .
        docker tag mung-friend souliat/mung-friend:${GITHUB_SHA::7}
        docker push souliat/mung-friend:${GITHUB_SHA::7}
        
      ## 4) Docker Hub에 Push한 이미지를 리눅스 서버에 받아와서 run
    - name: Deploy
      uses: appleboy/ssh-action@master
      with:
        host: ec2-3-39-6-175.ap-northeast-2.compute.amazonaws.com
        username: ec2-user
        key: ${{ secrets.PRIVATE_KEY }}
        envs: GITHUB_SHA
        script: |
          docker pull souliat/mung-friend:${GITHUB_SHA::7}
          docker tag souliat/mung-friend:${GITHUB_SHA::7} mung-friend
          docker stop server
          docker run -d --rm --name server -p 80:8080 mung-friend
  • 위 시나리오에 해당하는 코드들에 주석을 적었다.
  • docker 명령어는 처음 접해봐서 처음에 이해하고 사용하는데 애를 먹었던 것 같다.
  • 리눅스 서버 또한 처음 다뤄봐서 (그동안 우분투를 주로 사용) 명령어가 익숙치 않았고 특히 RSA 공개키를 저장하는 등의 작업에서 시간을 많이 소비했다. (레퍼런스가 없어...)
  • 따라서 구현하며 정리해뒀던 명령어 혹은 팁들을 아래에 정리했다.

4) 구축 과정에서 정리한 것

  • 스프링 프로젝트에서 git bash 시작하고 docker hub에 이미지 업로드 할 때 로그인 먼저 해야함

    • 로그인 시 TTY 오류가 뜬다
    • as-is : docker login
    • to-be: winpty docker login
      -> "winpty" enables TTY on Window. Useful for GitBash, Putty and MobaXTerm!
  • github actions 에서 gradle.yml 파일 작성 시
    주의할 점: docker build run에서 (스크립트 명령어) 여러줄 입력할 때 | 입력해줘야함....

# ec2 리눅스 서버에서 도커 환경설정
sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user

# 도커 이미지 가져오기 
sudo docker pull [계정명]/spring-cicd
# 혹은
sudo docker pull [계정명]/spring-cicd:[최신버젼]

# 도커 이미지 삭제하기 (전체 삭제)
docker system prune -a

# 도커 실행하기
docker run -d -p 80:8080 [계정명]/spring-cicd:[버젼]

# 도커 로그 확인
docker logs [컨테이너id]
  • 중간에 Docker run 명령어를 통해 컨테이너를 만들면, 생성되었다가 자꾸 사라지는 이상한 현상이 나타났는데, 다행히 도커 로그를 확인해보며 문제점을 파악했고 고칠 수 있었다. 소중한 로그..

  • 리눅스 서버에 공개키 저장하여 접근하기

# 1. 프로젝트 디렉에 RSA 키 만들어주고  (꼭 프로젝트 디렉 아니어도됨.)
ssh-keygen -t rsa -b 4096 -C "[내메일]" -f spring-cicd

# 2. 인스턴스(리눅스서버)에 공개키 등록
공개키를 등록할 때는 아래의 파일을 열어 삽입해 주면 된다.
$ vi ~/.ssh/authorized_keys
a 누르면 수정 가능한 상태로 바뀌며, 개행하여 위에서 생성한 RSA 공개키를 등록한다
종료하고 싶다면 :x

# 3. 깃허브 Settings - Secrets - actions에 PrivateKey 등록하기
여기에선 New Repository Secret 클릭하여 RSA 개인키 내용 전부 복붙!

이렇게 까지 완료해주면 AWS EC2 Linux2, GitHub Actions, Docker를 활용한 CI / CD 구축이 완료된다.

  • 이제 master(main) 브랜치에 push할 경우 위 Actions(WorkFlow)가 자동으로 실행되어 백엔드 서버 (리눅스)에 자동으로 도커 이미지가 run 된다.

🔗 출처, 참고 레퍼런스


Linux Docker 명령어 모음

도커 명령어 정리

스프링 프로젝트에서 git bash 시작하고 docker hub에 이미지 업로드 할 때 로그인 먼저 해야함
로그인 시 TTY 오류가 뜬다
as-is : docker login
to-be: winpty docker login

-> "winpty" enables TTY on Window. Useful for GitBash, Putty and MobaXTerm!

github actions 에서 gradle.yml 파일!
 주의) docker build run에서 여러줄 입력할 때 | 입력해줘야함....

ec2 리눅스 서버에서 도커 환경설정

sudo yum update -y
sudo yum install -y docker
sudo service docker start
sudo systemctl enable docker
sudo usermod -a -G docker ec2-user
출처: https://itcoin.tistory.com/685?category=769089 [ITcoin:티스토리]

도커 이미지 가져오기
sudo docker pull [계정명]/spring-cicd
혹은
sudo docker pull [계정명]/spring-cicd:[최신버젼]

도커 이미지 삭제하기 (전체 삭제)
docker system prune -a

도커 실행하기
docker run -d -p 80:8080 [계정명]/spring-cicd:[버젼]

도커 로그 확인
docker logs [컨테이너id]

1. 프로젝트 디렉에 RSA 키 만들어주고 
ssh-keygen -t rsa -b 4096 -C "[내메일]" -f spring-cicd

2. 인스턴스(리눅스서버)에 공개키 등록
공개키를 등록할 때는 아래의 파일을 열어 삽입해 주면 된다.
$ vi ~/.ssh/authorized_keys
a 누르면 수정 가능한 상태로 바뀌며, 개행하여 위에서 생성한 RSA 공개키를 등록한다
저장 후 종료하고 싶다면 :wq

3. 깃허브 Settings - Secrets - actions에 PrivateKey 등록하기
여기에선 New Repository Secret 클릭하여 RSA 개인키 내용 전부 복붙!

--- 여기까지가 GithubActions를 사용하여 
푸시할 경우 
자동 빌드, 
도커 이미지 도커 허브에 등록, 
도커 띄운 서버에 자동 배포
까지 완료한 것이다.


**application-alpha.properties

spring.config.activate.on-profile=alpha
spring.redis.host=redis
spring.redis.port=6379

//실시간으로 CPU 메모리 사용량 조회
top

// 리눅스 메모리 전체 용량 조회
cat /proc/meminfo | grep MemTotal

// 리눅스 메모리 사용량 조회
free -h

# 볼륨 리스트 확인하기
docker volume ls

# 볼륨 생성하기
docker volume create 볼륨명

# 볼륨 상세 조회하기
docker volume inspect 볼륨명

** 도커에서 redis cli 접속하는 명령어!!!!!
docker run -it --link redis:redis --rm redis redis-cli -h redis -p 6379

// 도커에서 레디스 쉘 열기
docker exec -it redis /bin/bash

// 도커 현재 용량 조회
docker system df --verbose

// 전체 키 조회 
keys *

// 해당 키로 필드 전체 조회
hgetall {key}

profile
BackEnd Developer

0개의 댓글