寫排程有很多方式可以達到,我們來玩玩 Github Action
的 Cron job,讓它在每天的固定時間幫我們更新 kintone 上面的紀錄。
Github Free Plan 每個月有 2,000 分鐘的免費使用時間,正好適合讓我們玩玩看,不過這個排程並不是那麼準時,都會延遲個 10 分鐘以上才執行,且如果是設定每分鐘執行這種高頻率的話,會被忽略掉。
所以如果你的專案要非常準時執行,且短時間要執行多次,那就要挑選其他工具。
先在 kintone 的應用程式中建立一個 日期
欄位,這個日期會顯示年月日,如 2024-10-12
,我們的排程每天會將這個欄位更新成今天的日期,更新時間是晚上的 9 點。
以下用 python 寫個更新紀錄的程式,先在本地建好專案並測試沒問題後,我們再推到 Github 上。先來開個虛擬環境(MAC):
python3 -m venv cron_env
啟動虛擬環境:
source cron_env/bin/activate
接著安裝發送請求的套件
pip3 install requests
再來就可以開始寫 code 了!
我們先取得當天的時間,接著把這時間寫進名為 date
的 kintone 欄位,token 跟 url 之類的我就直接寫死了,如果有需要的話可以放在 .env
,推到 github 的時候再做設定。
import requests
from datetime import datetime
from typing import Dict, Any
base_url = 'https://xxx.cybozu.com/k/v1/record.json'
headers = {
'X-Cybozu-API-Token': 'xxxxxx',
'Content-Type': 'application/json'
}
def create_today_date() -> str:
return datetime.now().strftime('%Y-%m-%d')
def get_payload(date: str) -> Dict[str, Any]:
return {
'app': '175',
'id': 1,
'record': {
'date': {
'value': date
}
}
}
def update_record():
today_date = create_today_date()
payload = get_payload(today_date)
response = requests.put(base_url, json=payload, headers=headers)
print(response.json())
順利的話應該會 print 出 {'revision': ''}
的訊息,我就不多做錯誤處理了。
最後我們把需要用的套件輸出到 requirements.txt
:
pip3 freeze > requirements.txt
專案內建立 .github/workflows/python-script.ym
,等等推到 Github 上讓他跑,我們讓這個程式碼在每天的晚上九點執行,實測大概會延遲 10 - 20 分鐘左右。
name: Run Python Script Daily
on:
schedule:
- cron: '0 13 * * *'
jobs:
run-python:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.x'
- name: Cache Python packages
uses: actions/cache@v3
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
- name: Install dependencies
run: pip install -r requirements.txt
- name: Run Python script
run: python app.py
排程的時程,可以用 cron expression 來生成。
最後的最後,只要把專案推到 github 上就可以了,可以在 Action 的地方看看是否有成功。