Github Actions으로 CICD 구축하기 (2) - Spring boot, Docker

2024. 8. 24. 01:25·Devops/CICD
반응형

System Architecture

 

 

 

OS : MacOS Sonoma 14.6.1
IDE : IntelliJ
Java v17
Spring Boot v3.3.2


-----
아래 내용이 전제 된 상태에서 실행한다.

1.  배포를 위한 ec2 서버가 실행되어 있음. (Ubuntu 22.04 LTS)
2.  ec2 서버에 Docker 가 설치되어 있음.

 

 

 

 

1. Docker 사용 준비

1.1 Docker repository 생성

Docker hub에 접속하여 repository를 생성한다.

 

 

1.2 프로젝트 상위에 Dockerfile 생성

- spring boot 프로젝트 폴더 구조

- Dockerfile 내용

# open jdk 17 버전의 환경을 구성한다.
FROM openjdk:17-alpine

# build가 될 때 JAR_FILE이라는 변수 명에 build/ibs/*.jar 선언
# build/libs - gradle로 빌드했을 때 jar 파일이 생성되는 경로임
ARG JAR_FILE=build/libs/*.jar


# JAR_FILE을 be-yeogaekgi.jar로 복사 (이 부분(.jar)은 개발환경에 따라 다름)
COPY ${JAR_FILE} cicd-test.jar

# 운영 및 개발에서 사용되는 환경 설정을 분리한다.
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=prod", "/cicd-test.jar"]

 

 

1.3 Docker Server 설정해주기

  1. Docker Desktop 설치 및 실행
  2. IntelliJIDEA > Preferences (Mac)로 또는 IntelliJIDEA > File > Settings (Windows/Linux) 또는
  3. Build, Execution, Deployment > Docker로 이동
  4. '+' 버튼을 클릭하여 새 Docker 연결 추가
  5. Docker for Windows/Mac을 사용 중이라면, 'Docker for Windows' 또는 'Docker for Mac'을 선택
    - Unix 소켓을 사용한다면, 'Unix socket'을 선택하고 경로 지정 (보통 '/var/run/docker.sock')
    - TCP 연결을 사용한다면, 'TCP socket'을 선택하고 호스트와 포트 지정
  6. 'Connect' 버튼을 클릭하여 연결 테스트

 

 

 

 

2. Docker Image 생성

2.1 실행 전 jar 파일 생성해보기

  • IntelliJ 오른쪽에 있는 Gradle 탭을 열기
  • [프로젝트명] > Tasks > build > bootJar를 더블클릭
  • build/libs 디렉토리에 jar 파일 생성됐는지 확인

❗️application-private.properties 파일 사용시 application.properties 파일에 아래 내용 추가

spring.config.import=optional:classpath:application-private.properties

 

 

2.2 Dockerfile 실행시키기

그 전에 docker desktop 로그인 되어있는지 확인!

 

 

2.3 Docker hub repository에 Push

# docker build --build-arg DEPENDENCY=build/dependency -t {dockerName}/{dockerRepository} .
docker build --build-arg DEPENDENCY=build/dependency -t settong/cicd-test .

# docker push {dockerName}/{dockerRepository}
docker push settong/cicd-test

 

 

Docker Image 확인

- Docker desktop > hub 에서 제대로 업로드 되어있는지 확인

 

- EC2 에서 실행해보기

# ec2 서버에서 실행

sudo docker pull (도커 허브 ID)/(Repository 이름)
sudo docker run -p 8090:8090 -d (도커 허브 ID)/(Repository 이름) # 프로젝트 port 8090임.

 

 

 

 

3. Github Actions 으로 CI/CD 적용

3.1 Github Secrets 설정

DB, S3 관련 정보 같은 민감한 정보를 저장.

 

  1. GitHub 리포지토리에서 Settings로 이동
  2. 좌측 메뉴에서 Secrets and variables > Actions를 클릭
  3. New repository secret 버튼을 클릭
  4. Secrets 추가
    • secret명은 특수문자 포함 불가능
    • workflow에서 secrets. 으로 불러옴 (secrets.DOCKER_REPO)
    • 추가해야할 내용들
      • YML : application-private에 들어갈 내용들을 yml 파일 형식으로 저장
      • DOCKER_USERNAME : Dockcer user(Namespace)
      • DOCKER_PASSWORD : Docker password
      • DOCKER_REPO : Docker repository 이름
      • HOST_PROD : EC2 퍼블릭 IPv4 DNS
      • PRIVATE_KEY : EC2 서버 접속 key. (key는 .pem 형식이어야 한다.)

 

 

3.2 workflow 작성

1. Actions → Choose a workflow → Java with Gradle 선택

기본 파일 그대로 생성(뒤에 수정 예정)

 

2. [.github -> workflows] 폴더에 gradle.yml 파일이 생성된 것 확인

 

3. gradle.yml (스크립트 파일 수정)

🔗 스트립트 명령별 자세한 설명

name: Java CI with Gradle

on:
  push:
    branches: [ "develop", "main" ]
  pull_request:
    branches: [ "develop", "main" ]

jobs:
  build:

    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
    - uses: actions/checkout@v4
    - name: Set up JDK 17
      uses: actions/setup-java@v4
      with:
        java-version: '17'
        distribution: 'temurin'

    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-

    # 환경별 yml 파일 생성
    - name: make application.yml
      if: contains(github.ref, 'main')
      run: |
        cd ./src/main/resources
        touch ./application.yml
        echo "${{ secrets.YML }}" > ./application.yml
      shell: bash

    # gradle chmod
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew


    # gradle build
    - name: Build with Gradle
      run: ./gradlew clean build -x test

    # docker login
    - name: Docker Hub Login
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}

    # docker build & push to production
    - name: Docker build & push to prod
      if: contains(github.ref, 'main')
      run: |
        docker build -f Dockerfile -t ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }} .
        docker push ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}

    ## deploy to production
    - name: Deploy to prod
      uses: appleboy/ssh-action@master
      id: deploy-prod
      if: contains(github.ref, 'main')
      with:
        host: ${{ secrets.HOST_PROD }} # EC2 퍼블릭 IPv4 DNS
        username: ubuntu
        key: ${{ secrets.PRIVATE_KEY }}
        envs: GITHUB_SHA
        script: |
          sudo docker ps
          sudo docker rm -f $(docker ps -qa)
          sudo docker pull ${{ secrets.DOCKER_REPO }}/be-yeogackgi:latest
          sudo docker run -d -p 8090:8090 {{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO }}:latest
          sudo docker image prune -f

 

 

 

728x90
반응형

'Devops > CICD' 카테고리의 다른 글

Github Actions으로 CICD 구축하기 (3) - React 빌드 파일 배포  (0) 2024.09.03
Github Actions으로 CICD 구축하기 (1) - 시스템 아키텍처와 필요한 개념 정리  (0) 2024.08.24
'Devops/CICD' 카테고리의 다른 글
  • Github Actions으로 CICD 구축하기 (3) - React 빌드 파일 배포
  • Github Actions으로 CICD 구축하기 (1) - 시스템 아키텍처와 필요한 개념 정리
settong
settong
    250x250
  • settong
    개 발 자 국
    settong
  • 전체
    오늘
    어제
    • 전체보기 (202)
      • Computer Science (50)
        • Network (7)
        • Operating System (18)
        • Data Structure (9)
        • Database (11)
        • Algorithm (5)
      • Language (17)
        • Java (17)
        • Javascript (0)
        • Python (0)
      • Devops (20)
        • AWS (0)
        • Naver Cloud (16)
        • CICD (3)
        • 웹 서버 관리 (1)
      • Front (0)
        • React (0)
      • Backend (5)
        • Spring (5)
      • 코딩 테스트 정복기 (110)
        • 백준 (51)
        • 프로그래머스 (53)
        • 기타 (6)
      • etc (0)
      • 경제 상식 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    lcs
    ncp
    분할정복
    다이나믹프로그래밍
    Network
    ncp202
    DFS
    BFS
    완전탐색
    CI/CD
    ncp200
    다익스트라
    프로그래머스
    백트래킹
    해시
    벨만포드
    github actions
    집합
    Spring Boot
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
settong
Github Actions으로 CICD 구축하기 (2) - Spring boot, Docker
상단으로

티스토리툴바