Github Actions 初探
Github Actions
是 Github
推出的一個新的功能,可以為我們的專案自動化地構建工作流,例如程式碼檢查,自動化打包,測試,釋出版本等等。入口在專案 pull request
的旁邊。

sign up for beta
即可。
由於每個 action
都是在一個獨立的 docker
容器裡面執行的,所以需要我們有一點 docker
方面的知識儲備,關於 docker
本文就不多加介紹了...
提出問題
1. workflow和action是什麼?
字面上理解, workflow
就是一個工作流,而 action
就是這個工作流中的一個個步驟, github
規定每次最多隻能併發執行兩個工作流,每個工作流中的 actions
會按照我們需要的順序執行, actions
怎樣執行可以根據我們的需要進行定製。
2. 怎麼建立一個workflow?
方法一:通過 github
提供的視覺化介面進行建立
- 點選
actions
入口,一開始我們可以看到這個介面:

- 點選上圖的
create a new workflow
按鈕,進入自定義workflow
頁面:

workflow
拉下來一條線,下面那個就是
action
,
GitHub官方
提供了幾個
action
可以讓我們直接用,點選右側的幾個
action
對應的
use
按鈕即可。
例如我們想使用 npm
,點選 npm
對應的 use
,出現以下介面,假如我們每次 push
分支之後想執行 npm install
,在 runs
對應的輸入框輸入 npm install
,那麼,執行 npm install
這個 action
就寫好了。
方法二: 編寫main.workflow檔案
在專案根目錄新建 .github
資料夾,在 .github
資料夾新建 main.workflow
檔案,編寫完成後推送到 master
分支即可。
這是一個簡單的 main.workflow
檔案:
workflow "Build, Test, and Publish" { on = "push" resolves = ["Publish"] } action "Build" { uses = "actions/npm@master" args = "install", env = { LOG_FILE = "log.txt" } } action "Test" { needs = "Build" uses = "actions/npm@master" args = "test" } action "Publish" { needs = "Test" uses = "actions/npm@master" args = "publish --access public" secrets = ["NPM_AUTH_TOKEN"] } 複製程式碼
其實,我們大概可以看出這段程式碼想要表達的意思,這裡我簡單介紹一下幾個屬性:
workflow
的屬性:
- on: 定義什麼情況下會觸發這個workflow,例如,push, pull_request等。
- resolves: 定義要呼叫的
actions
,可以是字串或者一個字串陣列,若是隻有一個字串,表示最後呼叫的action
,若是一個字串陣列,則表示完成這個workflow
需要執行完這幾個actions
。
action
的屬性:
-
needs:定義執行本
action
前需要成功執行的action
,可以是字串或者一個字串陣列,如果needs
的action
不止一個,那麼這些actions
會並行執行。 -
uses:定義執行本
action
需要執行的docker
映象,如uses = "node:10"
,如果不是使用docker hub
提供的映象,而是選擇自己編寫Dockerfile
的話(後面會具體說明),這裡的路徑則為本地Dockerfile
的路徑。 -
runs:指定在
docker
映象中要執行的命令,若指定,則會覆蓋Dockerfile
裡面的ENTRYPOINT
,若不指定,則預設執行Dockerfile
裡面ENTRYPOINT
的命令。
假如我們想要在action裡面執行npm install,那麼只要指定: runs: "npm install"
即可。
- args:指定要傳遞給
action
的引數,可以是一個字串或者一個字串陣列,若指定,則會覆蓋Dockerfile
裡面的CMD
。
假如我們想要在action裡面執行npm run lint,那麼只要指定: args: "run lint"
即可。
- env:設定action執行時需要的環境變數,一般是自己寫
Dockerfile
時會需要用到,具體說明請看 官方文件 。
3. 怎麼建立一個action?
方法一. 使用官方提供的幾個action(比較簡單)
在 github action
介面點選右側的 actions
列表,通過點選use按鈕使用該 action
,根據需求填寫 runs
, args
, env
等引數即可。
方法二. 自己寫dockerfile(自定義程度高)
可以參考 Github actions for npm 等官方提供的 action
原始碼進行編寫,主要是編寫以下兩個檔案:
Dockerfile entrypoint.sh 複製程式碼
踩坑日記
1. entrypoint.sh需要執行許可權
通過自己寫 dockerfile
的方式來建立 action
的話,需要執行以下程式碼,不然會出錯。
chmod +x ./actions/entrypoint.sh(替換成自己專案entrypoint.sh的路徑) 複製程式碼
2. npm install yarn -g ?
本來是想通過安裝 yarn
,然後使用 yarn
來安裝依賴的,但是因為容器的獨立性,每個 action
都是獨立的,不存在全域性環境,所以無法實現,而 github
官方提供了一個公共的儲存空間, npm install
下載完成的檔案就放在公共的儲存空間,因此可以提供給後面的 action
使用,這也意味著如果需要在 action
之間傳遞資訊,暫時也只能利用公共的儲存空間,使用檔案讀寫的方式來傳遞。
3. npm run test需要使用瀏覽器來跑單元測試,啟動失敗
瀏覽器無法直接在docker容器裡面啟動,使用 xvfb-run npm test
成功解決。
總結
由於 github action
還算比較新的功能,網上的教程不是很多,以上大多是參考官方文件,加上自己摸索嘗試得出的結論,如果有什麼錯漏之處,歡迎指出~