Github Actions 初探

簡單介紹

Github ActionsGithub推出的一個新的功能,能夠爲咱們的項目自動化地構建工做流,例如代碼檢查,自動化打包,測試,發佈版本等等。入口在項目pull request的旁邊。 node

action入口
私有倉庫如今應該不少同窗均可以看到了,公有的由於如今仍是beta版,名額還在陸續開放,須要主動去申請排隊,有須要的同窗能夠 去申請一下,點擊主頁的 sign up for beta便可。

因爲每一個action都是在一個獨立的docker容器裏面運行的,因此須要咱們有一點docker方面的知識儲備,關於docker本文就很少加介紹了...git

提出問題

1. workflow和action是什麼?

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

2. 怎麼建立一個workflow?

方法一:經過github提供的可視化界面進行建立

  • 點擊actions入口,一開始咱們能夠看到這個界面:

建立workflow

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

在這個界面,咱們從 workflow拉下來一條線,下面那個就是 actionGitHub官方提供了幾個 action可讓咱們直接用,點擊右側的幾個 action對應的 use按鈕便可。

例如咱們想使用npm,點擊npm對應的use,出現如下界面,假如咱們每次push分支以後想執行npm install,在runs對應的輸入框輸入npm install,那麼,執行npm install這個action就寫好了。docker

方法二: 編寫main.workflow文件

在項目根目錄新建.github文件夾,在.github文件夾新建main.workflow文件,編寫完成後推送到master分支便可。npm

這是一個簡單的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的屬性:bash

  • on: 定義什麼狀況下會觸發這個workflow,例如,push, pull_request等。
  • resolves: 定義要調用的actions,能夠是字符串或者一個字符串數組,如果只有一個字符串,表示最後調用的action,如果一個字符串數組,則表示完成這個workflow須要執行完這幾個actions

action的屬性:markdown

  • 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還算比較新的功能,網上的教程不是不少,以上大可能是參考官方文檔,加上本身摸索嘗試得出的結論,若是有什麼錯漏之處,歡迎指出~

相關文章
相關標籤/搜索