[Spring] GitAction으로 CI 해보기

Yohan_05·2023년 6월 2일
0

spring

목록 보기
2/2
post-custom-banner

개요

같이 프로젝트를 진행하는 후배에게 경험도 할겸 스프링 CI 를 맡겨봤는데 Spring 자체를 잘 모르다보니 어려움이 있는 것 같아 과정과 방법을 정리하려고 이 글을 작성하게됐다. 깃허브 액션을 어느정도 다룰 수 있다는 가정하에 글을 진행하도록 하겠다.

CI가 뭔가요? : 여기 를 보고 오시면됩니당

1. 스크립트 생성

CI를 적용시킬 레포지토리에 들어가면 Actions 라는 탭이 보일 것이다. 클릭해주고 프로젝트에 사용하는 빌드 도구를 선택해준다. gradle을 많이 사용한다고 판단하여 이 글에선 gradle 로 진행하도록 하겠다. java with gradle 을 configure 해주자.

생성을 한다면 .github/workflow/gradle 모시깽모시깽.yml 이런식으로 생성이 될텐데 해당 경로에서만 workflow 파일들을 인식하니 알아두자.

2. 스크립트 작성

내가 작성한 스크립트는 아래와 같다.

name: Spring Boot & Gradle CI/CD 

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "*" ]

env:
  DB_HOST : ${{secrets.DB_HOST}}
  DB_NAME : ${{secrets.DB_NAME}}
  DB_PASSWORD : ${{secrets.DB_PASSWORD}}
  DB_PORT : ${{secrets.DB_PORT}}
  DB_USER : ${{secrets.DB_USER}}

  
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
          cache: gradle
      
      - name: Set up JDK 11 job has success
        if: ${{ success() }}
        run: echo "jdk 11 job succeeded"
      
      - name: Setup Gradle
        uses: gradle/gradle-build-action@v2
      
      - name : Setup Gradls's permission
        run : chmod +x gradlew 
      
      - name: Build with Gradle
        run : ./gradlew clean build --exclude-task test
            
      - name: Backend CI Discord Notification
        uses: sarisia/actions-status-discord@v1
        if: ${{ success() }}
        with:
          title: ✅ Backend CI success ✅
          webhook: ${{ secrets.DISCORD_WEBHOOK }}
          color: 00FF00

      - name: Backend CI Discord Notification
        uses: sarisia/actions-status-discord@v1
        if: ${{ failure() }}
        with:
          title: ❗️  Backend CI failed ❗️
          webhook: ${{ secrets.DISCORD_WEBHOOK }}
          color: FF0000

하나하나 뜯어서 알아보도록 하겠다.

name, on_push

name : 워크플로우의 이름을 설정해준다.
on : on 아래로 있는 조건들을 만족하면 워크플로우가 실행된다. 여기선 master 브랜치로 푸쉬를 하거나 모든 브랜치에서 pr 이 열렸을때 이 워크플로우를 실행시켜준다.

name: Spring Boot & Gradle CI/CD 

on:
  push:
    branches: [ "master" ]
  pull_request:
    branches: [ "*" ]

env

env : 빌드를 위한 환경변수를 설정해준다. 빌드를 할때 필요한 환경변수가 엄청 많지 않아서 application.yml 을 생성하는 방식보단 env 방식이 좋을 것 같아 이 방식을 채택하였다.

env:
  DB_HOST : ${{secrets.DB_HOST}}
  DB_NAME : ${{secrets.DB_NAME}}
  DB_PASSWORD : ${{secrets.DB_PASSWORD}}
  DB_PORT : ${{secrets.DB_PORT}}
  DB_USER : ${{secrets.DB_USER}}

jobs

jobs : 작업들을 정의하여준다. build라는 작업을 실행할 것이다.
runs-on : 이 작업을 진행할 os 를 말한다. swift가 아니면 보통 우분투 환경에서 돌리는 것

jobs:
  build:
    runs-on: ubuntu-latest

steps

steps : 작업 과정들을 선언?하는 곳이다.
Checkout code : 레포지토리의 코드를 가져오는 작업이다.
Set up JDK 11 : JDK를 설정해주는 작업이다. 이때 프로젝트 버전과 맞는 버전을 사용해주면된다.
Set up JDK 11 job has success : 위의 작업이 success한다면 실행되는 작업이다. 그냥 워크플로우가 돌아가는 터미널에서 jdk 11 job succeeded 하고 알려준다
Setup Gradle : 빌드를 위한 gradle 를 세팅해주는 작업이다.
SetUP gradle's permission : gradle에 권한이 없어 프로젝트가 빌드가 안되는 경우가 많기 때문에 chmod +x 를 통해 gradlew 의 권한을 부여해준다.
Build with Gralde : gradlew 를 사용하여 프로젝트를 빌드해준다. 그냥 빌드와 클린 빌드의 차이는 여기 를 참고 바란다.
Backend CI Discord Notification : secrets 에 저장된 github webhook 으로 ci 성공했어요~ 하고 알람을 보내는 작업이다. 성공한다면 보통 이런식으로 뜬다

    steps:
      - name: Checkout code
        uses: actions/checkout@v3

      - name: Set up JDK 11
        uses: actions/setup-java@v3
        with:
          java-version: '11'
          distribution: 'temurin'
          cache: gradle
      
      - name: Set up JDK 11 job has success
        if: ${{ success() }}
        run: echo "jdk 11 job succeeded"
      
      - name: Setup Gradle
        uses: gradle/gradle-build-action@v2
      
      - name : Setup Gradls's permission
        run : chmod +x gradlew 
      
      - name: Build with Gradle
        run : ./gradlew clean build --exclude-task test
            
      - name: Backend CI Discord Notification
        uses: sarisia/actions-status-discord@v1
        if: ${{ success() }}
        with:
          title: ✅  Backend CI success ✅
          webhook: ${{ secrets.DISCORD_WEBHOOK }}
          color: 00FF00

      - name: Backend CI Discord Notification
        uses: sarisia/actions-status-discord@v1
        if: ${{ failure() }}
        with:
          title: ❗️ Backend CI failed ❗️
          webhook: ${{ secrets.DISCORD_WEBHOOK }}
          color: FF0000

스크립트를 실행시키고 딱 봐도 성공한것처럼 보이는 창이 뜬다면 CI가 성공한 것이다. 실패하더라도 실패한 작업을 클릭해보면 무슨 이유로 실패하였는지 이유가 뜨니 백엔드와 잘 이야기하여서 고쳐나가길 바란다. (스크립트쪽에서 문제가 생길 수도 있고 백엔드 애플리케이션 자체에서 문제가 있을 수도 있기 때문)

마치며

CI에 대한걸 하나도 몰라도 손 쉽게 구축할 수 있기에 스프링을 사용하여 프로젝트를 진행할때 CI 를 구축하셔서 프로젝트를 진행해보면 좋지 않을까 싶습니다! 궁금한점은 댓글로 남겨주세용

profile
안녕하세요 DevOps 엔지니어로 현업에서 활동중인 요한이라고 합니다.
post-custom-banner

0개의 댓글