前言
相信關注技術前沿的同學,多少也瞭解過 GitHub Actions
小年我碰巧最近遇上使用的需求,體驗了一番之後,感覺兩個字:真香!
什麼是 GitHub Actions ?
GitHub Actions 是 GitHub 推出的持續整合(Continuous Integration,簡稱 CI)服務,它提供了整套虛擬伺服器環境,基於它可以進行構建、測試、打包、部署專案等等操作。
持續整合(CI \ CD)主要有三個: 持續整合、持續交付、持續部署。
我們一般的軟體開發流程是:
- 開發人員原生程式碼 commit
- 通過 git hook 觸發自動化測試
- 測試通過後,合併釋出分支
- 通過 git hook 觸發自動部署服務
這裡簡單的描述了軟體開發週期,當然實際上會更加複雜。
我們可以看到,CI \ CD 是由很多操作組成的,比如執行自動化測試、分支合併、服務部署等,而 GitHub 把這一系列的操作都稱為 Actions。
當然 GitHub 創新點還不僅於此,不同的專案可能都會使用到相類似的 Action,GitHub 允許開發者把 action 寫成獨立的指令碼檔案,存放到程式碼倉庫,使得其他開發者可以引用。
GitHub 提供一個官方市場:GitHub Action Market ,在這裡可以搜尋到你想要的任何 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-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 的定義,這裡大概講解一下主要的步驟,有關具體的語法,下文面再詳解
on: [push]
專案 push 的時候觸發jobs.build.runs-on
執行在ubuntu
的虛擬機器上jobs.build.steps
定義了不同的步驟,如上註釋
第二步,配置引數
聰明的同學可能還會問,那檔案上的 ${{XXX}}
變數又是從何而來,哪裡定義的呢?
上面的例項只要使用了兩種型別的引數變數:
-
secrets.XXX
: GitHub 允許倉庫所有者建立和管理需要保密性的引數。例如郵件的賬號和密碼都是屬於敏感引數。可以通過專案 Settings -> Secrets -> Actions 配置密碼,在這裡我們新增
MAIL_USERNAME
、MAIL_PASSWORD
、MAIL_TOUSERNAME
三個配置引數(注意:這裡的密碼是指 SMTP 服務的授權密碼) -
上下文:可以訪問工作流程執行、執行器環境、作業及步驟相關資訊的方式
${{github.repository}}
:當前倉庫的的所有者和倉庫名稱。例如Edisonboy/ActionDemo
${{steps.git_log_outputs.log}}
:獲取step id 為 git_log 的輸出集
第三步,因為我們定義 push 為觸發條件,所以當我們只有push 程式碼後,我們定義的 GitHub Action 才會被執行。然後在 GitHub 上的 Action 能夠實時看到當前的執行狀態。
等執行完後,我們們就能收到 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
要等待 job1
和 job2
完成。
jobs.<job_id>.runs-on
要執行作業的機器型別。 機器可以是 GitHub 託管的執行器或自託管的執行器。
可用的 GitHub 託管的執行器型別包括:
jobs.<job_id>.steps
步驟,每個 Job 包含一個或多個步驟。步驟可以是執行命令、執行設定任務,或者執行倉庫中的操作和 Dcoker 映象釋出等。
例如上面例項定義了 3 個步驟 :
- copy git 倉庫到虛擬機器上
- 獲取最新一條提交的git log
- 傳送郵件
每個步驟都可以定義以下幾個欄位:
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 是一個非常實用有趣的功能,沒有你做不到的,只有你想不到的。
參考資料
普通的改變,將改變普通
我是肥壕,一個在網際網路低調前行的小青年
歡迎關注我的部落格? edisonz.cn,檢視更多分享文章