들어가기 전에...
코드가 정상적으로 구현됐다면 main.py를 몇번 돌려봤을때 성공적으로 일정들이 생성되고 이전 일정이 관리됐을 것이다.
코드 짜는건 끝났지만 이걸 사람이 하루에 한번씩 직접 돌려줄 수는 없으니 github actions로 자동화를 시켜보자.
github actions 사용법
프로젝트를 git에 올릴때 최상위 폴더아래에 .github/workflows/~~~~.yml로 파일을 생성하고 파일 내용을 다음과 같이 설정하면 name과 동일한 workflow가 생성된다.
name: Run Notion Automation Daily at 00:05 KST
on:
schedule:
- cron: "20 15 * * *" # KST 00:05 (UTC 15:20)
# - cron: '*/5 * * * *' # 매 5분마다 실행, 최소 주기는 5분, 테스트용
workflow_dispatch: # 수동 실행도 가능
permissions:
contents: write # ← 이 줄 추가!
jobs:
run-main:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
# Python 환경을 설정
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: "3.10"
# requirements.txt 파일을 사용하여 의존성 설치
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
# 로그 폴더를 생성하고 env 변수를 사용하여 main.py 실행
- name: Save logs to file
run: |
python main.py
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
NOTION_CREATE_PLAN_DB_ID: ${{ secrets.NOTION_CREATE_PLAN_DB_ID }}
NOTION_CREATE_PLAN_PAGE_ID: ${{ secrets.NOTION_CREATE_PLAN_PAGE_ID }}
NOTION_VIEW_PLAN_DB_ID: ${{ secrets.NOTION_VIEW_PLAN_DB_ID }}
NOTION_VIEW_PLAN_PAGE_ID: ${{ secrets.NOTION_VIEW_PLAN_PAGE_ID }}
# 로그 파일을 GitHub에 커밋하고 푸시
- name: Commit and push logs
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add logs/
git commit -m "Add daily log ($(date +"%Y-%m-%d"))" || echo "No changes to commit"
git push
# 일주일이 지난 로그 파일 삭제
- name: Clean old logs
run: |
find logs/ -type f -name "*.log" -mtime +7 -delete
가장 상단의 name은 workflow 이름이다. git repository의 Actions에 들어가면 찾을 수 있다.
schedule은 cron 명령어를 사용해 주기적으로 언제 실행시킬지 설정하는 부분이다.
gpt한테 간단하게 써달랬는데... 또 장황하게 설명을 해줬다.
✅ 기본 명령어
crontab -e # 현재 사용자 크론 편집
crontab -l # 등록된 크론 목록 보기
crontab -r # 모든 크론 삭제
🧪 예제 1: 매일 자정에 쉘 스크립트 실행
0 0 * * * /home/user/backup.sh
# 매일 00시 00분에 /home/user/backup.sh 실행
📆 시간 형식
위치의미예시 값
1 | 분 | 0~59 |
2 | 시간 | 0~23 |
3 | 일 | 1~31 |
4 | 월 | 1~12 |
5 | 요일 | 0~7 (0, 7 = 일요일) |
🧪 예제 2: 매주 월요일 오전 9시에 Python 파일 실행
0 9 * * 1 /usr/bin/python3 /home/user/script.py
🧪 예제 3: 매 5분마다 로그 기록
*/5 * * * * echo "$(date) >> /home/user/log.txt"
조금 생긴 형태가 다르지만 저런식으로 사용하는거라고 보면 될 것 같다.
permission은 github에 어떠한 파일을 자동 push 시키고 싶을때 권한을 부여하는 부분.
그 아래 steps는 실제 코드를 실행시키는 부분이다.
눈으로 따라가면서 읽다보면 크게 어렵지 않은 코드들로 구성되어 있다.
여기서 짚고 넘어가야할 부분은 이 부분인데
# 로그 폴더를 생성하고 env 변수를 사용하여 main.py 실행
- name: Save logs to file
run: |
python main.py
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
NOTION_CREATE_PLAN_DB_ID: ${{ secrets.NOTION_CREATE_PLAN_DB_ID }}
NOTION_CREATE_PLAN_PAGE_ID: ${{ secrets.NOTION_CREATE_PLAN_PAGE_ID }}
NOTION_VIEW_PLAN_DB_ID: ${{ secrets.NOTION_VIEW_PLAN_DB_ID }}
NOTION_VIEW_PLAN_PAGE_ID: ${{ secrets.NOTION_VIEW_PLAN_PAGE_ID }}
우리는 보안을 위해 .gitignore에 .env 파일을 등록하여 API key가 업로드 되는 것을 막았었다.
그럼 github actions는 저 키를 어디서 불러올까?
답은 이곳이다.
Settings --> Secrets and Variables --> Actions 순으로 접속하면 되며 .env에 입력한 것과 동일하게 New repository secret을 클릭하여 API key들을 추가해주면 된다.
github actions에서 manual로 실행하고 테스트해보려면
이렇게 수동으로 실행시킬 수 있다. 만약 코드가 잘못됐거나 하면
이런식으로 에러가 나온다.
사용량의 경우 한달에 2000분까지라고 알고있긴한데... 그게 private repository에만 적용되고 public은 무제한인지... 잘 모르겠다.
나는 한번 돌릴때 1분 걸린다쳐도 한달에 30분이니까 딱히 신경안쓰는데 오래, 많이 돌리고 싶은 사람들은 제대로 확인 후 사용해야 할 것 같다. (필자도 PAPAGO API 잘못썼다가 17만원이 나왔었다.)
사실상 여기까지 했으면 다음은 테스트 + 로그 찍기인데
기능적으로는 이미 다 구현했다고 볼 수 있다.
여담으로... github actions 자동 실행까지 구현하고 잘 도는지 확인해봤을때
분명 00:05마다 코드는 정상적으로 실행됐는데 노션 페이지 생성 및 관리가 하나도 안되는 상황이 발생했었다. 🤨
그래서 출근할때쯤 Run workflows를 해보니 또 정상적으로 도는 것이 아닌가 (거의 사흘을 이것때문에 고민했었다.)
그래서 뭐가 문제인고하니 국제 표준시보다 한국이 +9시간이어서....
그래서 00:05에는 제대로 안돌다가 출근할때쯤엔 9시가 지나니까 정상적으로 도는 것이었다.... 별게 다 속썩인다.
암튼 요즘 몸 상태가 피로하다보니 뒤로 갈수록 힘이 빠졌는데... 나중에라도 설명이 부족한 부분이 보이면 보강할 예정이다.
다음글이 아마 마지막이 될 것 같다. 다음글에서 만나요! 😊
'Notion > Notion 일정관리 자동화' 카테고리의 다른 글
노션 일정관리 자동화 프로젝트 (8. 테스트 코드 구현) (1) | 2025.06.13 |
---|---|
노션 일정관리 자동화 프로젝트 (6. 코드 구현 (계획 생성 및 상태 변경)) (0) | 2025.06.11 |
노션 일정관리 자동화 프로젝트 (5. 코드 구현 (환경변수 세팅 및 데이터 추출)) (1) | 2025.06.08 |
노션 일정관리 자동화 프로젝트 (4. 프로젝트 사전 설정) (0) | 2025.06.07 |
노션 일정관리 자동화 프로젝트 (3. Notion API 발급 및 사용법) (0) | 2025.06.06 |