같이 프로젝트를 진행하는 후배에게 경험도 할겸 스프링 CI 를 맡겨봤는데 Spring 자체를 잘 모르다보니 어려움이 있는 것 같아 과정과 방법을 정리하려고 이 글을 작성하게됐다. 깃허브 액션을 어느정도 다룰 수 있다는 가정하에 글을 진행하도록 하겠다.
CI가 뭔가요? : 여기 를 보고 오시면됩니당
CI를 적용시킬 레포지토리에 들어가면 Actions 라는 탭이 보일 것이다. 클릭해주고 프로젝트에 사용하는 빌드 도구를 선택해준다. gradle을 많이 사용한다고 판단하여 이 글에선 gradle 로 진행하도록 하겠다. java with gradle 을 configure 해주자.
생성을 한다면 .github/workflow/gradle 모시깽모시깽.yml
이런식으로 생성이 될텐데 해당 경로에서만 workflow 파일들을 인식하니 알아두자.
내가 작성한 스크립트는 아래와 같다.
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
: on 아래로 있는 조건들을 만족하면 워크플로우가 실행된다. 여기선 master 브랜치로 푸쉬를 하거나 모든 브랜치에서 pr 이 열렸을때 이 워크플로우를 실행시켜준다.
name: Spring Boot & Gradle CI/CD
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "*" ]
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
: 작업들을 정의하여준다. build
라는 작업을 실행할 것이다.
runs-on
: 이 작업을 진행할 os 를 말한다. swift가 아니면 보통 우분투 환경에서 돌리는 것
jobs:
build:
runs-on: ubuntu-latest
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 를 구축하셔서 프로젝트를 진행해보면 좋지 않을까 싶습니다! 궁금한점은 댓글로 남겨주세용