簡單介紹
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
還算比較新的功能,網上的教程不是很多,以上大多是參考官方文件,加上自己摸索嘗試得出的結論,如果有什麼錯漏之處,歡迎指出~