CI 是什麼?Junior 工程師也能跟著體驗的 GitHub Actions 流程

更新 發佈閱讀 8 分鐘

前言

你有沒有遇過這種情況:

  • 加班太累打錯字,結果上線才發現
  • 需求變更,改了 A 功能結果 B 功能壞了
  • AI 幫你寫的 code 看起來沒問題,跑起來才爆炸

這些問題的共通點是------程式碼在上線前沒有被自動化地驗證過

這就是 CI 要解決的事。

CI 是什麼?

CI(Continuous Integration,持續整合)的核心概念很簡單:

每次有人提交程式碼,就自動跑一次測試,確認沒有東西壞掉。

不是等到要上線才測,而是每一次 push、每一個 PR 都測

這樣的好處是:

  • 問題在合併前就被發現,不會炸到主線
  • 看 PR 的人可以直接看到測試有沒有過,更有信心按下 Merge
  • 長期下來,整個團隊對程式碼品質更有底氣

有些團隊甚至會在 CI 裡加上程式碼風格檢查,確保每個人寫出來的 code 長得一樣。

(至於單元測試本身怎麼寫,那是另一個大題目,這篇先聚焦在 CI 流程。)

那 CI 要怎麼做?

知道了 CI 的概念後,下一個問題是:實際上要用什麼工具來跑?

市面上有不少選擇,像是 Gitlab CI、CircleCI、Travis CI 等等。但如果你的程式碼已經放在 GitHub 上。

最簡單的方式就是用 GitHub 內建的工具------GitHub Actions

GitHub Actions 是什麼?

GitHub Actions 是 GitHub 內建的 CI/CD 工具。你不需要額外架設服務,只要在專案裡放一個 .yml 檔案,GitHub 就會幫你自動執行。

免費方案對公開 repo 完全免費,私有 repo 每月也有 2000 分鐘的額度,個人專案絕對夠用。

四個核心概念

在開始之前,先認識四個關鍵詞:

1. Event(事件)

觸發 workflow 的條件。最常見的就是:

  • push — 程式碼推上去時
  • pull_request — 有人開 PR 時

還有很多其他事件,但這兩個就能涵蓋大部分日常情境。

2. Job(任務)

一組要執行的步驟。Job 之間預設是平行執行的,就像煮飯時可以一邊切菜一邊燒水。

但如果有先後關係,也可以設定依賴。就像煮泡麵------水沒滾你就放麵,只會得到一坨碳水化合物。

3. Action(動作)

別人寫好的自動化工具,直接拿來用。例如 actions/checkout 會幫你把程式碼下載到執行環境,shivammathur/setup-php 會幫你裝好 PHP。

不用自己從頭寫安裝腳本,一行 uses 搞定。

4. Runner(執行器)

實際跑你 Job 的虛擬機器。GitHub 提供 Ubuntu、Windows、macOS 三種,大部分情況用 ubuntu-latest 就好。

實際範例:push 後自動跑測試

以下是一個 PHP(Laravel)專案的 workflow 範例。在專案根目錄建立 .github/workflows/ci.yml

# Workflow 的名稱,會顯示在 GitHub Actions 頁面
name: CI

# 觸發條件
on:
push:
branches:["main"]
pull_request:
branches:["main"]

# 任務清單
jobs:
build:
# 執行環境
runs-on: ubuntu-latest

# 步驟(按順序執行)
steps:
# 下載專案源碼到 Runner
-uses: actions/checkout@v4

# 設定 PHP 環境
-name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version:"8.1"
extensions: mbstring, xml, pdo_sqlite, curl
coverage: none

# 安裝依賴套件
-name: Install dependencies
run: composer install --prefer-dist --no-interaction

# 準備環境設定
-name: Copy .env
run: cp .env.example .env

# 產生 Laravel 金鑰
-name: Generate APP_KEY
run: php artisan key:generate

# 執行測試(用記憶體內的 SQLite,不需要額外裝資料庫)
-name: Run tests
env:
DB_CONNECTION: sqlite
DB_DATABASE:":memory:"
run: php artisan test

這個範例是 Laravel 專案,但概念是通用的。換成 Node.js 就是把 setup-php 換成 setup-nodecomposer install 換成 npm installphp artisan test 換成 npm test

執行後會看到什麼?

成功的情況

當你 push 程式碼後,到 GitHub repo 頁面點 Actions 分頁,會看到你的 workflow 正在執行。

vocus|新世代的創作平台

全部通過的話,commit 旁邊會出現一個綠色勾勾。點進去可以看到每個步驟的執行 log。

如果是 PR,底部的 checks 區塊會顯示綠色的 All checks have passed,看 PR 的人最喜歡看到綠燈了。

vocus|新世代的創作平台

失敗的情況

如果有測試沒過,commit 旁邊會變成紅色叉叉。

點進去 Actions 可以看到是哪個步驟失敗、錯誤訊息是什麼。通常直接看 Run tests 那個步驟的 log 就能找到問題,接下來就是開心的debug 時間啦,恭喜你加班。

vocus|新世代的創作平台

PR 底部也會顯示紅色的 Some checks were not successful,提醒你修好再合併。

vocus|新世代的創作平台

跟 PR 的關係

CI 最常見的用法就是搭配 PR:

  1. 你開一個 PR
  2. GitHub Actions 自動跑測試
  3. 測試全過 → 綠色勾勾 → Reviewer 安心 merge
  4. 測試沒過 → 紅色叉叉 → 你修好再 push,CI 會再跑一次

現在就動手試試

  1. 使用我的Github Repo(或者你也可以自己建一個)
  2. 依照 README指引完成步驟
  3. 到 Repo 的 Actions 頁面,看它跑起來

第一次看到綠色勾勾出現的時候,你就懂 CI 的價值了。

總結

CI 不是什麼高深的東西,本質就是:自動化該做的事(我自己偶爾也會忘記在本地跑測試就推上去)。

GitHub Actions 讓這件事的門檻非常低。
花 30 分鐘設定一次,之後每次 push 都能自動幫你驗證程式碼,省下的時間和避免的災難絕對值回票價。

留言
avatar-img
翰克想一下
0會員
1內容數
找尋快樂事業的工程師
你可能也想看
Thumbnail
通過 memory_profiler 來測試優化前後的程式。 上一篇memory_profiler工具的說明介紹 以下是一個記憶體使用量較高的原始程式碼,接著對程式進行優化後,再次使用 memory_profiler 來比較優化前後的記憶體使用情況。
Thumbnail
通過 memory_profiler 來測試優化前後的程式。 上一篇memory_profiler工具的說明介紹 以下是一個記憶體使用量較高的原始程式碼,接著對程式進行優化後,再次使用 memory_profiler 來比較優化前後的記憶體使用情況。
Thumbnail
在寫程式的世界裡,最怕的就是「我以為沒問題,結果一堆 bug」。這篇筆記要帶你認識如何用「測試」和「CI/CD」幫助我們自動檢查錯誤、提升開發效率! 🧪 測試是什麼?為什麼要測試? 測試就是「寫程式來測試程式」,聽起來有點繞,但其實很簡單: 你寫了一個功能,接著寫一段測試程式來確認它真的能正
Thumbnail
在寫程式的世界裡,最怕的就是「我以為沒問題,結果一堆 bug」。這篇筆記要帶你認識如何用「測試」和「CI/CD」幫助我們自動檢查錯誤、提升開發效率! 🧪 測試是什麼?為什麼要測試? 測試就是「寫程式來測試程式」,聽起來有點繞,但其實很簡單: 你寫了一個功能,接著寫一段測試程式來確認它真的能正
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
在程式世界裡,if 條件句是我們的好朋友,幫我們做各種決策。如果不注意可能會讓我們掉進小陷阱。文中透過幾個例子,在使用 if 時可能會遇到的一些常見問題,像是不必要的 if、過於複雜的條件、忘了用嚴格比較,還有嵌套太深的 if。透過這篇文章,你將學到如何避免這些小錯誤,寫出更乾淨、更有效率的程式碼。
Thumbnail
測試領域大家愛用的程式語言是 python,幾乎都會搭配一個測試框架 ,例如 pytest, IDE 用 Microsoft vscode,考慮團隊共同開發,工作站的作業系統會選 Linux。 如何配置上述條件的 debug 環境來提高開發效率可以分兩個部分來討論
Thumbnail
測試領域大家愛用的程式語言是 python,幾乎都會搭配一個測試框架 ,例如 pytest, IDE 用 Microsoft vscode,考慮團隊共同開發,工作站的作業系統會選 Linux。 如何配置上述條件的 debug 環境來提高開發效率可以分兩個部分來討論
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News