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" 標籤頁。

  1. 在左側清單中,你會看到剛才命名的 Daily Bitcoin Price Checker
  2. 因為我們有設定 workflow_dispatch,你可以點擊右邊的 "Run workflow" 按鈕,手動測試一次。
  3. 點進去執行紀錄中,你就能看到虛擬機開機、安裝 Python、並成功印出你的腳本結果!

GitHub Actions 排程的限制與解法

GitHub Actions 雖然香,但有幾個小限制必須要知道:

  1. 時間不精準:由於微軟的伺服器資源是全球開發者共享的,在整點 (例如 0 0 * * *) 通常會塞車大排長龍。你的排程可能會延遲 5 到 15 分鐘才開始執行。如果你的任務需要「非常精確的秒級定時」,請不要用 Actions。
    • 解法:盡量避開整點!把排程改成 17 0 * * * (UTC 0:17),避開大家都在用的整點,通常就會準時執行了。
  2. 免費額度:私有倉庫 (Private) 每個月有 2000 分鐘。以每天跑一次,一次跑 1 分鐘的爬蟲來說,一個月只會用掉 30 分鐘,絕對是綽綽有餘。

學會 GitHub Actions 排程,你就等於擁有了一台不用自己維護、不用付費的專屬執行主機,這是打造微型 SaaS 或自動化小工具最強大的秘密武器!

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!