개발 실무

GitHub Actions로 Python 자동화하는 법 — 유튜브 쇼츠 분석을 매일 자동 실행한 실전 후기 (2026)

체리플랜 2026. 4. 27. 15:28
반응형

작성자: 체리플랜 | 7년차 프론트엔드 개발자


코드는 짰는데, 매일 직접 실행하는 게 귀찮아진 적 있지 않으신가요?

저도 그랬어요.
유튜브 쇼츠 분석 스크립트를 Python으로 만들어놨는데, 매일 아침 터미널 열고 직접 돌리는 게 슬슬 번거롭더라고요.
"이거 어차피 정해진 시간에 실행되면 되는 작업인데, 내가 왜 매번 하고 있지?"

그래서 GitHub Actions 써서 자동화해버렸어요.
근데 처음엔 진짜 막막했어요. GitHub Actions가 뭔지는 알겠는데, 어떻게 설정하는지 하나도 몰랐거든요.
secrets 설정, 환경변수, yml 파일 구조 — 전부 처음부터 찾아가며 세팅했어요.

오늘은 그 과정 전부 정리해볼게요.
바이브 코딩으로 Python 스크립트 만들어본 분이라면, 이 글 하나로 자동화까지 끝낼 수 있어요.

 


GitHub Actions가 뭔데요?

한 줄로 요약하면 — GitHub 레포에서 특정 조건이 되면 코드를 자동 실행해주는 기능이에요.

기존에는 이랬어요:

 

  1. 터미널 열기
  2. 레포 폴더로 이동
  3. python main.py 실행
  4. 결과 확인

GitHub Actions 쓰면 이렇게 바뀌어요:

  1. 정해진 시간에 GitHub 서버가 알아서 실행
  2. 나는 아무것도 안 해도 결과가 나와 있음

CI/CD 도구라고 많이 소개되는데, 꼭 배포 자동화에만 쓰는 게 아니에요.
"정해진 시간에 Python 스크립트 돌리기" 같은 단순 자동화에도 완벽하게 쓸 수 있어요.

기존 cron job이나 서버 스케줄러와 다른 점은 — 서버 없이, GitHub 레포 하나만 있으면 된다는 거예요.
클라우드 서버 빌릴 필요 없어요.


실제 프로젝트 구조 — 유튜브 쇼츠 분석 자동화

제가 자동화한 건 유튜브 쇼츠 분석 파이프라인이에요.

  • 관심 채널들의 최신 영상 자동 수집
  • Claude API로 쇼츠 구간 분석
  • 결과를 지정 위치에 자동 저장

이걸 매일 오전 9시 30분에 자동 실행되도록 세팅했어요.

원래는 9시로 했다가 실패가 많았어요.
찾아보니까 GitHub Actions가 많이 몰리는 정각 타임에는 큐 대기가 생겨서 지연되거나 실패하는 경우가 있다고 하더라고요.
그래서 9시 30분(cron 기준 30 0 * * * UTC) 으로 옮겼더니 훨씬 안정적으로 돌아갔어요.

💡 핵심 팁: 정각(0분, 30분)보다 :15, :45 같은 비정각 타임이 더 안정적이에요.
저는 지금은 15 0 * * * (UTC 기준 오전 9시 15분 KST)로 세팅해서 쓰고 있어요.


세팅하는 법 — 처음부터 따라하기

Step 1. 레포 구조 확인

my-repo/
├── .github/
│   └── workflows/
│       └── daily-run.yml   ← 이 파일이 핵심
├── main.py
├── requirements.txt
└── README.md

.github/workflows/ 폴더가 없으면 직접 만들어야 해요.
GitHub 웹에서 만들어도 되고, 로컬에서 만들어서 push해도 돼요.


Step 2. requirements.txt 준비

GitHub Actions 서버는 내 로컬 환경이 아니에요.
아무것도 설치된 게 없는 깨끗한 서버예요.

그래서 내 스크립트가 쓰는 패키지를 전부 명시해줘야 해요.

anthropic
google-api-python-client
python-dotenv
requests

로컬에서 이미 쓰고 있다면:

pip freeze > requirements.txt

이 명령어로 한 번에 뽑을 수 있어요.


Step 3. .yml 파일 작성 — 핵심 단계

name: Daily YouTube Shorts Analysis

on:
  schedule:
    - cron: '15 0 * * *'  # 매일 KST 오전 9시 15분 (UTC 00:15)
  workflow_dispatch:       # 수동 실행도 가능하게

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

    steps:
      - name: 레포 체크아웃
        uses: actions/checkout@v3

      - name: Python 세팅
        uses: actions/setup-python@v4
        with:
          python-version: '3.11'

      - name: 패키지 설치
        run: pip install -r requirements.txt

      - name: 스크립트 실행
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
          YOUTUBE_API_KEY: ${{ secrets.YOUTUBE_API_KEY }}
        run: python main.py

workflow_dispatch 꼭 넣으세요.
이게 있어야 GitHub 웹에서 수동으로 "지금 바로 실행" 버튼을 누를 수 있어요.
테스트할 때 진짜 유용해요.


Step 4. Secrets 등록 — 제일 헷갈리는 부분

API 키 같은 민감한 정보는 코드에 직접 넣으면 안 돼요.
GitHub Secrets에 등록해두고, yml에서 ${{ secrets.키이름 }} 형태로 불러와요.

등록 방법:

  1. GitHub 레포 → Settings
  2. 좌측 메뉴 → Secrets and variablesActions
  3. New repository secret 클릭
  4. Name: ANTHROPIC_API_KEY / Value: 실제 API 키 입력
  5. Add secret 클릭

그리고 main.py에서는 이렇게 불러오면 돼요:

import os

api_key = os.environ.get("ANTHROPIC_API_KEY")

로컬에서 개발할 때는 .env 파일에 넣고 python-dotenv로 불러오면 되고,
GitHub Actions에서 실행될 때는 env: 블록에서 secrets를 주입해주는 구조예요.


Step 5. 실행 확인

push하고 나서 확인하는 방법:

  1. GitHub 레포 → Actions
  2. 왼쪽에 워크플로우 이름 보임
  3. 클릭하면 실행 기록, 로그, 에러 전부 확인 가능

실패했을 때 로그 보는 게 처음엔 낯선데, 익숙해지면 에러 메시지 보고 바로 수정할 수 있어요.


실제로 겪은 에러들

① secrets 이름 오타

yml에서 ANTHROPIC_API_KEY로 쓰고, Secrets에는 ANTHROPIC_APIKEY로 등록한 적 있어요.
대소문자 + 언더스코어 정확히 맞춰야 해요.

② Python 버전 불일치

로컬은 3.12인데 yml에 3.9로 쓰면 문법 차이로 에러 날 수 있어요.
python --version으로 로컬 버전 확인하고 맞춰주세요.

③ 정각 cron 실패

앞서 말한 것처럼 0 0 * * * (자정 UTC = KST 오전 9시 정각)으로 했더니 간헐적 실패.
:15 또는 :45로 바꾸면 해결돼요.

④ 패키지 설치 누락

로컬에 이미 깔려있어서 requirements.txt에 안 넣은 패키지가 있으면
Actions 서버에서 ModuleNotFoundError 뜨면서 터져요.
pip freeze > requirements.txt 한 번 더 돌려서 확인하세요.


솔직한 한계

  • 무료 플랜은 월 2,000분 제한 있어요. 매일 1회 실행이면 충분하지만, 무거운 작업은 금방 소진돼요.
  • 실행 시간 보장 안 됨 — cron이 정확히 그 시간에 실행된다는 보장이 없어요. 몇 분 늦어질 수 있어요.
  • 디버깅이 느려요 — 로컬에서 바로 되는 것도 Actions에서 안 되면, 매번 push해서 로그 확인해야 해요. act 같은 로컬 테스트 툴 쓰면 조금 나아져요.
  • 외부 서비스 의존 — GitHub 서버 장애 나면 그냥 안 돌아가요. 크리티컬한 작업엔 별도 서버 쓰는 게 맞아요.

마무리: GitHub Actions의 본질

GitHub Actions는 "배포 자동화 도구"가 아니에요.
**"코드로 만든 모든 반복 작업을 없애주는 도구"**예요.

Python 스크립트 하나만 있으면, 서버 없이도 매일 정해진 시간에 내 코드가 돌아가요.
처음엔 yml 문법이 낯설게 느껴지지만, 한 번 세팅해놓으면 그다음부터는 그냥 돌아가요.
"내가 왜 이걸 매번 직접 하고 있었지?" 하는 순간이 와요.

바이브 코딩으로 만든 Python 스크립트가 있다면 — 오늘 바로 자동화해보세요.

다음 포스팅 예고: Claude API를 GitHub Actions에서 쓸 때 비용 관리하는 법 — 토큰 제한, 실행 횟수 조절 실전 세팅

 

 


 

반응형