github action cron 을 이용한 주기적 작업 실행과 한계
프로젝트 루트에 .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
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번밖에 실행되지 않았고 그 간격도 들쭉날쭉하다.
github action docs를 보면 '깃헙 워크플로 실행이 많은 시간에는 작업이 지연되거나 대기 중인 작업이 삭제될 수 있다' 라고 되어 있다.
따라서 위 예제처럼 분 단위로 자주 호출하거나 특정 시간에 정확히 실행되어야 하는 작업의 경우에 github action cron을 이용한 스케쥴링은 적합하지 않다.
매일 0시 0분에 실행하는 작업(딜레이되어도 상관 없음)처럼 실행 주기가 길고, 어느 정도 밀려도 되는 작업의 경우에 사용해야 한다.