Github Action 簡介 #
在現代軟體開發中,速度和穩定性缺一不可。你是否曾經在每次推送(Push)程式碼後,還需要手動執行測試、打包(Build)專案,然後再登入伺服器進行部署(Deploy)?這些重複性的任務不僅耗時,也容易因人為疏忽而出錯。
這就是 GitHub Actions 登場的時刻。
什麼是 GitHub Actions? #
簡單來說,GitHub Actions 是 GitHub 內建的持續整合與持續部署(CI/CD)平台。它允許你直接在你的 GitHub 倉庫(Repository)中自動化執行你的軟體開發工作流程。
你不需要再依賴或設定額外的第三方 CI/CD 服務,GitHub Actions 讓「自動化」成為你程式碼管理的一部分。 就像拍拍君在寫完一篇blog 文章後,不需要手動更新網站,只需要把blog 的文章 Push 到 Github, Github Actions 就會幫拍拍君把文章轉換成 html (透過Hugo) 然後部署到 Github Pages。
真是太方便啦~!
它是如何運作的? #
GitHub Actions 的核心概念是「事件驅動」。你可以設定當某些「事件」發生時,Github會自動執行一系列的「動作」。
事件(Events): 觸發自動化流程的時機。最常見的像是 push 程式碼到特定分支、有人建立 pull request,甚至可以是定時任務(例如每天半夜執行)。
工作流(Workflows): 這是自動化流程的藍圖。你需要在你的專案中建立一個 .github/workflows 資料夾,並在裡面使用 YAML 檔案來定義工作流。
作業(Jobs): 一個工作流可以包含一或多個作業,這些作業可以並行或依序執行。例如,一個「測試」作業和一個「建置」作業。
步驟(Steps): 每個作業由一系列的步驟組成。步驟可以是執行一個 shell 指令(例如 npm install),或是使用一個「Action」。
動作(Actions): 這是最關鍵的部分。Action 是一個可重複使用的程式碼單元。你可以使用 GitHub 官方提供的 Actions、社群在 Marketplace 上分享的 Actions(例如:actions/checkout 用來拉取程式碼、actions/setup-node 用來設定 Node.js 環境),甚至自己撰寫。
範例: 拍拍君的網站workflow #
拍拍君的網站是用 Hugo 撰寫的,所有的網站設定和文章放在 Github 裡面的一個 repo, 再使用 Github Pages 來發佈網站。
其中,Hugo檔案和文章是在main branch,然後發佈的靜態網站是在gh-pages branch。
./github/workflows/deploy.yml
#
name: Deploy
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: write # allow pushing commits
actions: read # allow reading workflows, logs, etc.
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout Website Repo
uses: actions/checkout@v3
with:
submodules: recursive
- name: Setup Hugo
uses: peaceiris/actions-hugo@v2
with:
hugo-version: '0.147.0' # or the version you want
- name: Build Hugo Site
run: |
cd src
hugo --source . --destination ./public --baseURL "https://dailypypy.org/"
- name: Add CNAME file
run: |
echo "dailypypy.org" > ./src/public/CNAME
- name: Deploy to gh-pages Branch
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./src/public
publish_branch: gh-pages
其他進階使用 #
Github Actions 還有其他非常多好用的功能,拍拍君有機會再跟大家介紹。 譬如:
-
使用 Matrix(矩陣)進行交叉測試 你是否需要確保你的專案在多種環境下都能正常運作?例如,你的 Python 專案需要同時支援
Python 3.8、3.9和3.10,並且在 Linux 和 Windows 上都不能出錯。這時
strategy: matrix: 設定就是你的救星。你可以在 YAML 檔案中定義一個「矩陣」,列出所有你想測試的組合(例如,不同的作業系統、Node.js 版本、Python 版本或特定套件版本)。GitHub Actions 會為每 一個組合自動建立並執行一個獨立的作業(Job)。這對於開發開源套件或需要高度相容性的專案來說至關重要。
-
使用
on: schedule執行定時任務 並非所有的工作流都必須由push或pull_request觸發。有時候,你會需要「排程」任務。透過
on: schedule: 並搭配cron語法,你可以設定工作流在固定的時間自動執行。應用場景:
- 每日建置 (Nightly Build): 每天凌晨抓取最新的程式碼進行完整的測試與建置。
- 自動更新依賴: 每週一自動執行
npm update或pip install -U並發出 PR。 - 產生報告: 每天定時抓取資料並產生營運報告。
- 爬蟲任務: 定時執行爬蟲腳本來獲取最新資訊。
-
使用 Environments(環境)與 Secrets(密鑰) 當你的自動化流程需要部署(Deploy)到「測試環境」或「正式環境」時,安全就是首要考量。你絕對不該把資料庫密碼、API 金鑰或伺服器憑證直接寫在 YAML 檔案中。
-
Secrets (密鑰): 這是 GitHub 提供的安全儲存庫,用於存放敏感資訊。你可以在 Action 中透過
${{ secrets.YOUR_SECRET_NAME }}來安全地存取它,日誌中會自動將其遮蔽,避免外洩。 -
Environments (環境): 這是更進階的功能。你可以建立名為 production 或 staging 的環境。你可以為特定環境設定專屬的密鑰,甚至可以加上「人工審核」關卡——例如,部署到 production 前,必須由特定團隊成員點擊「Approve」才能繼續。
-
-
使用 actions/cache 加速工作流 你的 CI 流程是不是每次都要花好幾分鐘在
npm install、pip install或mvn install上?這些依賴套件通常不會天天變動,重複下載非常浪費時間。actions/cache是一個官方提供的 Action,它允許你將這些下載好的依賴項目「快取」起來。當工作流下次執行時,如果依賴項目沒有變更(例如 package-lock.json 檔案未變),它會直接從快取中還原,過程可能只需要幾秒鐘,大幅縮短 CI/CD 的等待時間。 -
使用 Self-hosted Runners(自架執行器) GitHub 預設提供的執行器(Runner)是在雲端的虛擬機,非常方便。但有時你會遇到特殊需求:
- 你的建置需要存取公司內網(Private Network)的資源。
- 你需要特殊的硬體規格(例如 GPU 來進行 ML 模型的測試)。
- 你有合規性要求,資料不能在外部伺服器上處理。
這時,你可以使用 Self-hosted Runners。你可以在自己的伺服器(無論是地端主機或雲端 VM)上安裝 GitHub Actions 的代理程式,讓它成為專屬於你的執行器。這讓你擁有對執行環境的 100% 控制權。
結語 #
GitHub Actions 大幅降低了導入 CI/CD 的門檻。它能幫你把時間從重複的勞動中解放出來,讓你更專注於撰寫有價值的程式碼。
如果你的專案還在手動部署,不妨現在就到你的 GitHub 倉庫,點擊 “Actions” 分頁,開始你的第一個自動化工作流吧!