針不戳!GitHub Actions 入坑指南

肥壕發表於2021-05-09

前言

相信關注技術前沿的同學,多少也瞭解過 GitHub Actions

小年我碰巧最近遇上使用的需求,體驗了一番之後,感覺兩個字:真香!

針不戳!GitHub Actions 入坑指南

什麼是 GitHub Actions ?

GitHub Actions 是 GitHub 推出的持續整合(Continuous Integration,簡稱 CI)服務,它提供了整套虛擬伺服器環境,基於它可以進行構建、測試、打包、部署專案等等操作。

持續整合(CI \ CD)主要有三個: 持續整合、持續交付、持續部署。

我們一般的軟體開發流程是:

  1. 開發人員原生程式碼 commit
  2. 通過 git hook 觸發自動化測試
  3. 測試通過後,合併釋出分支
  4. 通過 git hook 觸發自動部署服務

這裡簡單的描述了軟體開發週期,當然實際上會更加複雜。

我們可以看到,CI \ CD 是由很多操作組成的,比如執行自動化測試、分支合併、服務部署等,而 GitHub 把這一系列的操作都稱為 Actions。

當然 GitHub 創新點還不僅於此,不同的專案可能都會使用到相類似的 Action,GitHub 允許開發者把 action 寫成獨立的指令碼檔案,存放到程式碼倉庫,使得其他開發者可以引用。

GitHub 提供一個官方市場:GitHub Action Market ,在這裡可以搜尋到你想要的任何 actions,直接引用別人造好的輪子。

針不戳!GitHub Actions 入坑指南

基本概念

GitHub Actions 主要有以下幾個概念

  • Workflows

    工作流,可以新增到儲存庫中的自動化過程。工作流由一個或多個作業組成,可以由事件排程或觸發。

  • Event

    事件,觸發工作流的特定動作。例如,向儲存庫提交 pr 或 pull 請求。

  • Jobs

    作業,在同一跑步器上執行的一組步驟。預設情況下,具有多個作業的工作流將並行執行這些作業。

  • Steps

    步驟,可以在作業中執行命令的單個任務。步驟可以是操作,也可以是 shell 命令。作業中的每個步驟都在同一個執行程式上執行,從而允許該作業中的操作彼此共享資料。

  • Actions

    操作是獨立的命令,它們被組合成建立作業的步驟。操作是工作流中最小的可移植構建塊。你可以建立自己的動作,或者使用 GitHub 社群建立的動作。

  • Runners

    執行器,安裝了 GitHub Actions 執行器應用程式的伺服器。。Github 託管的執行器基於 Ubuntu Linux、Microsoft Windows 和 macOS,工作流中的每個作業都在一個新的虛擬環境中執行。

快速入門

閒話少說,我們們先通過簡單的例項來體驗一下 GitHub Action 的玩法。

例項一:傳送郵件

例子比較簡單,主要通過 GitHub Action 監聽程式碼 push 事件,併傳送郵件。(前提是郵箱需要開通 SMTP 服務)

第一步,在專案中 ./github/workflows/ 路徑下新增 .yml 或者 .yaml檔案,名字可以隨便取。在這裡我取名為 github-action-demo.yml

針不戳!GitHub Actions 入坑指南

下面是 github-action-demo.yml 的內容:

name: GitHub Action Demo
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    # copy git 倉庫到虛擬機器上
    - name: 'Checkout codes'
      uses: actions/checkout@v1
    # 獲取最新一條提交的git log  
    - name: Get Git Log
      id: git_log
      uses: Edisonboy/latest-git-log-action@main
      with:
        tag: origin/master
    # 傳送郵件    
    - name: Send email
      uses: dawidd6/action-send-mail@v3
      with:
        server_address: smtp.qq.com
        server_port: 465
        username: ${{secrets.MAIL_USERNAME}}
        password: ${{secrets.MAIL_PASSWORD}}
        subject: Github Actions job result
        to: ${{secrets.MAIL_TOUSERNAME}}
        from: ${{secrets.MAIL_USERNAME}}
        body: ${{github.repository}} push log : ${{steps.git_log.outputs.log}}
複製程式碼

這個 .yml 檔案就是對 GitHub Action 的定義,這裡大概講解一下主要的步驟,有關具體的語法,下文面再詳解

  1. on: [push] 專案 push 的時候觸發
  2. jobs.build.runs-on 執行在 ubuntu 的虛擬機器上
  3. jobs.build.steps 定義了不同的步驟,如上註釋

第二步,配置引數

聰明的同學可能還會問,那檔案上的 ${{XXX}} 變數又是從何而來,哪裡定義的呢?

上面的例項只要使用了兩種型別的引數變數:

  • secrets.XXX : GitHub 允許倉庫所有者建立和管理需要保密性的引數。例如郵件的賬號和密碼都是屬於敏感引數。

    可以通過專案 Settings -> Secrets -> Actions 配置密碼,在這裡我們新增 MAIL_USERNAMEMAIL_PASSWORDMAIL_TOUSERNAME 三個配置引數(注意:這裡的密碼是指 SMTP 服務的授權密碼)

    針不戳!GitHub Actions 入坑指南
  • 上下文:可以訪問工作流程執行、執行器環境、作業及步驟相關資訊的方式

    • ${{github.repository}} :當前倉庫的的所有者和倉庫名稱。例如 Edisonboy/ActionDemo
    • ${{steps.git_log_outputs.log}} :獲取step id 為 git_log 的輸出集

第三步,因為我們定義 push 為觸發條件,所以當我們只有push 程式碼後,我們定義的 GitHub Action 才會被執行。然後在 GitHub 上的 Action 能夠實時看到當前的執行狀態。

針不戳!GitHub Actions 入坑指南

等執行完後,我們們就能收到 git push 的日誌郵件了!!!

例項地址:Edisonboy/ActionDemo

例項二:Github 同步 Gitee

參考:利用 GitHub Actions 實現 github 程式碼同步 gitee 倉庫

Workflow 語法

結合上面的例子,我們們簡單學習一下 workflow 的語法。

workflow 檔案必須儲存在倉庫的 .github/workflows 的目錄中,副檔名為 .yml.yaml

name

workflow 的名稱, GitHub 在倉庫的操作頁面上顯示 workflow 的名稱。

on

觸發 workflow 的 GitHub 事件的名稱。

# 單個事件
on: push

# 多個事件列表
on: [push, pull_request]

# 指定main分支的push
on:
  push:
    branches:
      - main
複製程式碼

還可以使用定時排程:

on:
  schedule:
    - cron: '*/30 5,17 * * *'
複製程式碼

Jobs

作業,workflow 主要執行的核心任務。

jobs.<job_id>

每項作業必須關聯一個 ID。例如上面例項的 ID 為 build

jobs.<job_id>.name

作業顯示在 GitHub 上的名稱。

jobs.<job_id>.needs

識別在此作業執行之前必須成功完成的任何作業。

jobs:
  job1:
  job2:
    needs: job1
  job3:
    needs: [job1, job2]
複製程式碼

在此示例中,job1 必須在 job2 開始之前成功完成,而 job3 要等待 job1job2 完成。

jobs.<job_id>.runs-on

要執行作業的機器型別。 機器可以是 GitHub 託管的執行器或自託管的執行器。

可用的 GitHub 託管的執行器型別包括:

針不戳!GitHub Actions 入坑指南

jobs.<job_id>.steps

步驟,每個 Job 包含一個或多個步驟。步驟可以是執行命令、執行設定任務,或者執行倉庫中的操作和 Dcoker 映象釋出等。

例如上面例項定義了 3 個步驟 :

  1. copy git 倉庫到虛擬機器上
  2. 獲取最新一條提交的git log
  3. 傳送郵件

每個步驟都可以定義以下幾個欄位:

jobs..steps[*].id : 步驟的唯一識別符號
jobs..steps[*].name : 步驟顯示在 GitHub 上的名稱
jobs..steps[*].if : 自定義表示式,判斷是否滿足條件
jobs..steps[*].uses : 選擇公共倉庫中、或釋出 Docker 容器映像作為一部分執行的操作。例如上面的例項都是使用了公共倉庫提供的操作
jobs..steps[*].run : 執行 shell 命令程式。
複製程式碼

有關 workflow 語法更多的細節使用可以參考: GitHub Actions 官方文件

小結

在執行 workflow 的過程中,GitHub 會自動為我們提供相應的虛擬伺服器資源,這時候腦洞大的同學就應該想到:有沒有可能連線到這個伺服器,白嫖一個伺服器為所欲為呢。

看了一下 GitHub Actions 官方文件上提供的虛擬伺服器資源,這個配置比一臺低配個人伺服器還香。

Windows 和 Linux 虛擬機器的硬體規格:

  • 2 核 CPU
  • 7 GB RAM 記憶體
  • 14 GB SSD 硬碟空間

MacOS 虛擬機器的硬體規格:

  • 3 核 CPU
  • 14 GB RAM 記憶體
  • 14 GB SSD 硬碟空間

有興趣的同學可以參考:SSH 連線到 GitHub Actions 虛擬伺服器

還有更硬核的操作! 黑客可謂把白嫖發揮得淋漓盡致,盡然想到利用 GitHub 的伺服器挖礦 (詳情:黑客用GitHub伺服器挖礦,三天跑了3萬個任務,程式碼驚現中文

當然 GitHub Actions 也沒有這麼傻,肯定想到我們們白嫖的各種騷操作,所以對於使用增加了一定的限制

針不戳!GitHub Actions 入坑指南

總的來說,GitHub Actions 是一個非常實用有趣的功能,沒有你做不到的,只有你想不到的。

參考資料

GitHub Actions 官方文件

GitHub Actions 入門教程-阮一峰

GitHub Actions 進階技巧

普通的改變,將改變普通

我是肥壕,一個在網際網路低調前行的小青年

歡迎關注我的部落格? edisonz.cn,檢視更多分享文章

相關文章