Github Actions 持續集成服務

什麼是 Github Actions

GitHub Actions 是 GitHub 的持續集成服務,於2018年10月推出。是一種可以替換 Travis CI 作爲 CI/CD 的解決方案。我也是近期存在一個需求,纔開始進行嘗試的,畢竟學了用是最好的學習方法。

可能存在一部分同學對持續集成服務(CI/CD)到底能做什麼不是特別的有概念,例如:你將代碼提交到 Github 倉庫,馬上將代碼打包,發佈到應用服務器上,實現快速發佈。這個過程就是持續集成服務做得事,期間涉及登錄遠程服務器、運行測試等等。如果你之前用過 Jenkins 或者 Travis CI,我相信你已經知道,它是做什麼了。

GitHub 做了一個官方市場,可以搜索到他人提交的 actions。另外,還有一個 awesome actions 的倉庫,也可以找到不少 actions。如何使用別人的 actions 我會在下面說明。

基本概念

GitHub Actions 有一些自己的術語。

(1)workflow (工作流程):持續集成一次運行的過程,就是一個 workflow。

(2)job (任務):一個 workflow 由一個或多個 jobs 構成,含義是一次持續集成的運行,可以完成多個任務。

(3)step(步驟):每個 job 由多個 step 構成,一步步完成。

(4)action (動作):每個 step 可以依次執行一個或多個命令(action)。

編寫 Action

GitHub Actions 配置文件存放在代碼倉庫的.github/workflows目錄下,文件後綴爲 .yml ,支持創建多個文件,命名隨意,一般默認爲 main.yml 。GitHub 會根據目錄下的 actions 配置,自動觸發,無需人爲介入,如果運行過程中存在問題,會以郵件的形式通知到你。

下面看一些常用的基礎配置項:

(1)name

name 字段是 workflow 的名稱。如果省略該字段,默認爲當前 workflow 的文件名。

name: GitHub Actions Demo

(2)on

on 字段指定觸發 workflow 的條件,通常是某些事件。

on: push

上面代碼指定,push 事件觸發 workflow。

on 字段也可以是事件的數組。

on: [push, pull_request]

上面代碼指定,push 事件或pull_request 事件都可以觸發 workflow。

完整的事件列表,請查看官方文檔。除了代碼庫事件,GitHub Actions 也支持外部事件觸發,或者定時運行。

(3)on..

指定觸發事件時,可以限定分支或標籤。

on:
  push:
    branches:    
      - master

上面代碼指定,只有master分支發生push事件時,纔會觸發 workflow。

(4)jobs..name

workflow 文件的主體是jobs字段,表示要執行的一項或多項任務。

jobs字段裏面,需要寫出每一項任務的job_id,具體名稱自定義。job_id裏面的name字段是任務的說明。

jobs:
  my_first_job:
    name: My first job
  my_second_job:
    name: My second job

上面代碼的jobs字段包含兩項任務,job_id分別是my_first_jobmy_second_job

(5)jobs..needs

needs字段指定當前任務的依賴關係,即運行順序。

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]

上面代碼中,job1必須先於job2完成,而job3等待job1job2的完成才能運行。因此,這個 workflow 的運行順序依次爲:job1job2job3

(6)jobs..runs-on

runs-on字段指定運行所需要的虛擬機環境。它是必填字段。目前可用的虛擬機如下。

  • ubuntu-latestubuntu-18.04ubuntu-16.04
  • windows-latestwindows-2019windows-2016
  • macOS-latestmacOS-10.14

下面代碼指定虛擬機環境爲ubuntu-18.04

runs-on: ubuntu-18.04

(7)jobs..steps

steps字段指定每個 Job 的運行步驟,可以包含一個或多個步驟。每個步驟都可以指定以下三個字段。

  • jobs..steps.name:步驟名稱。
  • jobs..steps.run:該步驟運行的命令或者 actions。
  • jobs..steps.env:該步驟所需的環境變量。
  • jobs..steps.uses:該步驟使用的其他的 actions。

下面是一個完整的 workflow 文件的範例。

name: Greeting from Mona
on: push

jobs:
  my-job:
    name: My Job
    runs-on: ubuntu-latest
    steps:
    - name: Print a greeting
      env:
        MY_VAR: Hi there! My name is
        FIRST_NAME: Mona
        MIDDLE_NAME: The
        LAST_NAME: Octocat
      run: |
        echo $MY_VAR $FIRST_NAME $MIDDLE_NAME $LAST_NAME.

上面代碼中,steps 字段只包括一個步驟。該步驟先注入四個環境變量,然後執行一條 Bash 命令。

uses

uses 可以引用別人已經創建的 actions,就是上文中說的 actions 市場中的 actions。

引用格式:userName/repoName@verison

with

輸入參數的 map 由操作定義。 每個輸入參數都是一個鍵/值對。 輸入參數被設置爲環境變量。 該變量的前綴爲 INPUT_,並轉換爲大寫。

示例

定義 hello_world 操作所定義的三個輸入參數(first_namemiddle_namelast_name)。 這些輸入變量將被 hello-world 操作作爲 INPUT_FIRST_NAMEINPUT_MIDDLE_NAMEINPUT_LAST_NAME 環境變量使用。

jobs:
  my_first_job:
    steps:
      - name: My first step
        uses: actions/hello_world@master
        with:
          first_name: Mona
          middle_name: The
          last_name: Octocat 

實戰演示

我有一個靜態博客服務,我希望每當我有新的文章提交到 Github 之後,能自動幫助我發佈到我自行購買的服務器上。博客我是通過 Nginx 方式發佈的。

main.yml

name: deploy to aliyun
on:
  push:
    branches:
      - master  # 當分支 master 有新紀錄提交的時候觸發
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      # 切換分支
      - name: Checkout
        uses: actions/checkout@master
      # Deploy
      - name: SSH Execute Commands
        uses: JimCronqvist/action-[email protected]
        with:
            hosts: ${{ secrets.ACCESS_HOST }}
            privateKey: ${{ secrets.ACCESS_TOKEN }}
            command: |
              cd /usr/local/nginx/html/full-stack
              git pull origin master

${{ secrets.ACCESS_HOST }} 是變量的應用方式,該種方式可以避免將一些密碼、服務器地址、鑰對外暴露,ACCESS_HOST 設置通過當前 Github 項目頁面下 Settings -> Secrets 目錄下進行配置。

secrets.Settings -> Secrets 目錄下配置參數的時候不要加哦。

參考閱讀

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章