GitHub Action 사용해서 주기적으로 Python 실행

JINJIN·2023년 5월 12일
2

GitHub

목록 보기
1/2
post-thumbnail

GitHub Action을 사용하여서 자동화된 Python 코드를 실행해봅니다!

😤 개요

저는 포트폴리오 홈페이지를 작업하던 중 Velog 게시물을 최근 게시물 순으로 가져올 수 있으면 좋겠다고 생각하여 열심히 찾아보고 있었습니다!

그리고 파이썬을 사용하여서 제 Velog 게시물들을 크롤링할 수 있는 코드를 제작하였습니다. 하지만 다른 문제가 있었으니 최근 게시물을 계속 업데이트할려면 파이썬 코드가 실시간으로 실행되어야 하는 점!

간단한 리소스를 사용하기 위해 서버를 계속 구동하기는 조금 그렇죠 ㅎㅎ...
그래서 무료 서비스를 찾아보다가 딱 맞는 서비스를 찾았습니다! 바로 GitHub Action


🧐 GitHub Action이란?

GitHub Actions는 GitHub에서 Continuous Integration (CI) 및 Continuous Deployment (CD) 워크플로우를 자동화하기 위한 도구입니다.

이를 사용하면 소스 코드가 변경될 때마다 빌드, 테스트, 배포와 같은 작업을 자동으로 수행할 수 있습니다.


😎 GitHub Action을 작동해보자

그렇다면 이제부터 하나씩 진행해보겠습니다!

1. 레포지토리 생성

저는 action_test라는 레포지토리를 생성하였습니다~

2. 레포지토리에 준비한 파이썬 코드 푸시

이렇게 블로그 크롤링을 위해 작성한 파이썬 코드를 레포지토리에 푸시하였습니다.
그리고 상단 메뉴에 액션 메뉴탭을 클릭합니다.

3. 워크플로우 설정

액션 메뉴탭을 클릭하면 이런 화면이 나옵니다!
저희는 직접 워크플로우 설정을 하기 위해 set up a workflow yourself를 클릭해줍니다!

워크플로우는 저장소에서 자동화할 작업의 프로세스를 정의합니다. 이것은 일련의 작업으로 구성되며, 특정 이벤트(예: 푸시, 풀 리퀘스트, 이슈 생성 등)에 의해 트리거됩니다.

워크플로우 파일은 저장소의 .github/workflows 디렉토리에 위치하며, YAML 형식으로 작성됩니다.

다른 방법으로는 직접 .github/workflows 디렉토리를 생성하고 그 안에 새 YAML 파일을 만드는 방법도 있습니다! (예시 - github/workflows/run_python_code.yml)

워크플로우 작성하는 페이지로 들어오면 이런 화면이 나옵니다!
상단 박스에는 해당 워크플로우의 이름을 작성, 하단 큰 박스에는 워크플로우 코드를 작성하는 공간입니다.

우선 저는 파이썬 코드를 구동하는 워크플로우이기에 이름은 run_python_code.yml 으로 작성하였습니다.

워크플로우 주요 기능

워크플로우를 작성하기 위한 주요 기능을 알아봅시다!

  • name
    • 워크플로우의 이름을 설정합니다.
      이 이름은 GitHub Actions 탭에서 워크플로우 목록에 표시됩니다.

  • on
    • 워크플로우를 실행할 트리거를 정의합니다.
      다양한 이벤트에 대해 워크플로우를 실행할 수 있습니다. 예를 들어, push, pull_request, schedule, workflow_dispatch 등이 있습니다.

  • jobs
    • 워크플로우에서 실행되는 작업들을 정의합니다.
      각 작업은 병렬로 실행되며, 서로 다른 머신에서 실행할 수 있습니다.

  • runs-on
    • 작업을 실행할 가상 환경을 설정합니다.
      예를 들어, ubuntu-latest, windows-latest, macos-latest 등이 있습니다.

  • steps
    • 작업 내에서 실행되는 개별 단계를 정의합니다. 각 단계는 순서대로 실행됩니다.

  • uses
    • 외부 GitHub Actions을 가져와 사용할 수 있습니다.
      예를 들어, 저장소를 체크아웃하거나 Python 환경을 설정하는데 사용됩니다.

  • with
    • 외부 GitHub Actions에 인자를 전달할 때 사용합니다.

  • if
    • 조건부로 단계를 실행할 수 있습니다. 조건이 참일 때만 해당 단계가 실행됩니다.

  • env
    • 작업의 환경 변수를 설정합니다.
      이 변수들은 작업 내의 모든 단계에서 사용할 수 있습니다.

  • secrets
    • GitHub Secrets에 저장된 민감한 정보를 사용할 수 있습니다.
      이를 통해 워크플로우에 중요한 정보를 안전하게 전달할 수 있습니다.

이 외에도 여러 가지 기능이 있지만 일단은 이 정도만 알아도 충분합니다!
그리고 아래는 제가 파이썬 코드를 하루마다 작동할 수 있게 작성한 워크플로우 코드입니다!

name: Run Python Code

on:
  schedule:
    - cron: '0 */24 * * *' # 24마다 시간 실행
  workflow_dispatch:

jobs:
  run-code:
    runs-on: ubuntu-latest

    steps:
      - name: Check out repository
        uses: actions/checkout@v2

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

      - name: Install system dependencies
        run: sudo apt-get update && sudo apt-get install -y build-essential libffi-dev

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run Python script
        run: python crawler.py # 이곳에 실제 파이썬 파일명을 적어주세요.

      - name: Commit and push changes
        if: steps.changed-files.outputs.files_changed == 'true'
        run: |
          git config user.name "GitHub Actions"
          git config user.email "actions@github.com"
          git add .
          git commit -m "Update articles.json"
          git push https://${{ secrets.GH_TOKEN }}@github.com/yeonjin1357/action_test.git HEAD:main

      - name: Deploy to Cafe24 Web Hosting via FTP
        uses: SamKirkland/FTP-Deploy-Action@v4.3.4
        with:
          server: ${{ secrets.FTP_SERVER }}
          username: ${{ secrets.FTP_USERNAME }}
          password: ${{ secrets.FTP_PASSWORD }}
          server-dir: public_html/www/
          exclude: |
            **/.git*
            **/.git*/**
            **/node_modules/**
        env:
          pythonLocation: /opt/hostedtoolcache/Python/3.11.3/x64
          LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.11.3/x64/lib

위에서부터 차례대로 살펴보겠습니다.

name:

name: Run Python Code

일단 해당 워크플로우가 어떤 작업을 하는지 대략적으로 알 수 있게 nameRun Python Code라고 작성하였습니다!


on:

on:
  schedule:
    - cron: '0 */24 * * *' # 24마다 시간 실행
  workflow_dispatch:

그리고 해당 워크플로우의 트리거는 2개를 설정하였습니다.

schedule은 GitHub Actions 워크플로우를 주기적으로 실행하는 데 사용되는 트리거입니다.
cron 표현식을 사용하여 원하는 주기를 정의할 수 있습니다.

※ 크론 표현식을 자세히 알고 싶다면 해당 링크 참조

workflow_dispatch는 워크플로우를 직접 수동으로 실행할 수 있는 트리거입니다.
해당 워크플로우를 선택하고 Run workflow 버튼을 클릭하여 실행할 수 있습니다.


runs-on:

  run-code:
    runs-on: ubuntu-latest

runs-on는 GitHub Actions 워크플로우가 실행될 가상 환경을 지정하는 설정입니다.
여기서 ubuntu-latest최신 버전의 Ubuntu 가상 머신을 의미합니다.
워크플로우가 실행되면, 이 가상 머신 위에서 모든 작업이 수행됩니다.


steps:

위에서부터 하나씩 살펴보겠습니다!

   - name: Check out repository
     uses: actions/checkout@v2

저장소를 체크아웃합니다.
actions/checkout@v2는 GitHub Actions에서 제공하는 공식 액션으로, 워크플로우가 실행되는 가상 환경에 저장소를 복사합니다.


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

actions/setup-python@v2를 사용하여 워크플로우 환경에 Python을 설정합니다.
해당 워크플로우에서는 Python 3.x 버전을 사용합니다.


     - name: Install system dependencies
       run: sudo apt-get update && sudo apt-get install -y build-essential libffi-dev

가상 환경에 필요한 시스템 종속성을 설치합니다.
여기서는 build-essentiallibffi-dev 패키지를 설치합니다.


     - name: Install Python dependencies
       run: |
         python -m pip install --upgrade pip
         pip install -r requirements.txt

파이썬 종속성을 설치합니다.
미리 준비해둔 requirements.txt 파일에 나열된 모든 패키지를 설치합니다.


     - name: Run Python script
       run: python crawler.py # 이곳에 실제 파이썬 파일명을 적어주세요.

파이썬 스크립트를 실행합니다.
해당 단계에서 처음에 레포지토리에 푸시해놓은 웹 크롤링 파이썬 코드인 crawler.py를 실행합니다.


     - name: Commit and push changes
       if: steps.changed-files.outputs.files_changed == 'true'
       run: |
         git config user.name "GitHub Actions"
         git config user.email "actions@github.com"
         git add .
         git commit -m "Update articles.json"
         git push https://${{ secrets.GH_TOKEN }}@github.com/yeonjin1357/action_test.git

해당 단계에서는 변경된 파일이 있는지 확인하고, 변경된 파일이 있으면 GitHub 저장소에 커밋하고 푸시하는 작업을 수행합니다.

그리고 if문을 사용하여서 변경된 파일이 확인되었을 경우에만 이 단계를 실행하도록 합니다.


     - name: Deploy to Cafe24 Web Hosting via FTP
       uses: SamKirkland/FTP-Deploy-Action@v4.3.4
       with:
         server: ${{ secrets.FTP_SERVER }}
         username: ${{ secrets.FTP_USERNAME }}
         password: ${{ secrets.FTP_PASSWORD }}
         server-dir: public_html/www/
         exclude: |
           **/.git*
           **/.git*/**
           **/node_modules/**

마지막으로 이 단계에서는 변경된 파일을 FTP를 통해 웹 호스팅 서버에 업로드하는 작업을 수행합니다. SamKirkland/FTP-Deploy-Action@v4.3.4 이라는 액션을 사용하였습니다!

워크플로우 코드를 모두 작성했다면 우측 상단에 Commit changes 버튼을 클릭하여 작성을 마무리합니다!

그리고 레포지토리를 다시 확인해보면 이렇게 github/workflows 폴더가 생긴 것을 확인할 수 있습니다.

이렇게 나온다면 워크플로우 코드도 문제없이 작성되어 정상적으로 GitHub Action이 작동한 것입니다 😤


😊 요약

GitHub Actions는 GitHub에서 직접 CI/CD 및 자동화 작업을 수행할 수 있는 기능입니다.

빌드, 테스트, 배포와 같은 일련의 작업들을 워크플로우라는 단위로 정의하고, 이 워크플로우들은 YAML 파일 형식으로 저장소에 저장됩니다.

워크플로우는 다양한 이벤트(예: 푸시, 풀 요청, 스케줄)에 따라 자동으로 실행될 수 있으며, 필요한 경우 사용자 정의 액션을 사용하여 작업을 확장할 수도 있습니다.

profile
안녕하세요! 배우는 것을 좋아하는 개발자 JINJIN입니다.

0개의 댓글