기타 컴퓨터 지식

github action cron 을 이용한 주기적 작업 실행과 한계

Satisfaction 2024. 10. 13. 01:36

 

프로젝트 루트에 .github/workflows 폴더 안에 yml 파일을 추가하여 github action을 추가할 수 있다.

 

github action을 이용해 특정 브랜치에 푸쉬가 발생했을 때 작업을 정의하는 등 자동화에 이용할 수 있다.

 

cron

cron은 특정 시간마다 지정한 스크립트를 실행하는 기능이다.

 

이 기능을 이용해 5분마다 헬스체크를 하는 작업을 생성해볼 것이다.

 

# .github/workflows/health-check.yml

name: health-check

# 어떤 작업을 진행할지?
on:
  schedule:
    - cron: "*/5 * * * *"
# ...

 

이렇게 선언함으로써 매 5분마다 이 action이 실행되도록 할 수 있다.

 

cron 문법은 리눅스에서 crontab과 동일하다.

 

https://satisfactoryplace.tistory.com/310

 

[Ubuntu] Crontab을 이용해 특정 Task 자동화시키기

Crontab Crontab은 특정 시간에 특정 작업을 트리거할수 있게 해 주는 명령어이다. https://jdm.kr/blog/2

satisfactoryplace.tistory.com

 

cron 을 지정해 주었으니 어떤 작업을 실행할지 계속해서 아래에 추가한다

 

# .github/workflows/health-check.yml

name: health-check

# 언제 실행할지?
on:
  schedule:
    - cron: "*/5 * * * *"

# 어떤 작업을 진행할지?
jobs:
  health-check:
    runs-on: ubuntu-latest
    env:
      CI: false
    strategy:
      matrix:
        node-version: [18.19.0]
        
    steps:
      # Checkout repository
      - uses: actions/checkout@v3

      # use nodejs
      - name: Use Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}
          cache: "yarn"
          
      # install node_modules
      - name: Install modules
        run: yarn install
        
      # run cron job
      - name: Run health-check
        run: yarn health-check

 

nodejs로 작성한 코드이기 떄문에 jobs 에 해당 작업을 실행하기 위해 필요한 스크립트들을 작성해 준다.

 

push to default branch

cron을 사용하는 action은 기본 브랜치(기본값: main)에서만 정상적으로 작동한다.

 

따라서 이 github action을 추가/변경하려면 기본 브랜치에 푸쉬해야 한다.

 

한계

분명히 5분마다 실행되도록 설정했지만 실행 로그를 보면 5분마다 실행되지 않는다.

 

 

5분마다 실행되어야 하지만(1시간에 12번) 실제로는 1시간에 4번밖에 실행되지 않았고 그 간격도 들쭉날쭉하다.

 

https://docs.github.com/en/actions/writing-workflows/choosing-when-your-workflow-runs/events-that-trigger-workflows#schedule

 

Events that trigger workflows - GitHub Docs

You can configure your workflows to run when specific activity on GitHub happens, at a scheduled time, or when an event outside of GitHub occurs.

docs.github.com

 

github action docs를 보면 '깃헙 워크플로 실행이 많은 시간에는 작업이 지연되거나 대기 중인 작업이 삭제될 수 있다' 라고 되어 있다.

 

따라서 위 예제처럼 분 단위로 자주 호출하거나 특정 시간에 정확히 실행되어야 하는 작업의 경우에 github action cron을 이용한 스케쥴링은 적합하지 않다.

 

매일 0시 0분에 실행하는 작업(딜레이되어도 상관 없음)처럼 실행 주기가 길고, 어느 정도 밀려도 되는 작업의 경우에 사용해야 한다.