본문 바로가기
Tech/DevOps

[CI/CD] Github Actions를 이용한 테스트 및 빌드 자동화(SpringBoot/Docker image 생성/Docker Hub 업로드)

by 싱브이 2024. 4. 21.
728x90
반응형

1. CI

2. CD

 

 

개인 프로젝트에서 CI를 진행해보기 위해서 미리 CI만을 적용해보려고 한다!

 

* CI (지속적인 통합) 란?

지속적인 통합으로 한 곳에 지속적으로 통합하는 것! 즉, 자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경 사항을 중앙 리포지토리에 정기적으로 병합하는 DevOps 소프트웨어 개발 방식이다. (참고) 모든 변경사항은 자동 빌드 및 테스트를 거쳐 메인 브랜치에 통합된다.

 

물론 실무에서는 Jenkins를 많이 사용한다고는 하지만 나는 개인으로 하는 프로젝트라 너무 배보다 배꼽이 큰거같기도 하고, Git에서 편리하게 다 제공을 해준다는데 안쓸 이유도 없는 것 같기도 하고 ! 아무튼 CI를 진행해본다는 것 자체로 큰 의미가 있다고 생각한다!

(팀 프로젝트 전에 알았으면 훨씬 더 편했을텐데 !!!!!)

 

 

 


시작해보기

 

1. repo를 생성

git action으로 가면 친절한 github은 각각의 템플릿을 만들어 두었다. 이걸 사용하면 된다 !

 

2. 내용 복사 혹은 파일 생성

.github > workflows > ci.yml 파일을 생성하고 해당 파일에 복사한 내용을 복붙한 뒤 수정한다.

나 꽤나 많은 오류를 거쳤다 ,,,,, ㅠ  나의 실패와 성공이 담긴 코드를 보고 싶다면? [링크]

 

[나의 실패 코드]

name: Java CI with Gradle

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

permissions:
  contents: read
      
jobs:
  build-docker-image:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    
    # 1. Java 17 설정
    - name: Set up JDK 17
      uses: actions/setup-java@v2
      with:
        java-version: '17'
        distribution: 'adopt'
        
    # 2. Gradle 빌드
    - name: Build with Gradle
      uses: eskatos/gradle-command-action@v1
      with:
        gradle-version: '7.5'
        args: bootBuildImage

    # 3. Spring Boot 애플리케이션 Docker 이미지 빌드
    - name: Build Docker Image
      run: docker build --build-arg JAR_FILE=build/libs/\*.jar -t ${{ secrets.DOCKERHUB_USERNAME }}/board .

    # 4. Docker Hub 로그인 및 이미지 푸시
    - name: Push Docker Image to Docker Hub
      run: |
        echo "${{ secrets.DOCKERHUB_PASSWORD }}" | docker login -u "${{ secrets.DOCKERHUB_USERNAME }}" --password-stdin
        docker push ${{ secrets.DOCKERHUB_USERNAME }}/board
      env:
        DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
        DOCKERHUB_PASSWORD: ${{ secrets.DOCKERHUB_PASSWORD }}
  • Github에 Push나 PR이 main 브랜치로 발생하면 actions이 실행된다.
  • JDK는 나의 버전에 따라 17
  • Gradle 빌드를 한다. → JAR 파일
  • 오류 : web docker build and push 

 

[나의 성공 코드]

name: Java CI with Gradle

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

permissions:
  contents: read
      
jobs:
  build-docker-image:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    
    # 1. Java 17 설정
    - name: Set up JDK 17
      uses: actions/setup-java@v2
      with:
        java-version: '17'
        distribution: 'adopt'
        
    # 2. Gradle 빌드
    - name: Build with Gradle
      run: ./gradlew bootJar

    # 3. 도커 이미지 빌드 후 도커허브에 push하기
    - name: web docker build and push
      run: |
        docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }}
        docker build -t ${{ secrets.DOCKER_REPO }} .
        docker push ${{ secrets.DOCKER_REPO }}

 

코드 분석

실패했던 코드와 성공시킨 코드의 차이는 아래와 같다.

 

1. Gradle 빌드 단계

  • ./gradlew boorBuildImage : Spring Boot 애플리케이션을 Docker 이미지로 빌드
  • ./gradlew bootJar : Spring Booar 애플리케이션을 JAR 파일로 빌드

빌드 후 jar 파일을 찾아서 Docker image로 변환하지 않고, jar 파일로 빌드 후 Docker image를 생성하는 방법으로 변경하였다.

(이렇게 변경한 이유에는 .gitignore로 제외된 부분으로 인해서 jar 파일을 찾지 못하는것은 아닐까하는 생각때문! .dockerignore도 생각하긴했지만, 별로 상관없었던거같다.)

 

2. 도커 이미지 빌드 밒 푸시

  • docker build : Docker 이미지 빌드, docekr push : Docker Hub에 푸시
  • login, build, push 통합

 

 

3. (Docker 사용하는 경우) settings에 환경변수를 넣어준다.

 

  • 추가하는 값은 ci.yml 파일안에 있는 secret 값들을 넣어주면 자동으로 환경변수로 등록한 값들을 넣어줘서 실행함
  • DOCKER_REPO 는 "도커아이디/이미지명" 

4. Dockerfile 

FROM openjdk:17
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "app.jar"]

 

 

성공

GitHub Action
Docker image
DockerHub

 

 

근데 아직 문제가 남아있다!

보안상 github에 push 하지 않은 application.properties을 어떻게 docker로 안전하게 push 할 것인가..! 

728x90
반응형

댓글