본문 바로가기
CI CD

springboot 서버 github action으로 컨테이너 이미지 만들고 docker hub에 업로드하기

by 오렌지마끼야또 2023. 5. 18.
728x90
반응형

 

 

 

 

 

 

GitHub Actions는 GitHub에서 제공하는 서비스로, 빌드, 테스트, 배포 파이프라인을 자동화할 수 있는 CI(Continuous Integration, 지속 통합)와 CD(Continuous Deployment, 지속 배포) 플랫폼입니다.

 

오늘은 아래 그림에서 3번까지의 과정을 해보겠습니다.

저는 현재 인텔리제이에서 springboot + gradle을 사용중입니다.

 

 

 

 

 

 

1. Dockerfile 작성

 

먼저 Spring Boot 애플리케이션을 실행할 Docker 이미지를 생성하기 위해 Dockerfile을 작성해야 합니다. 프로젝트 루트 디렉토리에 Dockerfile을 생성하고 내용을 작성합니다.

 

# JRE (Java Runtime Environment) 버전을 사용합니다.
# JRE는 Java 애플리케이션을 실행하는 데 필요한 최소한의 구성 요소만 포함합니다.
# 개발 시 JRE만 필요한 경우에 유용합니다.
# 가벼운 이미지이며 실행환경에 최적화되어 있습니다.
FROM adoptopenjdk:11-jre-hotspot

# build/libs/ 디렉토리에 있는 모든 JAR 파일을 app.jar로 복사합니다.
COPY build/libs/*.jar app.jar

# java -jar app.jar 명령을 실행하도록 설정합니다.
ENTRYPOINT ["java", "-jar", "app.jar"]

 

 

 

 

 

2. GitHub Actions Workflow 생성

 

이제 GitHub Actions workflow 파일을 생성하여 빌드 및 이미지 생성 단계를 정의합니다.

저는 java11, gradle 을 사용했기 때문에 Java whth Gradle 을 선택했습니다.

원하는 이름으로 수정해도 됩니다. 저는 github-actions.yml 로 수정했습니다.

 

 

인텔리제이로 돌아와서 git pull 을 받고 확인해 보면 .github/workflows/github-action.yml 이 생겼습니다.

IDE 말고 github 에서 직접 수정해도 됩니다.

# This workflow uses actions that are not certified by GitHub.
# They are provided by a third-party and are governed by
# separate terms of service, privacy policy, and support
# documentation.
# This workflow will build a Java project with Gradle and cache/restore any dependencies to improve the workflow execution time
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-gradle

name: CI Build & Upload DockerHub

on:
  # msater 브랜치로 push가 되면 동작합니다.
#  push:
#    branches: [ "master" ]

  # msater 브랜치로 PR이 오면 동작합니다.
  pull_request:
    branches: [ "master" ]

permissions:
  contents: read

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: 저장소 Checkout
      uses: actions/checkout@v3


#    GitHub-Actions에서 사용될 JDK를 세팅합니다.
#    (프로젝트나 AWS의 Java 버전과는 달라도 무방합니다.)
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'


#    gradle caching
#    빌드 시간이 20~30% 단축
#    공식문서 참고 : https://github.com/actions/cache
    - 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-


#    gradlew에 실행권한을 주지 않으면 에러가 뜹니다.
#    Run ./gradlew build
#    /home/runner/work/_temp/ec1db276-8c5b-4000-a69f-6ae292aee7e6.sh:
#      line 1:
#        ./gradlew: Permission denied
#    Error: Process completed with exit code 126.
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew


#      ./gradlew build 이 실행되면 build/libs 폴더에 jar 파일이 생깁니다.
#      관련 설정 : build.gradle 의 jar {...}, bootJar{...} 부분
    - name: Build with Gradle
      run: ./gradlew build


#      현재 디렉토리에 있는 Dockerfile 을 사용하여 도커 이미지를 빌드합니다.
#      이때 이미지 이름은 <docker_hub_username>/<image_name> 로 설정됩니다.
#      도커 허브에 이미지를 publish 하기 위해서는 앞에 유저이름을 꼭 붙여야 합니다.
    - name: Build Docker image
      run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/foodlink-springboot .


#    docker/login-action 이라는 Action을 사용하여 도커 로그인을 진행합니다.
#    -u, -p 옵션을 사용하여 인라인 명령을 사용하면, GitHub Actions에서는
#    보안상의 이유로 오류가 발생하므로 해당 Action을 사용합니다.
    - name: Docker Hub 로그인
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_TOKEN }}


#    Docker Hub 저장소에 이미지를 push 합니다.
    - name: Docker Hub push
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/foodlink-springboot

 

 

 

 

 

3. 도커허브 가입하고 token 발급하기

가입을 합니다. 레포지토리는 따로 만들지 않아도 됩니다. 그리고 Account Settings - Security 에서 New Access Token 을 눌러 token을 발급 받습니다. 이후에 github 에서 이것을 secret 에 등록하면 됩니다.

 

 

 

 

 

4. github 에서 secrets 설정하기

 

github 에서 secrets를 적용하고자 하는 레포지토리의 Settings - Secrets and variables - Action 에 들어가서 New repository secret 을 눌러서 설정합니다.

 

 

 

 

 

저는 dev 브랜치를 만들고 거기서 수정 및 push 후 github 에서 dev -> master 로 PR 을 할 경우에 github action이 동작하게 하였습니다.

아래처럼 PR 을 하면 Action 탭에서 현재 동작하는 상황을 확인 할 수 있습니다.

 

 

완료 후 docker hub에 접속해서 확인해 보면

 

업로드가 정상적으로 되었습니다!

 

 

 

 

 

 

 

 

 

이미지 출처 및 참고

 

https://zzang9ha.tistory.com/404

 

https://zzang9ha.tistory.com/339

 

https://hudi.blog/deploy-with-docker-and-github-actions/

 

https://itcoin.tistory.com/685

 

https://kotlinworld.com/401

728x90
반응형

'CI CD' 카테고리의 다른 글

빌드 후에 jar 파일이 두개가 생겼다?  (0) 2023.05.18
./gradlew build JAVA_HOME 에러  (0) 2023.05.17

댓글