所謂的 GitHub Actions,是 GitHub 所提供的一個自動化集成服務,簡單的說的話,就是我們可以自由指定:「當有 commit 被 push 到 GitHub 中的某個 repository 時,我們要 GitHub 做什麼事」。
舉例來說,我們可以設定成:「當有 commit 被 push 到 mytest 這個 repository 時,我們要求 GitHub 要傳送一則訊息到 Slack 裡面通知大家」,所以當我們添加了這一個 GitHub Action 之後,以後只要有人 push 了任一個 commit 到 mytest 中,GitHub Action 就會被觸發,因此就會傳送一筆訊則到 Slack 群裡面通知大家了。
所以 GitHub Actions 他最一開始被發明出來的目的,就是為了「程式的自動化集成」,也稱為是「CI/CD」(Continuous Integration/Continuous Deployment)。
如上面所介紹到的,GitHub Actions 本來就是為了「程式的自動化集成」而發明,簡單的說的話,就是我們可以預先設定好「當工程師上傳 code 之後,要 GitHub Actions 做什麼事」,所以這裡就延伸出各式各樣的用法。
舉例來說,有的團隊會設定成:
而上述這些用法,如果要給他們一個統稱的話,就稱為是「CI/CD」,也就是「持續整合/持續部署」 (Continuous Integration/Continuous Deployment),所以當大家在工作中聽到 CI/CD 時,基本上就是在對我們所上傳的程式做一些「後處理」,確保一些無聊的重複工作可以被自動化執行,這就是 CI/CD 的目的!
了解了 GitHub Actions 的概念之後,接著我們也可以試著到 GitHub 上設定看看 GitHub Actions,實作第一個 CI/CD 程式。
老實說要在 GitHub 中設定一個 GitHub Actions 真的比想像中容易🤣,只要在 GitHub repo 中添加一個 .github
資料夾,並且在裡面再創建一個子資料夾 workflows
(也就是 .github/workflows
),接著就可以在裡面撰寫 GitHub Actions 的設定了!
所以創建好 .github/workflows
這兩層資料夾之後,接著可以在裡面添加一個 demo-github-action.yml
的檔案,表示這是一個 action(檔案的檔名可以隨意取,要叫做 demo-github-action.yml
或是 xxx.yml
都可以,每一個檔案就是一個 action)。
此時在 demo-github-action.yml
裡添加下列程式之後:
name: GitHub Actions Demo
run-name: GitHub Actions Demo
# 觸發此 action 的時機
on:
push:
branchs: # 只要有任何一個 commit 被 push,就會觸發此 action
'*'
workflow_dispatch: # 可以手動執行此 action
# 預先定義此 action 要幹嘛
jobs:
demo:
runs-on: ubuntu-latest
steps:
- run: echo '執行成功'
只要這樣寫之後,就可以在「任何一個 commit 被 push」以及「手動執行此 action」這兩個時機點,去觸發這一個 GitHub Action。
因此當有 commit 被 push 上來時,此 action 就會輸出執行成功的結果,如下圖所示:
所以透過在 .github/workflows
中添加 demo-github-action.yml
的檔案(檔名可以隨意取),我們就可以為這個 GitHub repo 去添加他專屬的 GitHub Actions,因此就可以用 GitHub Actions 不斷的去集成這份程式,實作 CI/CD 的效果了!
另外大家以後在查看程式時,如果有發現某份程式有 .github/workflows
,就表示他有使用 GitHub Actions,所以就不會看不懂這資料夾到底是在幹嘛的了~(在知道有 GitHub Actions 這功能之前,我一直都以為 .github/workflows
只是 GitHub 產生的檔案,沒啥用處,真的是誤會大了🤣)。
補充:因為篇幅有限,所以沒辦法詳細介紹 GitHub Actions 中每一行程式的用途,如果大家有興趣的話,可以再查詢 GitHub Actions 的用法介紹。
而 GitHub Actions 除了可以用在最經典的 CI/CD 用途上之外,同時 GitHub Actions 其實也是可以拿來實作爬蟲的!
之所以可以將 GitHub Actions 用來實作爬蟲,是因為 GitHub Actions 被觸發的時機點,除了可以設定成「當任何一個 commit 被 push 時觸發此 action」之外,也可以設定成 「定時觸發此 action」,而就是這個「定時觸發此 action」的功能,讓我們可以拿來活用他,進而實作網路爬蟲。
如果要使用 GitHub Actions 實作網路爬蟲的話,首先需要先在 mytest 中新增一份爬蟲程式(此處以 crawler.py
為例)。
接著在 .github/workflows
中創建一個新的 action 檔案 crawler-demo.yml
(檔名可以隨意取),並且在 crawler-demo.yml
中添加下列程式:
name: Crawler Demo Action
run-name: Crawler Demo Action
# 觸發此 action 的時機
on:
schedule:
- cron: "55 12 * * *" # UTC 每天下午 12:55 執行此 action(等同於台灣晚上 8:55 執行)
workflow_dispatch: # 可以手動執行此 action
# 預先定義此 action 要幹嘛
jobs:
crawler-demo:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Setup Python
uses: actions/setup-python@v4.5.0
with:
python-version: "3.10"
- name: Install Python Dependency
run: pip3 install requests
- name: Run crawler.py # 前面都是在安裝 Python 環境,這裡才是真的去執行 crawler.py 的程式
run: python crawler.py
- name: Commit Data Back To GitHub Repo # 將爬到的數據 commit 回 GitHub repo
run: |
git config --global user.name "crawler-bot"
git config --global user.email "crawler-bot@gmail.com"
git add . && git commit -m "daily crawl"
git push origin main
在這一段程式中,首先最上面有一段 cron
的設定,這一段 cron
的設定就是可以將此 GitHub Actions 設定成「定時觸發此 action」,因此如果大家想要實作定時的網路爬蟲的話,就可以利用 GitHub Actions 的功能,定時去執行你想要執行的爬蟲程式。
而至於下面的 jobs:
之後的這一大串程式,就是在安裝 Python 環境、執行爬蟲程式 crawler.py
、並且將爬取到的數據 commit 回此 repo(不用額外找地方存爬到的數據,讚!)。
因此透過 GitHub Actions 的用法,等於是可以將下面這三件事,全部都靠一個 GitHub repo 來搞定:
crawler.py
所以對於只是想要寫一個小爬蟲的情境來說,用這招真的是在維護上最方便的做法👍,而且 GitHub Actions 在 public repo 上完全免費(在 private repo 每個月 2000 分鐘免費,也很夠用了),真的只能說是佛心來著🥹。
我自己已經用這功能爬了 2 個月多的數據,完全沒出過狀況,很穩定!推薦大家使用~
補充:如果某一次 GitHub Actions 執行失敗,GitHub 也會寄信通知你失敗了,所以只要當我收到失敗信,我再進到 GitHub 上看問題出在哪就好,因此就不用擔心哪天有突發狀況導致數據沒爬到的情況出現,感謝 GitHub!
所以總結一下上面的介紹的話,GitHub Actions 就是 GitHub 所提供的一個自動化集成服務(CI/CD),也就是讓我們可以自由指定:「當有 commit 被 push 到 GitHub 中的某個 repository 時,我們要 GitHub 做什麼事」。
而 GitHub Actions 除了支援最常見的 CI/CD 的用法之外,也可以魔改成網路爬蟲的伺服器來使用,利用 GitHub Actions 中的 cron
的定時執行的功能,就可以達到「定時執行爬蟲程式」的效果,進而在固定的時間去爬取數據了!
GitHub Actions 目前針對 public repo 完全免費(在 private repo 則是每個月 2000 分鐘免費),我目前每天同時跑 4 個爬蟲,用下來的每月用量大概是 480 分鐘,還很綽綽有餘XD,大家如果想要實時查看你的當月使用量,也可以透過 GitHub 中的 Billing and Plans 頁面 查看。
在 AI 時代,不只玩玩最新潮的 Copilot,推薦有空時也可以回頭挖寶 GitHub 中那些不為人知的神奇服務,感謝 GitHub 提供免費服務讓我們玩(還有讓我們蹭🤣),GitHub 我大哥!!!
這篇文章我們介紹了 GitHub Actions 的用途,並且也介紹了如何使用 GitHub Actions 架設一個簡易的 CI/CD 程式、以及實作網路爬蟲程式。
如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!