GitHub Action을 사용하여서 자동화된 Python 코드를 실행해봅니다!
저는 포트폴리오 홈페이지를 작업하던 중 Velog
게시물을 최근 게시물 순으로 가져올 수 있으면 좋겠다고 생각하여 열심히 찾아보고 있었습니다!
그리고 파이썬을 사용하여서 제 Velog 게시물들을 크롤링할 수 있는 코드를 제작하였습니다. 하지만 다른 문제가 있었으니 최근 게시물을 계속 업데이트할려면 파이썬 코드가 실시간으로 실행되어야 하는 점!
간단한 리소스를 사용하기 위해 서버를 계속 구동하기는 조금 그렇죠 ㅎㅎ...
그래서 무료 서비스를 찾아보다가 딱 맞는 서비스를 찾았습니다! 바로 GitHub Action
GitHub Actions
는 GitHub에서 Continuous Integration (CI) 및 Continuous Deployment (CD) 워크플로우를 자동화하기 위한 도구입니다.
이를 사용하면 소스 코드가 변경될 때마다 빌드, 테스트, 배포와 같은 작업을 자동으로 수행할 수 있습니다.
그렇다면 이제부터 하나씩 진행해보겠습니다!
저는 action_test
라는 레포지토리를 생성하였습니다~
이렇게 블로그 크롤링을 위해 작성한 파이썬 코드를 레포지토리에 푸시하였습니다.
그리고 상단 메뉴에 액션 메뉴탭을 클릭합니다.
액션 메뉴탭을 클릭하면 이런 화면이 나옵니다!
저희는 직접 워크플로우 설정을 하기 위해 set up a workflow yourself
를 클릭해줍니다!
워크플로우는 저장소에서 자동화할 작업의 프로세스를 정의합니다. 이것은 일련의 작업으로 구성되며, 특정 이벤트(예: 푸시, 풀 리퀘스트, 이슈 생성 등)에 의해 트리거됩니다.
워크플로우 파일은 저장소의 .github/workflows 디렉토리에 위치하며, YAML 형식으로 작성됩니다.
다른 방법으로는 직접 .github/workflows
디렉토리를 생성하고 그 안에 새 YAML 파일을 만드는 방법도 있습니다! (예시 - github/workflows/run_python_code.yml)
워크플로우 작성하는 페이지로 들어오면 이런 화면이 나옵니다!
상단 박스에는 해당 워크플로우의 이름을 작성, 하단 큰 박스에는 워크플로우 코드를 작성하는 공간입니다.
우선 저는 파이썬 코드를 구동하는 워크플로우이기에 이름은 run_python_code.yml
으로 작성하였습니다.
워크플로우를 작성하기 위한 주요 기능을 알아봅시다!
name
on
push
, pull_request
, schedule
, workflow_dispatch
등이 있습니다.jobs
runs-on
ubuntu-latest
, windows-latest
, macos-latest
등이 있습니다.steps
uses
with
if
env
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: Run Python Code
일단 해당 워크플로우가 어떤 작업을 하는지 대략적으로 알 수 있게 name
은 Run Python Code
라고 작성하였습니다!
on:
schedule:
- cron: '0 */24 * * *' # 24마다 시간 실행
workflow_dispatch:
그리고 해당 워크플로우의 트리거는 2개를 설정하였습니다.
schedule
은 GitHub Actions 워크플로우를 주기적으로 실행하는 데 사용되는 트리거입니다.
cron
표현식을 사용하여 원하는 주기를 정의할 수 있습니다.
workflow_dispatch
는 워크플로우를 직접 수동으로 실행할 수 있는 트리거입니다.
해당 워크플로우를 선택하고 Run workflow
버튼을 클릭하여 실행할 수 있습니다.
run-code:
runs-on: ubuntu-latest
runs-on
는 GitHub Actions 워크플로우가 실행될 가상 환경을 지정하는 설정입니다.
여기서 ubuntu-latest
는 최신 버전의 Ubuntu 가상 머신을 의미합니다.
워크플로우가 실행되면, 이 가상 머신 위에서 모든 작업이 수행됩니다.
위에서부터 하나씩 살펴보겠습니다!
- 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-essential
과 libffi-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 파일 형식으로 저장소에 저장됩니다.
워크플로우는 다양한 이벤트(예: 푸시, 풀 요청, 스케줄)에 따라 자동으로 실행될 수 있으며, 필요한 경우 사용자 정의 액션을 사용하여 작업을 확장할 수도 있습니다.