以 GitHub Action 來發推文

作者:   發佈於:   #perl #github #bot

由於 travis-ci 逐漸減少給開源專案用的容量,最近開始試用 GitHub Action 來跑一些專案的測試。在發現其支援 crontab 這種依照排程來執行的機能之後,就覺得應該可以用來跑定期發文的推特機器人。例如:投票日倒數機器人 @ElectionDay_bot 或是 台灣歷史上的今天 @TodayInTW_bot。這兩隻機器人都是每天在固定時間發一則文章。

要利用 GitHub Action 來發文,基本上就是加一條 Workflow,使其定時發生。GitHub Action 可以 crontab 語法來設定排成時間,不過其排程是定在 UTC 時區。如果定為每日 10 點 ( 0 10 * * * ),則實際上為台灣時間每日 18 點。

name: Tweet

on:
  schedule:
    - cron: '0 10 * * *'

而要執行的內容就是先把需要的模組裝好,然後直接執行。可以直接利用 docker hub 上計有的 perl container image。可預想大概偶爾會撞到 docker hub 的流量限制,等有需要再試試 ghcr.io。

jobs:
  tweet:
    container:
      image: perl:5.32
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          ref: release
      - run: cpanm -q --notest --no-man-pages --installdeps .
      - name: tweet
        env:
          TWITTER_TOKENS: ${{ secrets.TWITTER_TOKENS }}
        run: perl bin/tweet.pl --data ./data -y --github-secret

執行起來,安裝的部分需要一分半鐘,還不算太長。如果還想把這部分時間省下來那就是要分成兩道 Workflow,一道是在有新的變更時建出 container image,另一道是定時執行最新版的 contianer。

雖然將排程時間設定在整點,但實際上這 Action 的執行都延遲了三十分鐘以上。猜想是有很多 GitHub 使用者都使用了這個功能吧,不排個三十分鐘的隊伍還輪不到。看來還不太適合真的用來做及時性的處理,但用來發定時推文還算合適。