개발 기술/개발 이야기

내 조직의 리뷰 할당 현황 구하기(3) - github actions로 메시지 스케쥴링하기

by GicoMomg 2023. 7. 9.

0. 들어가기에 앞서

  • 앞선 두 포스팅에서 Github API와 discord webhook로 내 조직의 리뷰 할당 현황을 구해보았다.
  • 이번 시간에는 “내 조직의 리뷰 할당 현황 구하기”의 마지막으로, github actions를 사용해 리뷰 할당 현황을 매일 일정 시간 디스코드 채널로 전송해보겠다.
  • 이번 포스팅을 읽게 되면 github actions의 스케쥴링 기능으로 일정 시간에 스크립트를 실행할 수 있게 된다.

😎 시리즈 순서
(1) github API로 내 조직의 리뷰 할당 현황 구하기(포스팅 링크)
(2) discord webhook을 사용하여 discord 채널에 할당 현황 데이터를 전송하기(포스팅 링크)
(3) github actions로 discord webhook 주소에 자동으로 할당 현황 메시지 전송하기



1. github actions로 일정 시간에 메시지 전송하기

1) github actions의 스케쥴링 기능이란?

  • GitHub Actions는 지정된 cron에 따라 워크플로우를 자동화할 수 있는 예약 기능을 제공한다.
  • 이 스케쥴링 기능을 사용하면 일정 시간마다 스크립트를 실행할 수 있는데, 유의할 점은 cron이 UTC 기준이라는 것이다!
  • UTC 기준 0:00이 한국 시간으로 9:00이므로, 만약 매일 오전 9시에 스크립트를 실행하고 싶다면 cron0 0 * * *을 설정해야 한다.
name: cron schedule
on:
  schedule:
    - cron: "0 0 * * *"        # utc time
...

 

  • 더 자세한 cron 표현식의 사용 방법은 Crontab.guru에서 확인할 수 있다.



2) github actions로 메시지 자동 전송 코드 작성하기

(1) 액션에 사용할 환경 변수 저장하기

  • 우리는 이전 두 포스팅(github API 처리, github webhook 전송)에서, webhook 메시지 전송에 필요한 환경변수를 .env에 저장했다.
// .env

AUTH_TOKEN=어쩌구_저쩌구
HOOK_URL=어쩌구_저쩌구
ORG=어쩌구_저쩌구

 

  • 하지만 .env.gitignore파일에 지정되어 있기에 실제로 깃헙 사이트에는 .env 파일이 존재하지 않는다.
// .gitignore

node_modules
.env

 

  • 그렇다면 액션을 실행하는 과정에서 이 환경변수들은 어떻게 접근할 수 있을까?
  • 방법은 간단하다! 바로 레포 > [Settings] > [Secrets and Variables] > [Actions]에 들어가서 .env에 저장했던 환경변수값을 secrets에 추가 해주는 것이다!

  • secrets에 값을 저장하면 해당 값을 액션 과정에서 사용할 수 있으며 외부로 노출되지 않는 장점이 있다.

 

(2) action 파일 생성하기

  • actions 관련 파일은 .github/workflows에서 관리되어야 하므로, 우선 .github/workflows를 생성한다.
  • 그 다음 .github/workflows 폴더 안에 스케쥴링 액션용 파일(main.yml)을 생성한다.

 

(3) 스케쥴링 코드 작성하기

  • 우리는 매일 9시경에 discord로 메시지를 전송하고 싶기에,
  • schedule 이벤트에서 cron 스케줄을 매일 UTC기준 0:00에 실행되도록 지정하면 된다.
  • cron 스케쥴은 UTC 기준이므로 실제 한국 시간으로는 0:00이 9:00이라고 보면 된다.
name: run discord bot
on:
  schedule:
    - cron: "0 0 * * *"        # utc time
...

 

그 다음 실행하고 싶은 스크립트를 추가해주자!
각 코드에 대한 설명은 테이블에 상세히 작성해두었다. (액션 코드 보기)

...

jobs:
  cron:
    runs-on: ubuntu-latest           # (1) ubuntu 환경에서 실행
    timeout-minutes: 3               # (2) job의 시간 제한을 3분으로 지정 
    steps:
      - name: Checkout               # (3) 레포의 최신 코드를 체크아웃
        uses: actions/checkout@v2
      - name: Setup Node             # (4) Node.js 환경 설정
        uses: actions/setup-node@v1
        with:
          node-version: "16.x"

      - name: Install dependencies   # (5) 디펜더시 설치
        run: yarn install --prefer-offline

      - name: Generate Environment Variables File  # (6).env파일에 환경변수 생성
        run: |
          echo "ORG=$ORG" >> .env
          echo "AUTH_TOKEN=$AUTH_TOKEN" >> .env
          echo "HOOK_URL=$HOOK_URL" >> .env
        env:
          ORG: ${{ secrets.ORG }}
          AUTH_TOKEN: ${{ secrets.AUTH_TOKEN }}
          HOOK_URL: ${{ secrets.HOOK_URL }}

      - name: Run bot                # (7) 명령을 실행하여 Discord로 메시지 전송
        run: yarn serve
순서  설명
(1)  - 액션을 우분투 환경에서 실행하도록 설정한다.
(2)  - job의 시간 제한을 3분으로 지정하여, 3분을 초과할시 액션 실행을 중단시킨다.
 (timeout-minutes 설명 포스팅)
(3)  - actions/checkout@v2을 사용하여 리포지토리의 최신 코드를 체크아웃한다.
(4)  - actions/setup-node@v1을 사용하여 Node.js 환경을 설정한다.
 - Node.js 버전은 16.x로 지정된다. (꼭 16이 아니라 lts 버전 노드로 해도 됨)
(5)  - yarn install --prefer-offline 명령을 실행하여 디펜더시를 설치한다.
(6)  - .env 파일에 환경 변수를 생성하는 단계이다.
 - secrets에 저장된 ORG, AUTH_TOKEN, HOOK_URL 값을 .env 파일에 임시 저장한다.
(7)  - yarn serve 명령을 실행하여 디스코드로 메시지 전송한다.

 

  • 이렇게 액션을 작성하면 매일 9시경에 스크립트가 실행되어, 디스코드로 메시지가 오는 걸 확인할 수 있다!




2. 마치며…

  • 내 조직의 리뷰 할당 현황 구하기”의 마지막 포스팅으로, Github Actions의 스케쥴링 기능을 사용해 매일 특정 시간마다 메시지를 전송하는 방법을 알아보았다.
  • 스케쥴링 처리 과정에서 유의할 점은 cron이 UTC 기준이기에 한국시간으로 맞추기 위해선 9시간을 빼줘야 의도한 시간에 스크립트를 돌릴 수 있다는 점이다.
  • 또한 실제로 스케쥴링을 돌린 결과, 정확히 9:00에 메시지가 오기보다는 9:00 ~ 9:30 사이에 스케쥴링이 실행되었다. 스케쥴링에 시간오차가 있는 듯 한데, 넉넉잡아 30분정도 오차가 있다고 인지하면 좋을 듯 하다.
  • 시리즈에서 작성했던 모든 코드는 이 레포에서 확인 가능하다.
반응형

댓글