카테고리 없음

[Spring Boot] Docker + Github actions 로 CICD 구축하기

ckm7907 2024. 3. 8. 00:03

Spring Boot 프로젝트 만들기

스프링 프로젝트를 만들기 위해 Spring Boot initializr 사이트로 이동한다.
https://start.spring.io/

Spring initializr

Dependencies 에서 Spring Web 을 추가한다.

intellij 에서 만들어진 demo 프로젝트를 실행해보기 DemoApplication.java

위와 같이 SpringBoot가 terminal에서 뜨면 성공!

github에 프로젝트 올리기

github에서 repo를 하나 만든다.

프로젝트에서 terminal을 열어서 github로 spring boot를 올린다,

intellij - demo project 폴더 안 terminal 에서 명령어를 친다.

demo > git init
demo > git remote add https://github.com/chwangmin/spring-boot-test2.git
demo > git add .
demo > git commit -m ":tada: init"
demo > git branch -m master main
demo > git push --set-upstream origin main

dockerfile 만들기

demo project 최상단 폴더에 Dockerfile을 만든다

그리고 파일의 내용을 아래와 같이 적용한다.

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

github workflow 만들기

만든 github repo의 상단 탭에서 Actions 을 선택하고 Java with Gradle 을 Configure 한다.

Java with Gradle 로 CI 테스트 하기.

만들어진 .github/workflows/gradle.yml의 파일에서 필요없는 부분은 삭제하고 commit change를 한다.

(gradle을 사용할 수 있게 만들어야 함)

name: Java CI with Gradle

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "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: Setup Gradle
      uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

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

    - name: Build with Gradle Wrapper
      run: ./gradlew build

아래와 같이 Actions 에서 workflow 를 확인하면 gradle이 정상적으로 build가 되는 것을 확인할 수 있다.

이것이 CI 이다.

spring boot gradle 을 build 함으로써 test를 진행하기 때문이다.

CD 작성하기 + dockerhub

name: Java CI with Gradle

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

jobs:
  build-docker-image:
    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: Setup Gradle
      uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0

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

    # Spring Boot 어플리케이션 Build
    - name: Build with Gradle Wrapper
      run: ./gradlew build

    # Docker 이미지 Build
    - name: docker image build
      run: docker build -t ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test .

    # DockerHub Login (push 하기 위해)
    - name: docker login
      uses: docker/login-action@v2
      with:
        username: ${{ secrets.DOCKERHUB_USERNAME }}
        password: ${{ secrets.DOCKERHUB_PASSWORD }}

    # Docker hub 로 push
    - name: Docker Hub push
      run: docker push ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

  # 위 과정에서 푸시한 이미지를 ec2에서 풀받아서 실행
  run-docker-image-on-ec2:
    needs: build-docker-image
    runs-on: self-hosted

    steps:
    - name: docker pull
      run : sudo docker pull ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

    - name: docker stop container
      run: |
        if [ $(sudo docker ps -a -q -f name=spring-cicd-test) ]; then
          sudo docker stop spring-cicd-test
        fi

    - name: docker run new container
      run: sudo docker run --rm -it -d -p 80:8080 --name spring-cicd-test ${{ secrets.DOCKERHUB_USERNAME }}/spring-cicd-test

    - name: delete old docker image
      run: sudo docker system prune -f

github setting 설정

${{ secrets.~}} 와 self-hosted를 설정해야 한다.

github secrets 설정

먼저 github repo 의 상단의 Settings을 선택한다.

 

그리고 현재 gradle.yml 에 적어둔 ${{ secrets.DOCKERHUB_USERNAME }}, ${{ secrets.DOCKERHUB_PASSWORD }} 에 대한 값을 넣어야 한다.
그래서 각각 자신의 도커 허브의 이름과, 패스 워드를 아래와 같이 Add secret 하면 된다.

self-hosted 설정

먼저 github repo 의 상단의 Settings을 선택하고, 오른쪽 탭에 Actions > Runners 를 선택한다.

오른쪽 상단 초록색 버튼 new self-hosted runner 을 선택한다.

그 후 나오는 윈도우에서 linux를 선택하고, mkdir ~ ./config.sh ~ 까지 자신의 ec2에 입력한다.

ec2 에서 아래와 같이 뜨면 성공!

그리고 github와 연결을 한다. background 연결.

sudo ./svc.sh install
sudo ./svc.sh start

ec2 에서 docker을 설치한다.

workflow 에서 자신의 ec2에서 수행하는데, docker 명령어가 실행이 안될 것이다. 그래서 ec2에서 docker을 설치한다.

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io

그리고 마지막으로 github actions 재기동! 끝