본문 바로가기
스프링/만들면서 배우는 실무 백엔드 개발

14. GitHub Action 에서 스프링 배치 실행하기

by kdohyeon (김대니) 2023. 8. 8.
반응형

지난 시간에 SpringBatch 5 를 기반으로 배치잡을 만들었습니다 (관련 포스팅). 보통 배치잡은 젠킨스 (Jenkins) 등의 별도 스케줄러를 통해 실행시키게 됩니다. 하지만 젠킨스를 활용하려면 젠킨스를 위한 별도의 서버를 두거나 로컬에 띄워두어야 하는 번거로움이 있습니다. 이번 시간에는 GitHub Action 을 활용하여 별도 서버를 두지 않고, 스프링배치를 활용하는 방법에 대해 알아보겠습니다.


GitHub Action 이란?

GitHub Action 은 배포를 위한 CI/CD, 빌드 테스트, 스크립트 실행 등 워크플로우 (workflow) 를 자동화시켜주는 툴입니다. Public 저장소의 경우는 무료이고, Private 저장소는 일정 시간까지만 무료로 제공됩니다. GitHub Free 요금제는 한 달에 2,000분을 사용할 수 있습니다. (자세한 내용은 여기를 참조)

Github Action 이해하기

GitHub Action 을 활용하기 위해서는 관련 개념을 알아야 합니다. 관련 개념으로는 event, workflow, jobs, steps, action 이 있습니다.

Repository 내 특정 event 가 발생했을 때 GitHub Action workflow 가 실행됩니다. Workflow 는 하나 이상의 jobs 로 구성되며 순차적으로 또는 동시에 실행될 수 있습니다. 각 job 은 다시 하나 이상의 steps 로 구성될 수 있고, 여기에 원하는 action 을 정의하면 됩니다.

Workflow

Workflow 는 하나 이상의 jobs 를 실행하는 자동화된 프로세스로 YAML 파일에 정의됩니다. 해당 workflow 는 특정 event 에 의해 실행됩니다. Workflow 는 repository 내 .github/workflows 디렉토리에 저장되고, repository 에는 여러 개의 workflows 를 저장할 수 있습니다.

Event

Event 는 repository 내에 발생하는 특정 activity 로 workflow 를 실행시킵니다. cron job 기반의 스케줄링이나 pull request 가 생성되거나 또는 사용자가 직접 event 를 생성할 수도 있습니다.

Jobs and Steps

Job 과 step 은 workflow 를 구성하는 요소로써 하나의 job 은 하나 이상의 step 으로 구성되어 있습니다.

Workflow 생성하기

GitHub Action 의 workflow 를 생성하려면 먼저 repository 로 접근합니다. Repository 내 Actions 라는 메뉴를 클릭합니다.

Actions 버튼

New workflow 를 클릭합니다.

New workflow

배포 workflow, CI workflow 등 다양한 workflow 를 정의할 수 있습니다.

다양한 workflow

또는 직접 YAML 파일을 정의할 수도 있는데, 화면 중앙의 set up a workflow yourself 를 클릭합니다. Workflow 설명처럼 .github/workflows 디렉토리에 저장되게 되며, 파일 이름은 직접 설정할 수 있습니다.

코드를 입력할 수 있는 부분에 아래 코드를 붙여넣습니다.

name: 가상화폐 시세 데이터 조회

on:
  schedule:
    - cron: '0 0,4,8,12,16,20 * * *'
  workflow_dispatch:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Set up JDK 17
        uses: actions/setup-java@v2
        with:
          java-version: '17'
          distribution: 'adopt'
      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
      - name: Build with Gradle
        run: ./gradlew clean :crypto-apps:app-batch:build -x test
      - name: Run batch
        run: java -jar -Dspring.batch.job.names=fetchUpbitTickerBatchJob ./crypto-apps/app-batch/build/libs/app-batch-1.0-SNAPSHOT-boot.jar
참고로 해당 스크립트가 동작하려면 먼저 스프링배치 어플리케이션을 하나의 jar 파일로 빌드할 수 있도록 사전 작업이 되어 있어야 합니다.

name 에 workflow 의 이름을 설정하고, on.schedule.cron 으로 실행할 스케줄을 설정할 수 있습니다. workflow_dispatch 는 매뉴얼하게 사용자가 직접 배치를 실행할 수 있도록 해줍니다.

Jobs 와 steps 로 구성되어 있고, 각 단계에서

  • java17 설정
  • gradle 관련 설정
  • 스프링 배치 어플리케이션을 jar 파일로 빌드
  • 배치 실행

순으로 동작합니다.

배치 결과

해당 스프링배치는 4시간에 한번씩 업비트에서 데이터를 조회하여 가상화폐 시세를 슬랙으로 전송해주는 기능을 포함하고 있습니다.

슬랙으로 전달받는 업비트 데이터

별도의 서버를 두지 않아도 GitHub Action 을 활용하여 원하는 알림을 전달받을 수 있습니다.

무료 버전으로 사용하면 얼마나 실행할 수 있을까?

무료 버전에 private 한 리포지토리로 사용 중이라서 GitHub 정책에 따라 한 달에 2,000분 사용이 가능합니다. 제가 구현한 스프링배치 잡의 경우에는 빌드 포함 실행 시간이 약 3분정도 소요되기 때문에 한 달에 666번 실행할 수 있습니다. 하루 기준으로 최대 22번까지 실행할 수 있기 때문에 한 시간에 한번 정도꼴로 실행할 수 있겠네요.

3분정도 소요되는 스프링배치

기타

그리고 GitHub Action 스케줄링이 좀 이상한건지 분명 0시, 4시, 8시 등으로 설정해두었는데 실제 배치가 실행되는 시간과는 1-2시간정도의 지연이 좀 있는 것 같습니다.

레퍼런스

공식 레퍼런스: https://github.com/features/actions

반응형

댓글