官網地址 : https://docs.github.com/cn/actions
Github Actions是干什么用的?
具體的解釋可以參照官網的說明,我這里舉兩個例子。
場景1: 一般的項目都有迭代不同的版本,但總會有一個master或dev/pro的版本做為最新版,一般的情況下,我們會在github上開不同的分支來管理,然后用版本號來區分,如下面這種:
但我們每完成一個固定的版本都需要手動更新到master或dev分支上,甚至我想再開一個倉庫去存放最新版本,那我們也每次都得手動push更新。
不過這時后我們就可以用github actions,選擇我們要觸發的時機(pull還是push?以及在哪個分支操作),然后代碼上傳就可以自動同步。
場景2:github page是github提供給我們通過靜態頁構建博客的功能,但我們每次都需要本地打包生成靜態頁然后上傳,不過有了actions就可以把打包以及上傳的動作交給github,我們只需要新增和更新文章然后同步到github即可,甚至都可以直接在github倉庫中直接修改文章都可以。
總結:上面兩個例子中,知道通過actions可以上傳,可以編譯打包。不過,我們也可以用actions做自動化測試,只要有相應的腳本就可以實現。
Github Actions實質是什么?
簡單地說,Actions就相當於Github給你提供了一個linux,你可以在里面上執行腳本。
其實Github只是給你創建了一個鏡像,供你去執行腳本和命令,等你執行完了鏡像會被刪除。
Github Actions 腳本怎么寫?
首先先看一下做為actions腳本的yml文件
1 # This is a basic workflow to help you get started with Actions 2 3 name: CI 4 5 # Controls when the action will run. Triggers the workflow on push or pull request 6 # events but only for the dev branch 7 on: 8 push: 9 branches: [ dev ] 10 pull_request: 11 branches: [ dev ] 12 13 # A workflow run is made up of one or more jobs that can run sequentially or in parallel 14 jobs: 15 # This workflow contains a single job called "build" 16 build: 17 # The type of runner that the job will run on 18 runs-on: ubuntu-latest 19 20 # Steps represent a sequence of tasks that will be executed as part of the job 21 steps: 22 # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 23 - uses: actions/checkout@v2 24 25 # Runs a single command using the runners shell 26 - name: Run a one-line script 27 run: echo Hello, world! 28 29 # Runs a set of commands using the runners shell 30 - name: Run a multi-line script 31 run: | 32 echo Add other actions to build, 33 echo test, and deploy your project.
- name:CI 是指定流程的名稱是“CI”,當actions開始執行的時候,我們點actions選項卡切換到actions頁面就能看到
上圖中紅框的就是這個 name
- on: 指定觸發時機,是push還是pull的時候觸發腳本
7 on: 8 push: 9 branches: [ dev ]
這段例子的含義就是當本地的代碼push到名為dev的分支中觸發,如果我們不管分支只要push就觸發可以這么寫:
7 on:[push]
同理 pull和push類似。
- jobs里面的是腳本列表,腳本與腳本直間通過名字來區分,上面的例子中只有一個腳本,就是build,也就是說build就是腳本名,而build里面的就是腳本。
- runs-on:指定宿主環境,我們的腳本要在什么環境下執行,通常是linux,而且例子中默認給的也是這個ubuntu
runs-on: ubuntu-latest # github中也給了window和ios系統做為宿主環境
- steps:執行的步驟,里面通過 - 來區分它的步驟,name是步驟名,可以沒有,下面的run用來運行命令和腳本。
一個name下可以寫多個run:
30 - name: Run a multi-line script 31 run: echo Add other actions to build, 32 run: echo test, and deploy your project.
也可以寫一個run: |,下一行開始寫多個命令:
30 - name: Run a multi-line script 31 run: | 32 echo Add other actions to build, 33 echo test, and deploy your project.
steps中的腳本,常用的還有uses,with,env等關鍵字。
- steps中的uses關鍵字和with關鍵字
uses用來調用第三方依賴,with則是這個依賴方法需要的入參。
這部分很常用,因為我們在用actions的時候大多都會找一些比較成熟的工具(輪子)直接使用,很少會自己寫輪子。
在下面的案例中,我會詳細解釋這塊。
而上面模板例子里的
- uses: actions/checkout@v2
這行代碼我們幾乎都會用上,它可以獲取到我要操作的分支的代碼,就是把它checkout
Github Actions實現Github Page的自動編譯打包上傳
如果上面的解釋你有些迷茫的話,做完下面這個,你也會操作Github Actions了。
*** 說一下yml文件,yml並不是純腳本,這有點類似於json文件,是一種保存鍵值對數據的文件類型。
- 在git工程下先創建一個 .github 文件夾,如下圖:
.github文件夾和你的 .git文件夾是在同一個路徑下,不過一般.git文件夾默認是被隱藏的。
- 然后.github文件夾下在創建一個workflows文件夾
注意:是 workflows 而不是 workflow , 也不是 .workflows,起初我在構建的時候就因為名字多一個點和少個s 始終無法看到到actions的頁面。
- 再在workflows文件夾下創建一個yml文件,名字隨便起,github只要能找到workflows文件夾,並且下面有yml文件就會執行它的腳本,如果有多個,會順次執行。
在這我附上我本地的目錄解構,方便參考:
- 以下是yml文件的寫法,我每行都附上注釋,方便理解
name: "github actions build and deploy gh-pages" #流程名稱 on: [push] #當對當前倉庫push代碼的時候觸發 jobs: build-and-deploy: #腳本名稱 runs-on: ubuntu-latest #運行在烏班圖linux上 steps: - name: Checkout #步驟1:checkout uses: actions/checkout@v2.3.1 #checkout需要引用的依賴 with: persist-credentials: false #checkout依賴參數:不保存證書 - name: install and build #步驟2:安裝依賴和打包 run: | #運行下面兩行命令 npm install #安裝依賴,當前分支的根目錄做為默認目錄 npm run build #打包代碼 - name: Install SSH Client #步驟3:關聯ssh私鑰 uses: webfactory/ssh-agent@v0.2.0 #這里調用這個第三方的庫,可以直接關聯ssh私鑰 with: #下面是參數
#這里需要通過github的環境參數中獲取私鑰,並傳給這個庫,(這是最安全的,git當然不能讓用戶直接輸入私鑰內容) ssh-private-key: ${{ secrets.DEPLOY_KEY }} - name: Deploy #步驟4:把編譯好的靜態目錄上傳到gh-pages分支上 uses: JamesIves/github-pages-deploy-action@3.5.9 #這里調用第三方依賴,用於上傳代碼到指定分支上 with: SSH: true #是否通過ssh方式 BRANCH: gh-pages #github pages 默認的分支 FOLDER: dist #上傳文件的目錄,我這個目錄在根目錄下,如果是子目錄可以這么寫 docs/.vuepress/dist
- 上面的腳本中涉及到一個環境變量
${{ secrets.DEPLOY_KEY }}
在github上一切與用戶隱私相關的,都只有登錄賬號的本人才能看到,比如說ssh公鑰私鑰,
但actions想要操作github就必須要獲取這些認證,所以github給actions暴露了一些環境變量,而actions腳本可以通過${{xxxx}}的方式來獲取環境變量的內容。
這里我舉個例子:
在上面的這個倉庫中,先選擇settings選項卡,切換到倉庫的設置頁面,
然后左側菜單的選擇secrets進入隱私頁面,右側點New secret按鈕來創建一個私鑰變量,
在上圖中我已經把私鑰創建完了,並且名稱是DEPLOY_KEY,而DEPLOY_KEY就是獲取私鑰的環境變量名稱,
也就是腳本中的 ${{ secrets.DEPLOY_KEY }}
- 上傳默認分支
Actions只識別默認分支的 .github/workflows/xxx.yml 腳本,如果腳本不在默認分支下,Actions則因為無法找到顯示初始頁面。
(這里算是一個坑)
如上圖,我這里的工作流程在dev分支中
而dev並不是默認分支,默認分支gh-pages中並沒有.github文件夾,這時我點擊Actions
它會顯示這個頁面,這是初始頁面,因為找不到workflows所以github在引導你創建一個,
而一直處在上面這個頁面的原因主要是找不到工作流程文件,
git會從默認分支下找.github/workflows/*.yml文件,並且*.yml是個合法的yml腳本,你不能用json語法冒充,
所以,如果不滿足上面這個條件,就會一直顯示上圖頁面。
反觀如果找到工作流程呢
就會進入這個畫面,而results是每次執行的記錄。
當上面的頁面出現,但results並沒有新增記錄,原因就是on事件沒有觸發,on包括push和pull,那就有可能你的語法寫錯了。
on: [push] #這里一定要有[]中括號,否則就不會觸發。
on: push: barnchs: [dev] #這里也要有[]中括號,否則不會觸發
還有一點注意了,yml文件不支持 // 這種注釋,習慣這么寫的小伙伴如果在on或者之前添加了 //這種注釋,因為語法不允許,所以也不會觸發腳本。
- 通過push代碼觸發流程執行
如果觸發了工作流程,腳本就會被執行,如上圖就會多出一條記錄。其中update是你在commit后面的注釋。點擊update進入下圖
這里能看到每個job和每個step,因為只有一個job所以左側菜單只顯示一個,右側則是按順序執行每個step。step可以展開看到詳細的信息,如下圖:
這些信息方便我們查看錯誤。
最后附上一個執行成功的圖片,以供參考: