免費仔萬歲!使用 GitHub Actions 實作 CI/CD、網路爬蟲

古古

2024/11/12


什麼是 GitHub Actions? #

所謂的 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 在 CI/CD 中的用途 #

如上面所介紹到的,GitHub Actions 本來就是為了「程式的自動化集成」而發明,簡單的說的話,就是我們可以預先設定好「當工程師上傳 code 之後,要 GitHub Actions 做什麼事」,所以這裡就延伸出各式各樣的用法。

舉例來說,有的團隊會設定成:

  • 當工程師上傳 code 之後,自動執行單元測試,檢查所有測試是否能夠成功通過
  • 當工程師上傳 code 之後,自動執行 ESLint、SonarCube 這類的檢查,確保程式的品質正常
  • 當工程師上傳 code 之後,自動將該程式部署到 dev 環境
  • …等等

而上述這些用法,如果要給他們一個統稱的話,就稱為是「CI/CD」,也就是「持續整合/持續部署」 (Continuous Integration/Continuous Deployment),所以當大家在工作中聽到 CI/CD 時,基本上就是在對我們所上傳的程式做一些「後處理」,確保一些無聊的重複工作可以被自動化執行,這就是 CI/CD 的目的!

實戰:使用 GitHub Actions 架設第一個 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 在網路爬蟲中的用途 #

而 GitHub Actions 除了可以用在最經典的 CI/CD 用途上之外,同時 GitHub Actions 其實也是可以拿來實作爬蟲的!

之所以可以將 GitHub Actions 用來實作爬蟲,是因為 GitHub Actions 被觸發的時機點,除了可以設定成「當任何一個 commit 被 push 時觸發此 action」之外,也可以設定成 「定時觸發此 action」,而就是這個「定時觸發此 action」的功能,讓我們可以拿來活用他,進而實作網路爬蟲。

實戰:使用 GitHub Actions 實作網路爬蟲 #

如果要使用 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 來搞定:

  • 實作 Python 爬蟲程式 crawler.py
  • 定時執行爬蟲程式,爬取數據
  • 儲存數據

所以對於只是想要寫一個小爬蟲的情境來說,用這招真的是在維護上最方便的做法👍,而且 GitHub Actions 在 public repo 上完全免費(在 private repo 每個月 2000 分鐘免費,也很夠用了),真的只能說是佛心來著🥹。

我自己已經用這功能爬了 2 個月多的數據,完全沒出過狀況,很穩定!推薦大家使用~

補充:如果某一次 GitHub Actions 執行失敗,GitHub 也會寄信通知你失敗了,所以只要當我收到失敗信,我再進到 GitHub 上看問題出在哪就好,因此就不用擔心哪天有突發狀況導致數據沒爬到的情況出現,感謝 GitHub!

GitHub Actions 總結 #

所以總結一下上面的介紹的話,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 程式、以及實作網路爬蟲程式。

如果你對後端技術有興趣的話,也歡迎免費訂閱 《古古的後端筆記》電子報 ,每週二為你送上一篇後端技術分享,那我們就下一篇文章見啦!