본문 바로가기
공부/Spring

[Spring] 깃허브 액션(github action)과 도커(docker)를 사용하여 스프링 부트 서버 CI/CD 구축하기

by 웅대 2023. 7. 9.
728x90
반응형

이전에 github action만 이용해서 CI/CD를 구축하는 방법과 github action과 aws codedeploy를 사용하여 CI/CD를 구축하는 방법에 대해 알아보았다.

 

<github action>

 

[Spring] 깃허브 액션으로 CI/CD 구축해보기 (스프링 부트)

CI/CD는 Continuous Integration/Continuous Delivery의 준말로 지속적인 통합과 지속적인 전달을 의미한다. 지속적인 통합(CI)은 지속적으로 품질 관리를 적용하는 프로세스를 실행시키는 것이다. 작은 단위

growth-coder.tistory.com

<github action + aws codedeploy>

 

[Spring] 깃허브 액션과 AWS CodeDeploy로 CI/CD 구축 (스프링 부트)

https://growth-coder.tistory.com/220 이전 포스팅에서 깃허브 액션만 사용하여 CI/CD를 구축했었다. ssh-action과 scp-action을 통해서 배포 자동화를 구축했는데 이번에는 AWS CodeDeploy를 사용하여 배포 자동화를

growth-coder.tistory.com

이 당시에는 EC2에 직접 jdk를 설치하여 환경을 마련하는 방법으로 진행을 했었다.

 

환경을 직접 관리를 했어야 했는데 이번 포스팅에서는 도커를 통해 환경에 구애받지 않는 서버에 CI/CD를 적용해보기로 했다.

<도커 개념>

 

[Docker] 도커 개념 및 사용법

프로젝트를 진행하면서 로컬에서 잘 작동하던 프로젝트가 서버에 배포하면 잘 작동하지 않을 수 있다. 수많은 원인이 존재하겠지만 라이브러리 버전이 다르다거나 네트워크 환경이 다르다거나

growth-coder.tistory.com

깃허브 액션만을 이용해서 구축할 예정이고 ssh를 통해 원격으로 EC2 서버에 접근할 예정이다.

 

가장 위의 "깃허브 액션으로 CI/CD 구축해보기"와 비슷한 방식이기 때문에 보고 오시는 것을 추천합니다.

 

 이전 도커 포스팅에서는 openjdk 이미지를 받아서 컨테이너 실행 후 그 안에 jar 파일을 복사하고 다시 컨테이너에게 java -jar 명령어를 주는 방식으로 진행했었다.

 

그런데 이 방식은 시간이 많이 걸리고 귀찮은 방식이다.

 

이번에는 Dockerfile을 통해서 간단하게 진행해보려고 한다.

 

Dockerfile 설정

Dockerfile은 프로젝트 최상단에 생성해주면 되고 확장자 없이 Dockerfile이라는 이름으로 파일을 생성해주면 된다.

 

<Dockerfile>

FROM openjdk:19-alpine
ARG JAR_PATH=build/libs/*.jar
COPY ${JAR_PATH} /home/server.jar
ENTRYPOINT ["java","-jar","/home/server.jar"]

 

 

FROM

FROM은 기본 이미지를 지정해준다.

 

이미지 이름이 openjdk이고 태그가 19-alpine인 이미지를 기본으로 사용하겠다는 뜻이다.

 

자신의 버전에 맞게 이미지를 선택하면 된다.

ARG

그리고 ARG를 통해서 jar 파일의 위치를 지정해줬다.

 

jar 파일을 생성하고 나면 build/libs에 저장되기 때문에 build/libs/*.jar가 생성된 jar 파일의 경로가 된다.

 

참고로 gradle 빌드 시 일반적인 jar 파일과 plain이 붙은 jar 파일이 생성된다면 plain jar 파일이 생성되지 않도록 설정하는 것이 좋다.

 

build.gradle에 다음 코드를 작성해주면 jar 파일이 하나만 생길 것이다.

 

<build.gradle>

jar {
	enabled=false
}

COPY

jar 파일을 컨테이너 내부로 복사한다.

COPY [생성된 로컬 jar 파일 경로] [컨테이너 내부 jar 파일 경로]

ENTRY POINT

entry point를 통해 컨테이너를 실행하면 자동으로 jar 파일을 실행하도록 한다.

ENTRYPOINT ["java","-jar","/home/server.jar"]

 

기본 환경 세팅

이전에 올렸던 github actions로 CI/CD 구축 포스팅과 거의 유사하다.

 

공통적인 부분은 따로 설명하지 않을 예정이므로 보고 오는 것을 추천합니다.

 

[Spring] 깃허브 액션으로 CI/CD 구축해보기 (스프링 부트)

CI/CD는 Continuous Integration/Continuous Delivery의 준말로 지속적인 통합과 지속적인 전달을 의미한다. 지속적인 통합(CI)은 지속적으로 품질 관리를 적용하는 프로세스를 실행시키는 것이다. 작은 단위

growth-coder.tistory.com

 

  1. EC2 인스턴스를 public subnet에 생성하고 탄력적 ip를 연결한다.
  2. EC2 인스턴스에 도커를 설치한다.
  3. 로컬에서 rsa 키를 생성한다.
  4. rsa 퍼블릭 키를 EC2 서버의 .ssh/authorized_keys 파일에 붙여넣는다.
  5. rsa 프라이빗 키를 깃허브 액션의 secrets에 등록한다.
  6. host, username, port도 같이 등록해준다.
  7. yml 파일을 작성해준다. 

 

이전 포스팅에서 달라진 점은 도커를 설치한다는 점이다.

 

도커는 다음과 같은 명령어를 통해 설치하면 된다.

sudo yum update
sudo yum install docker

workflow 작성

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 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
          
      - name: Run chmod to make gradlew executable
        run: chmod +x ./gradlew
        
      - name: Build with Gradle
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: build
          
      - name: Docker build
        run: |
          docker login -u ${{ secrets.DOCKER_ID }} -p ${{ secrets.DOCKER_PWD }}
          docker build -t [도커 허브 아이디]/[이미지 이름] .
          docker push [도커 허브 아이디]/[이미지 이름]
          
      - name: Deploy
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.PRIVATE_KEY }}
          script: |
            docker pull [도커 허브 아이디]/[이미지 이름]
            docker stop server
            docker run -d --rm --name server -p 8080:8080 growth123/test

"Build With Gradle"까지는 이전 포스팅과 동일하다.

 

Docker Build부터 본다면 우선 docker에 로그인을 하고 이미지를 생성한 다음 도커 허브에 이미지를 push 한다.

 

그리고 Deploy에서는 ssh-action을 사용하여 원격으로 EC2에 명령어를 입력한다.

 

우선 로컬에서 올린 이미지를 가져오고 기존 실행 중이던 서버를 내리고 새로운 이미지를 통해 서버를 올린다.

 

Dockerfile을 설정했기 때문에 컨테이너를 실행만 시켜도 서버가 자동 실행된다.

728x90
반응형

댓글