GitHub Actions 定時觸發腳本
前一節介紹的 cron-job.org 雖然好用,但它的前提是:你必須先擁有一台正在運作的後端伺服器(API)來讓它戳。
如果你今天只是一個簡單的 Python 資料分析腳本(例如:每天早上抓取比特幣價格,然後傳送到 Line 群組),為了這個小腳本去寫一個 FastAPI 並部署上線,實在有點殺雞用牛刀。
這時候,身為開發者最大的福利來了!微軟爸爸買下 GitHub 後,提供了一個超級大禮物:GitHub Actions。
什麼是 GitHub Actions?
GitHub Actions 原本是設計用來做 CI/CD(自動化測試與部署)的工具。當你提交程式碼 (Push) 時,GitHub 會免費「租」給你一台有著優異算力的虛擬主機(通常是 Ubuntu),幫你跑測試。
但聰明的開發者發現,GitHub Actions 的觸發條件 (Triggers),除了「Push 程式碼」之外,竟然還支援 schedule (定時排程)!
也就是說,我們完全可以把程式碼放在 GitHub 倉庫裡,然後叫 GitHub 的伺服器每天定時幫我們「執行」這隻程式。這一切,對於公開倉庫 (Public Repo) 來說是完全免費且無限分鐘數的;就連私有倉庫 (Private Repo) 每個月也送你 2000 分鐘的免費額度!
實戰教學:每天執行 Python 爬蟲腳本
讓我們先寫一個超簡單的 Python 腳本。假設你的專案資料夾長這樣:
my-auto-script/
├── main.py
├── requirements.txt
└── .github/
└── workflows/
└── cron.yml
1. 撰寫你的 Python 腳本 (main.py)
這個腳本假設會去抓某個 API,然後印出來:
# main.py
import requests
from datetime import datetime
def job():
print(f"[{datetime.now()}] 腳本啟動!開始抓取資料...")
# 這裡可以放你的爬蟲邏輯或發 Line 訊息的邏輯
response = requests.get("https://api.coindesk.com/v1/bpi/currentprice.json")
data = response.json()
btc_price = data['bpi']['USD']['rate']
print(f"目前比特幣價格為: {btc_price} USD")
print("任務執行完畢!")
if __name__ == "__main__":
job()
如果有使用到外部套件(如 requests),記得要建立一個 requirements.txt:
requests==2.31.0
2. 建立 GitHub Actions 設定檔
這是最關鍵的一步。在專案根目錄建立 .github/workflows/cron.yml 檔案。注意,資料夾名稱一定要一字不差 (.github/workflows/)。
將以下內容貼入 cron.yml:
name: Daily Bitcoin Price Checker
# 設定觸發條件
on:
# 允許我們在 GitHub 網頁上手動點擊執行(除錯用)
workflow_dispatch:
# 設定排程 (使用 UTC 時間!)
schedule:
# 每天早上 8:00 (台灣時間) 執行
# 注意:台灣是 UTC+8,所以這裡要填 UTC 時間的 00:00
- cron: '0 0 * * *'
jobs:
run-script:
# 指定微軟要給我們哪種作業系統
runs-on: ubuntu-latest
steps:
# 步驟 1:把我們放在 GitHub 的程式碼下載到虛擬機裡
- name: Checkout code
uses: actions/checkout@v4
# 步驟 2:在虛擬機中安裝 Python 環境
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
# 步驟 3:安裝相關套件
- name: Install dependencies
run: |
python -m pip install --upgrade pip
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
# 步驟 4:執行我們的 Python 腳本!
- name: Run my python script
run: python main.py
# (可選) 如果腳本需要環境變數 (例如 API Key),可以這樣傳遞:
# env:
# LINE_TOKEN: ${{ secrets.LINE_TOKEN }}
[!WARNING] 排程時間陷阱:時區問題 (Timezone) GitHub Actions 的伺服器統一使用 UTC 時間 (世界協調時間)。台灣時間是 UTC+8。 如果你希望在台灣的早上 8 點執行,在寫 Crontab 時,你必須減去 8 小時,也就是寫
0 0 * * *(UTC 的凌晨 0 點)。這點非常多新手會踩坑!
3. 上傳至 GitHub
將程式碼 commit 並推送到 GitHub 後,請點擊你 Repo 頁面上方的 "Actions" 標籤頁。
- 在左側清單中,你會看到剛才命名的
Daily Bitcoin Price Checker。 - 因為我們有設定
workflow_dispatch,你可以點擊右邊的 "Run workflow" 按鈕,手動測試一次。 - 點進去執行紀錄中,你就能看到虛擬機開機、安裝 Python、並成功印出你的腳本結果!
GitHub Actions 排程的限制與解法
GitHub Actions 雖然香,但有幾個小限制必須要知道:
- 時間不精準:由於微軟的伺服器資源是全球開發者共享的,在整點 (例如
0 0 * * *) 通常會塞車大排長龍。你的排程可能會延遲 5 到 15 分鐘才開始執行。如果你的任務需要「非常精確的秒級定時」,請不要用 Actions。- 解法:盡量避開整點!把排程改成
17 0 * * *(UTC 0:17),避開大家都在用的整點,通常就會準時執行了。
- 解法:盡量避開整點!把排程改成
- 免費額度:私有倉庫 (Private) 每個月有 2000 分鐘。以每天跑一次,一次跑 1 分鐘的爬蟲來說,一個月只會用掉 30 分鐘,絕對是綽綽有餘。
學會 GitHub Actions 排程,你就等於擁有了一台不用自己維護、不用付費的專屬執行主機,這是打造微型 SaaS 或自動化小工具最強大的秘密武器!