본문 바로가기
개발이야기

Github Action 으로 CI workflow 생성해보기(w/ Spring Boot)

by janiiiiie 2021. 10. 5.
반응형

안녕하세요! 제인입니다 :)

 

최근 진행하고 있는 사이드 프로젝트에서 CI를 어떤 툴로 적용을 해볼건지에 대한 논의가 있었는데요, 기존에 익숙하게 사용하던 Jenkins를 택하지 않고 새롭게 Github Action 을 사용하게 되었습니다. 

 

 

Github Action을 사용하게 된 이유?

 

젠킨스로 CI/CD 를 구축해보신 적이 있으시다면 아시겠지만, 젠킨스를 작동시키기 위해서는 서버가 필요합니다. 서버는 생성할 때마다 돈이 들기 때문에 개발자들의 공통 고민거리가 아닐 수 없습니다. 실제로 작은 프로젝트 하나를 젠킨스에 올린 적이 있었는데, 생각보다 젠킨스를 사용할려면 사이즈가 제법되는 서버를 받아야지 원활히 이용할 수 있었습니다.(비싸...ㅠ)

 

당시에는 그래도 가장 많이 쓰고있고, 오픈소스이며 처음 접해보는 CI/CD 툴이기 때문에 젠킨스를 사용했지만, 서버 비용 부담과 생각보다 부족한 레퍼런스, 안 이쁜(?) UI, 그로인해 구축하기 힘든 환경이라는(개인적인 의견입니다! ^^..) 이유를 들어 이 네가지를 어느정도 해결할 수 있는 Github Action 을 채택하게 되었습니다. 

 

 

 

Github Action CI 구축 시작!

현재 제가 진행한 프로젝트의 스펙입니다. 참고부탁드립니다.

  • Spring Boot 2.4.x
  • Gradle
  • H2 (빌드 및 테스트 수행 시 사용)

 

자신의 프로젝트 디렉토리 최상단에 .github 패키지를 만듭니다.

그 하위에 workflow 폴더를 만들고, 원하는 이름의 .yml 파일을 생성합니다. 

 

 

 

name: CI Test

on:
  push:
    branches:
      - 'feature/*'
  pull_request:
    branches:
      - 'feature/*'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2

      - name: Set up JDK 1.8
        uses: actions/setup-java@v1
        with:
          java-version: 1.8

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

      - name: Build with Gradle
        run: ./gradlew build -x test

      - name: Test with Gradle
        run: SPRING_PROFILES_ACTIVE=[test] ./gradlew test

      - name: Publish Unit Test Results
        uses: EnricoMi/publish-unit-test-result-action@v1
        if: ${{ always() }}
        with:
          files: build/test-results/**/*.xml

CI 용으로 만든 yml 파일에 jobs를 정해줍니다. steps: 하위 부터 단계별로 CI가 진행됩니다. 저는 feature 브랜치에 한해서만 CI가 돌수 있도록 설정해주었습니다. 

 

 

Set Up JDK 1.8

빌드 시, 소스코드 컴파일이 진행되는데 이 때 필요한 JDK를 명시해주도록 합니다. 저는 아직 8버전을 사용하고 있어 1.8로 써주었지만, 11도 안정성이 많이 높아져 11버전을 쓰는 분들도 꽤 많이 봤습니다.

 

Grant execute permission for gradlew 

Gradle 빌드 시 사용할 명령어에 대해 권한을 부여해주도록 합니다. (당연한 소리겠지만 제대로 부여하지 않는다면 gradlew 명령어가 안먹힐 수도 있겠죠..?)

 

Build with Gradle

이제 Gradle을 사용해 프로젝트 빌드를 수행하도록 합니다. 빌드 시에는 테스트까지 수행할 필요가 없기 때문에 테스트는 스킵할 수 있도록 -x test  를 꼭 붙여주도록 합니다.

 

Test with Gradle

이 스탭부터 작성한 단위테스트가 있다면 테스트를 자동으로 수행해줍니다. 테스트를 돌릴 시, ApplicationTest 파일 내 선언된 @SpringBootTest 어노테이션 때문에 DB 커넥션 정보를 찾게 되는데요, 이 때 커넥션 정보가 없어 에러가 나는 것을 방지하기 위해 test/resources 디렉토리 하위에 application.yml 파일을 새로 생성하도록 합니다.

 

spring:
  jpa:
    database-platform: org.hibernate.dialect.H2Dialect

app:
  auth:
    tokenSecret: secretkeysecretkeysecretkeysecretkeysecretkeysecretkey
    tokenExpiry: 2592000000

 

 

Gradle 의존성 내 h2 관련이 추가가 되어있다면, 스프링이 실행될 때 자동으로 메모리 버전으로 올리고 내린다고 합니다. database-platform 을 설정한 이유는 JPA관련 설정인 JpaRepository로 인한 것으로 해당 설정을 넣지 않으면 오류가 NPE가 발생합니다.

 

저희는 JWT 토큰 기반으로 로그인 작업을 진행하고 있rh tokenSecret값을 주입받는 부분이 있기 때문에 가짜 tokenSecret키를 입력해주었습니다.

 

 

Publish Unit Test Result

이 스탭은 제가 커스텀하게 지정해준 부분인데요, 모든 steps가 종료되었다면, 단위테스트가 어떤게 실패했는지 또는 성공했는지에 대해 결과를 pull request 창에 남겨주는 기능입니다.

 

이렇게 보여준다면, 어느 부분에서 테스트가 실패했는지/성공했는지 한눈에 파악하기 좋을 것 같아 추가해두었습니다 :)

 

 

 

CI workflow 구동시켜보자!

해당 파일을 내 원격 레파지토리에 푸시를 해주도록 합니다. 그렇다면 깃허브 액션이 자동으로 workflow를 캐치해 CI를 동작시켜 줍니다

 

다행히 잘 동작하는군요

자동으로 내가 원하는 브랜치에 대해 수행을 시켜주고, 어떻게 동작을 했는지 로그도 파악하기 용이합니다. 젠킨스 사용할 땐 Github credential 이며 토큰이며... 설정해야할게 너무많았는데 Github Action은 그런게 없고 푸시하거나 PR 오픈하는것만 잘 하면(?) 되서 너무너무 편했다는게 제 후기 입니다.

 

여러분들도 젠킨스가 불편했다거나, 젠킨스 셋팅이 너무 어려워 난 못하겠는데!!! 라고 생각을..하신다면 Github Action으로 구성해보시는 것을 강력히 추천드립니다!

 

 

https://github.com/Jane096

 

Jane096 - Overview

Make it count! Jane096 has 5 repositories available. Follow their code on GitHub.

github.com

 

반응형