Github Actions 持續集成服務

什麼是 Github Actions

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

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

GitHub 作了一個官方市場,能夠搜索到他人提交的 actions。另外,還有一個 awesome actions 的倉庫,也能夠找到很多 actions。如何使用別人的 actions 我會在下面說明。git

基本概念

GitHub Actions 有一些本身的術語。github

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

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

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

(4)action (動做):每一個 step 能夠依次執行一個或多個命令(action)。服務器

編寫 Action

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

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

(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-ssh@0.1.1
        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 目錄下配置參數的時候不要加哦。

參考閱讀

相關文章
相關標籤/搜索