Github Actions 初探

linliqzh發表於2019-02-17

簡單介紹

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

action入口
私有倉庫現在應該很多同學都可以看到了,公有的因為現在還是beta版,名額還在陸續開放,需要主動去申請排隊,有需要的同學可以去申請一下,點選主頁的sign up for beta即可。

由於每個action都是在一個獨立的docker容器裡面執行的,所以需要我們有一點docker方面的知識儲備,關於docker本文就不多加介紹了...

提出問題

1. workflow和action是什麼?

字面上理解,workflow就是一個工作流,而action就是這個工作流中的一個個步驟,github規定每次最多隻能併發執行兩個工作流,每個工作流中的actions會按照我們需要的順序執行,actions怎樣執行可以根據我們的需要進行定製。

2. 怎麼建立一個workflow?

方法一:通過github提供的視覺化介面進行建立

  • 點選actions入口,一開始我們可以看到這個介面:

建立workflow

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

Github Actions 初探
在這個介面,我們從workflow拉下來一條線,下面那個就是actionGitHub官方提供了幾個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,可以是字串或者一個字串陣列,如果needsaction不止一個,那麼這些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還算比較新的功能,網上的教程不是很多,以上大多是參考官方文件,加上自己摸索嘗試得出的結論,如果有什麼錯漏之處,歡迎指出~

相關文章