📚 Study

Github Action, Docker, Springboot 자동배포 CICD 파이프라인 구축하기

date
Nov 2, 2023
slug
github-action-docker-springboot
author
status
Public
category
📚 Study
tags
CI/CD
summary
Github Action을 사용하여 아주 쉽고 간단하게 자동배포 CICD를 구축해보자!
type
Post
thumbnail
스크린샷 2023-11-09 오후 2.53.09.png
 
 
notion image
💡
CICD flow
GitHub push → Github action
  • Docker image build → Docker hub push
  • EC2 접속 → Docker image pull → Docker compose
 

1. Set up

1) Springboot project > Dockerfile 작성

  • Dockerfile : docker image 빌드를 위한 파일
FROM openjdk:17-jdk COPY build/libs/???-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]

2) docker hub > repository 생성

  • 가입
  • repository 생성
    • notion image
 

3) EC2 서버에 docker, docker-compose 설치

  • docker 설치
// 도커 설치 sudo amazon-linux-extras install docker // 도커 시작 sudo service docker start // 권한 부여 sudo usermod -a -G docker ec2-user // auto-start에 docker 등록 sudo chkconfig docker on // 인스턴스 재시작 sudo reboot // 도커 버전 확인 docker version
  • docker compose 설치
// docker-compose 설치 sudo curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose // 권한 부여 sudo chmod +x /usr/local/bin/docker-compose // 설치 확인 docker-compose version

4) EC2 서버 22번 port 열기

  • Github Actions에서 ssh를 통해 원격 서버에 접속해야 하므로 22번 port는 0.0.0.0에 대하여 인바운드를 열어두어야 함
 

2. Github Action 설정

1) workflow(.yml) 작성

Github repo > Actions > New workflow
  • 이때 주의할 점 : trigger에 해당하는 branch에서 작업해야 함.
    • 만일 develop branch push를 trigger로 하고 싶은데 main 브랜치에서만 action을 등록하면 백날천날 develop push 해도 action run 안됨!
## Default Setting name: Java CI with Gradle on: # on : 어떤 조건에서 이 workflow를 실행할 것인지 컨디션 push: branches: - develop pull_request: branches: - develop permissions: # permissions : 코드의 내용을 이 파일을 실행하여 action을 수행하는 주체(Github Actions에서 사용하는 VM)가 읽을 수 있도록 허용합니다. contents: read ## 실제로 실행될 내용 정의 jobs: build: runs-on: ubuntu-latest # runs-on : github action의 CI서버 runner가 어떤 환경을 갖출지 고르는 것, ubuntu-latest : ubuntu 최신 버전에서 script를 실행 steps: # 처리할 일들을 순서대로 하나씩 정의 # checkout : 지정한 저장소(현재 REPO)에서 코드를 runner 워크플로우 환경으로 가져오도록 하는 github action - name: checkout uses: actions/checkout@v3 # open jdk 17 버전 환경을 세팅 - name: Set up JDK 20 uses: actions/setup-java@v3 with: java-version: '20' distribution: 'zulu' ## 환경파일 작성 : github에 올리지 못하는 정보의 설정파일을 runner에 삽입하는 것이다. ## 필요없어서 작성 안 함 # ## create application-database.yaml # - name: make application-database.yaml # run: | # ## create application-database.yaml # cd ./src/main/resources # # application-database.yaml 파일 생성 # touch ./application-database.yaml # # GitHub-Actions 에서 설정한 값을 application-database.yaml 파일에 쓰기 # echo "${{ secrets.DATABASE }}" >> ./application-database.yaml # shell: bash ## gradle build # - name: Build with Gradle # run: ./gradlew build # gradle을 통해 소스를 빌드. - name: Build with Gradle run: | ls -al chmod +x ./gradlew ./gradlew build ## 웹 이미지 빌드 및 도커허브에 push - name: web docker build and push run: | ls -al docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }} docker build -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} . docker images docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} ## docker compose up ## appleboy/ssh-action@master 액션을 사용하여 지정한 서버에 ssh로 접속하고, script를 실행 # script의 내용은 도커의 기존 프로세스들을 제거하고, docker repo로부터 방금 위에서 push한 내용을 pull 받아 실행하는 것입니다. # 실행 시, docker-compose를 사용합니다. - name: Deploy to server uses: appleboy/ssh-action@master with: host: ${{ secrets.HOST }} username: ec2-user key: ${{ secrets.KEY }} script: | sudo docker rm -f $(docker ps -qa) sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} docker-compose up -d docker image prune -f
 

2) Secrets 등록

Github repo > Settings > Secrets and variables > Actions
  • pem key 확인하는법
cat <pem키경로>
notion image
 

3. docker-compose.yml 설정

EC2 서버의 루트 디렉토리에서 진행
sudo vi docker-compose.yml
version: '3' services: web: container_name: {{container_name}} image: {{username}}/{{repo}} expose: - 8080 ports: - 8080:8080
 
 
 

 

결과

PR, push 될 때마다 실행되고 서버까지 잘 배포되는 것 확인!
notion image