Post

GitHub Action 사용법

본 문서는 GitHub Action을 사용한 데이터 수집 자동화 방법을 담고 있다.

GitHub Action 데이터 수집 자동화에서 전체 코드를 확인할 수 있다.

GitHub Action


Github Action은 github에서 공식적으로 제공하는 CI 및 CD 워크플로우를 자동화하기 위한 툴이다.

CI(Continuous Integration)

  • 빌드, 테스트, 통합, 즉 배포 전까지의 단계 CD(Continuous Delivery)
  • 사용자에게 프로덕트를 전달(배포)하는 단계

활용 예시

  • 배포
    • 서버에 새로운 기능 버전 등을 배포
    • 새로운 글을 등록(GitHub 블로그도 GitHub Action을 사용하여 배포 자동화가 되어 있다.)
  • 작업 스케줄러
    • 코드 실행 자동화
    • 주기적으로 업데이트 되는 데이터 자동 수집 등
  • 코드 테스트

사용 한도

  • 하나의 Repository에 최대 20개의 workflow 등록 가능
  • workflow 내의 Job은 최대 6시간 동안 실행 가능
  • 무료 계정의 저장 용량은 최대 500MB, 실행시간은 최대 2000시간/월

GitHub Actions 구성 요소


Workflow

하나 이상의 작업을 실행하는 자동화된 프로세스이다. YAML 파일에 의해 정의되고, Action을 실행할 Repository의 .github/workflow 폴더 아래에 저장된다.

Event

Workflow를 Trigger(실행)하는 특정 활동이나 규칙이다.

  • 특정 브랜치로 Push/Pull Request
  • 작업 수행을 예약(cron)

Job

Workflow의 일련의 단계로, 가상 환경의 인스턴스에서 단계적으로 실행된다. 각각의 Job은 기본적으로 종속성 없이 서로 병렬로 실행되지만, 다른 작업과 종속적으로 실행도 가능하다.

Step

Job 안에서 순차적으로 실행되는 프로세스의 단위이다.

Action

Job을 구성하기 위한 Step들의 조합으로 구성된 독립적인 명령으로 workflow의 가장 작은 빌드 단위이다. 직접 Action 만들어 사용하거나, 공용 Action을 사용할 수 있다.

Runner

GitHub Action Runner 어플리케이션이 설치된 머신으로, Workflow가 실행될 인스턴스이다.

GitHub Action으로 데이터 수집 자동화


기상청에서 제공하는 지상(종관, ASOS) 일자료 조회서비스 Open API를 사용하여 매일 업데이트 되는 어제의 날씨 데이터를 수집하는 작업을 GitHub Action을 사용하여 자동화하였다.

1. YAML

1
2
3
4
5
name: Update Weather Data

on:
  schedule:
    - cron: '10 17 * * *'
  • name은 Action 탭에 노출되는 Workflow의 이름이다.
  • on 은 Workflow 파일을 자동으로 트리거하는 이벤트를 명시한다.
    • schedule의 cron에 cron 표현식을 작성한다.
    • http://www.cronmaker.com/에서 cron 표현식을 생성할 수 있다.

    • cron 작업 시 지연현상이 발생한다. GitHub에서 많은 사용자의 요청 작업을 순차적으로 수행하면서 발생하는 문제라고 생각된다. 해결 방법은 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout Repository
      uses: actions/checkout@v2

    - name: Set up Python
      uses: actions/setup-python@v2
      with:
        python-version: 3.x

    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install ruff pytest
        if [ -f requirements.txt ]; then pip install -r requirements.txt; fi

    - name: Run Python Script
      run: python update_weather.py
      env:
        WEATHER_API_KEY: $
        MY_GITHUB_TOKEN: $

    - name: Commit and push changes
      run: |
        git config user.email "jyihaan4@naver.com"
        git config user.name "Jung Jaeyoung"

        
        git add ./data_weather/*/*.csv
        git clean -xdf
        git commit -m "Update Data | $(TZ='Asia/Seoul' date +'%Y-%m-%d')"
        git push  
  • Checkout Repository & Set up Python은 사용할 내장된 GitHub Actions 액션을 정의하고 소스 코드 저장소를 가져온다. 그리고 Python 버전을 지정한다.
  • Install dependencies 필요한 패키지를 설치한다.
  • Run Python Script은 Python 파일을 실행한다.
    • 실행할 Python 코드의 경로를 작성한다.
    • env 인자에필요한 환경 변수(GitHub Token, 기상청 Open API Key)를 넘겨준다.
  • Commit and push changes는 변경사항(데이터 추가)을 commit & push 한다.

2. GitHub Token 발급

프로필의 Settings > Developer Settings > Personal access tokens > Tokens (classic) > Generate New token(classic)

그림1

Token의 이름과 만료기한, 필요한 사항들을 선택하고 가장 아래의 Generate Token을 눌러 Token을 발급 받는다.

그림1

발급받은 Token을 복사한다.

그림1

3. GitHub Token 등록

Action을 실행할 Repository의 Settings > Secrets and variables > New repository secret

그림1

발급받은 Token을 붙여넣고, 이 토큰의 이름을 MY_GITHUB_TOKEN: $환경변수에 등록하면 된다.

그림2

4. Workflow 권한 부여

Action을 실행할 Repository의 Settings > Actions > General > Workflow permissions에서 읽기 및 쓰기가 가능하도록 설정한다.

그림1

Workflow 로그 확인

Actions 탭에서 진행상황을 확인할 수 있다. 진행 중이라면 노란색마커, 작업 완료면 초록색마커, 작업 실패면 빨간색마커로 표시된다.

그림1

작업 로그를 확인해 오류 사항을 확인할 수 있으며, 작업을 재실행할 수도 있다.

그림1

결과

YAML에서 설정해둔 python 파일(update_weather.py)이 실행되고, 새로운 데이터가 추가되어 commit message(Update Data | $(TZ='Asia/Seoul' date +'%Y-%m-%d'))와 함께 commit된 것을 확인할 수 있다.

그림!

This post is licensed under CC BY 4.0 by the author.