작성자: 체리플랜 | 7년차 프론트엔드 개발자
코드는 짰는데, 매일 직접 실행하는 게 귀찮아진 적 있지 않으신가요?
저도 그랬어요.
유튜브 쇼츠 분석 스크립트를 Python으로 만들어놨는데, 매일 아침 터미널 열고 직접 돌리는 게 슬슬 번거롭더라고요.
"이거 어차피 정해진 시간에 실행되면 되는 작업인데, 내가 왜 매번 하고 있지?"
그래서 GitHub Actions 써서 자동화해버렸어요.
근데 처음엔 진짜 막막했어요. GitHub Actions가 뭔지는 알겠는데, 어떻게 설정하는지 하나도 몰랐거든요.
secrets 설정, 환경변수, yml 파일 구조 — 전부 처음부터 찾아가며 세팅했어요.
오늘은 그 과정 전부 정리해볼게요.
바이브 코딩으로 Python 스크립트 만들어본 분이라면, 이 글 하나로 자동화까지 끝낼 수 있어요.

GitHub Actions가 뭔데요?
한 줄로 요약하면 — GitHub 레포에서 특정 조건이 되면 코드를 자동 실행해주는 기능이에요.
기존에는 이랬어요:
- 터미널 열기
- 레포 폴더로 이동
- python main.py 실행
- 결과 확인

GitHub Actions 쓰면 이렇게 바뀌어요:
- 정해진 시간에 GitHub 서버가 알아서 실행
- 나는 아무것도 안 해도 결과가 나와 있음
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.키이름 }} 형태로 불러와요.
등록 방법:
- GitHub 레포 → Settings
- 좌측 메뉴 → Secrets and variables → Actions
- New repository secret 클릭
- Name: ANTHROPIC_API_KEY / Value: 실제 API 키 입력
- Add secret 클릭
그리고 main.py에서는 이렇게 불러오면 돼요:
import os
api_key = os.environ.get("ANTHROPIC_API_KEY")
로컬에서 개발할 때는 .env 파일에 넣고 python-dotenv로 불러오면 되고,
GitHub Actions에서 실행될 때는 env: 블록에서 secrets를 주입해주는 구조예요.
Step 5. 실행 확인
push하고 나서 확인하는 방법:
- GitHub 레포 → Actions 탭
- 왼쪽에 워크플로우 이름 보임
- 클릭하면 실행 기록, 로그, 에러 전부 확인 가능
실패했을 때 로그 보는 게 처음엔 낯선데, 익숙해지면 에러 메시지 보고 바로 수정할 수 있어요.
실제로 겪은 에러들
① 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에서 쓸 때 비용 관리하는 법 — 토큰 제한, 실행 횟수 조절 실전 세팅
'개발 실무' 카테고리의 다른 글
| 구글 애드센스 가입부터 티스토리 연동까지 — 2026년 최신 완벽 정리 (승인 팁 포함) (0) | 2026.05.01 |
|---|---|
| 닷홈 무료호스팅으로 그누보드5 서버 연결하고 테마까지 세팅하는 법 (2026 ver) (1) | 2026.04.30 |
| Claude Code로 레거시 코드 리팩토링하는 법 — PHP를 React로 바꾼 실전 후기 (2026) (4) | 2026.04.25 |
| [피그마 플러그인] html.to.design 2편 — 피그마 시안, Claude Code로 넘겨서 바이브코딩하기 (0) | 2026.04.24 |
| [피그마 플러그인] 사이트를 피그마로 '통째로' 옮기기! URL 하나로 피그마 시안 만드는 법 | html.to.design 완벽 정리 (0) | 2026.04.17 |