身為開發者,你的日常工作中是否充滿了各種重複性任務?像是:
- 每天半夜要對正式站進行健康檢查。
- 每週一早上需要產生一份數據報告。
- 每個月要定期清理測試環境的暫存檔案。
這些任務雖然重要,但手動執行不僅耗時,也容易因為遺忘或人為疏失而出錯。如果能讓這些事自動在指定時間執行,那該有多好?
這就是 GitHub Actions 的排程功能 (on: schedule
) 發揮作用的地方。它就像一個不知疲倦的助理,能 7x24 小時準確無誤地在預設時間執行你交辦的任何任務。這篇文章將帶你從零開始,學會如何設定排程,讓你把寶貴的時間專注在更有創造力的事情上。
什麼是 GitHub Actions 排程功能?
簡單來說,它允許你的 Workflow (工作流程) 不需要透過 push
或 pull_request
等手動事件觸發,而是根據你設定的時間表(例如「每天早上 8 點」或「每 15 分鐘」)自動執行。
這項功能非常適合處理那些有規律、週期性的維護型任務,例如:
- 定期備份:每天將資料庫或重要設定檔備份到雲端儲存。
- 自動測試:每晚對最新的開發版本進行完整的整合測試。
- 產生報告:每週自動分析數據並產生報表。
- 監控服務:定時檢查網站或 API 是否正常運作。
- 同步資料:定期從外部來源拉取最新資料並更新到你的專案中。
設定排程的關鍵:認識 Cron 表達式
GitHub Actions 使用標準的 Cron 表達式 來定義排程時間。第一次看到它可能會覺得有點神秘,但其實它的結構非常有規律。一個 Cron 表達式由 5 個欄位組成,中間用空格分開,分別代表:
┌───────────── 分鐘 (0 - 59)
│ ┌───────────── 小時 (0 - 23)
│ │ ┌───────────── 每月第幾天 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 每週星期幾 (0 - 6,其中 0 和 7 都代表星期日)
│ │ │ │ │
│ │ │ │ │
* * * * *
常用特殊字元:
*
:代表「每一個」。例如在「分鐘」欄位使用*
,表示每一分鐘都會執行。*/n
:代表「每 n (單位)」。例如在「小時」欄位使用*/2
,表示每兩小時執行一次。-
:代表一個範圍。例如在「星期幾」欄位使用1-5
,表示從星期一到星期五。,
:代表列舉。例如在「小時」欄位使用8,12,18
,表示在早上 8 點、中午 12 點和下午 6 點執行。
幾個簡單的例子:
Cron 表達式說明
*/15 * * * *
每 15 分鐘執行一次。
0 8 * * *
每天早上 8:00 執行。
0 22 * * 1-5
每週一至週五的晚上 22:00 執行。
30 5 1 * *
每個月 1 號的凌晨 5:30 執行。
⚠️ 重要提醒:UTC 時區 GitHub Actions 的所有排程都使用 世界標準時間 (UTC)。台灣時間 (CST) 比 UTC 快 8 小時。所以,如果你想在台灣時間早上 9 點執行,你需要設定為 UTC 時間凌晨 1 點 (
0 1 * * *
)。記不住 Cron 語法?推薦一個超好用的線上工具 Crontab Guru,它可以幫你產生及驗證 Cron 表達式,並清楚地告訴你它代表的時間。
如何建立你的第一個排程 Workflow
現在,讓我們動手建立一個實際的排程任務吧!
步驟 1:建立 Workflow 的 YAML 檔案
在你的專案根目錄下,找到或建立 .github/workflows/
資料夾,並在裡面新增一個 YAML 檔案,例如 scheduled-task.yml
。
步驟 2:定義 schedule
觸發器
在 YAML 檔案中,使用 on:
和 schedule:
來定義你的排程。
# .github/workflows/scheduled-task.yml
name: My Scheduled Task
on:
schedule:
# 使用 cron 語法設定排程
# 這個範例是設定在每天的 UTC 時間 5:30 執行
- cron: '30 5 * * *'
步驟 3:撰寫工作內容 (Jobs)
定義好觸發時間後,接下來就是在 jobs
中設定要執行的具體任務。
範例 1:每日網站健康檢查
這個範例會每天 UTC 時間的午夜 0 點,使用 curl
指令檢查你的網站是否能正常回傳 200 OK。
# .github/workflows/daily-health-check.yml
name: Daily Website Health Check
on:
schedule:
# 每天午夜 (UTC) 執行
- cron: '0 0 * * *'
jobs:
health-check:
runs-on: ubuntu-latest
steps:
- name: Check the website status
# 將 https://your-website.com 換成你的網站網址
run: |
response=$(curl -s -o /dev/null -w "%{http_code}" https://your-website.com)
if [ "$response" -eq 200 ]; then
echo "Website is up and running!"
else
echo "Website is DOWN! HTTP status code: $response"
exit 1 # 讓 Action 執行失敗以發出警報
fi
範例 2:每週產生數據報告
這個範例更進階一點,它會在每週一早上 9 點 (UTC) 執行一個 Python 腳本來產生報告,並將報告自動 commit 回你的專案庫。
# .github/workflows/weekly-report.yml
name: Generate Weekly Report
on:
schedule:
# 每週一早上 9:00 (UTC) 執行
- cron: '0 9 * * 1'
# 加上 workflow_dispatch 讓我們可以手動觸發測試
workflow_dispatch:
jobs:
build-report:
runs-on: ubuntu-latest
steps:
# 步驟 1: 取得專案的程式碼
- name: Checkout repository
uses: actions/checkout@v3
# 步驟 2: 設定 Python 環境
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
# 步驟 3: 安裝腳本需要的套件
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
# 步驟 4: 執行你的 Python 腳本來產生報告
- name: Run script to generate report
run: python scripts/generate_report.py
# 步驟 5: 使用現成的 Action 將變更 (新產生的報告) 自動 commit
- name: Commit and push if it changed
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: "docs: Auto-generate weekly report"
# 可以指定要 commit 的檔案,例如報告檔案
file_pattern: reports/*.csv
重要注意事項與最佳實踐
- 加上 workflow_dispatch:如範例 2 所示,強烈建議在
schedule
旁加上workflow_dispatch:
。這讓你可以從 GitHub 網站的 Actions 頁面手動觸發這個 workflow,方便你隨時測試和除錯,而不用苦苦等待排程時間到來。 [圖片:GitHub Actions 頁面,一個 workflow 右上角有 "Run workflow" 的按鈕] - 執行時間可能延遲:GitHub 不保證你的排程會在「精準」的那個時間點執行。它會在排程時間將你的工作加入佇列,實際執行時間可能會因當時 GitHub 伺服器的負載而有幾分鐘的延遲。因此,它不適合需要秒級精準度的任務。
- 注意 Actions 的使用額度:對於公開專案,GitHub Actions 是免費的。但對於私有專案,則有每月免費的使用分鐘數限制。過於頻繁的排程(例如每分鐘執行)可能會快速消耗你的額度。
- 查看執行紀錄:你可以在專案的「Actions」分頁中看到所有排程的執行紀錄。你可以透過事件類型 (
event:schedule
) 來篩選,方便查看。
結論
GitHub Actions 的排程功能是一個強大卻容易上手的工具。透過簡單的 Cron 設定,你就能將無數的例行公事交給電腦自動處理。這不僅能確保任務的準時與一致性,更能將你從重複的勞動中解放出來。
現在就動手試試看,思考一下你的專案中有哪些任務可以被自動化,讓你的程式碼,即使在你睡覺的時候,也能為你辛勤工作吧!