還不會用 GitHub Actions ?看看這篇

冴羽發表於2021-12-23

前言

在上篇《一篇教你程式碼同步 GitHub 和 Gitee》中,我們使用 GitHub Actions 解決了 GitHub 程式碼自動同步 Gitee 的問題,這篇我翻譯整理了 GitHub Actions 的官方文件,為大家介紹 GitHub Actions 的同時,並講解上篇同步 Gitee 的 Actions 程式碼。

GitHub Actions

GitHub Actions 是一個持續整合 (Continuous integration)和持續交付 (Continuous delivery)的平臺,它可以做到自動化構建、測試、部署。你可以建立工作流,構建和測試每一個 pull request 或者部署合併後的程式碼到生產環境。

GitHub Actions 可以在你的程式碼倉庫發生某個事件時執行一個工作流。舉個例子,當有人給你的程式碼倉庫新建了一個 issue,你可以跑一個工作流自動的新增合適的標籤。

GitHub 提供了 Linux、Windows、和 macOS 虛擬機器執行你的工作流,當然你也可以自定義執行環境。

GitHub Actions 元件

你可以配置一個 GitHub Actions 工作流(workflow),它會在你的倉庫發生某個事件時被觸發,就比如一個 pull request 或者一個 issue 被建立的時候。

你的工作流包含一個或者多個任務(jobs), 它們可以並行或者序列執行。每一個任務(jobs)都會在它自己的虛擬機器執行器(runner)上,任務可以有一個或者多個步驟(steps),可以執行一個自定義的指令碼或者執行一個動作(action),所謂動作(action)是一個可複用的擴充套件,用於簡化你的工作流。

Workflows(工作流)

工作流是一個可配置的自動化的程式。建立一個工作流,你需要定義一個 YAML 檔案,當你的倉庫觸發某個事件的時候,工作流就會執行,當然也可以手動觸發,或者定義一個時間表。

一個倉庫可以建立多個工作流,每一個都執行不同的步驟,舉個例子,一個工作流用於構建和測試 pull request,一個用於部署你的應用,再來一個,當有人新建 issue 的時候自動新增一個標籤。

你也可以在一個工作流中引用另外一個工作流,檢視「可複用工作流」。

事件(Events)

事件是指倉庫觸發執行工作流的具體的行為,比如建立一個 pull request,新建一個 issue、或者推送一個 commit。你也可以使用時間表觸發一個工作流,或者通過請求一個 REST API,再或者手動觸發。

事件完整的列表,可以檢視「觸發工作流的事件」。

任務(Jobs)

任務是在同一個執行器上執行的一組步驟(steps)。一個步驟(steps)要麼是一個shell 指令碼(script)要麼是一個動作(action)。步驟會順序執行,並彼此獨立。因為每一個步驟都在同一個執行器上被執行,所以你可以從一個步驟(step)傳遞資料到另一個步驟(step) 。

你可以配置一個任務依賴其他任務,預設情況下,任務沒有依賴,並行執行。當一個任務需要另外一個任務的時候,它會等到依賴的任務完成再執行。

動作(Actions)

動作是 GitHub Actions 平臺的一個自定義的應用,它會執行一個複雜但是需要頻繁重複的作業。使用動作可以減少重複程式碼。比如一個 action 可以實現從 GitHub 拉取你的 git 倉庫,為你的構建環境建立合適的工具鏈等。

你可以寫自己的動作 ,或者在 GitHub 市場找已經實現好的動作。

執行器(Runners)

一個執行器是一個可以執行工作流的服務。每一個執行器一次只執行一個單獨的任務。GitHub 提供 Ubuntu Linux,Microsoft Windows 和 macOS 執行器,每一個工作流都執行在一個獨立新建的虛擬機器中。如果你需要一個不同的作業系統,你可以自定義執行器。請檢視「自定義執行器」。

建立一個工作流

GitHub Actions 使用 YAML 語法定義工作流。每一個工作流儲存為一個獨立的 YAML 檔案,目錄是 .github/workflows

現在我們在程式碼倉庫建立一個示例工作流,當程式碼被推送的時候,會自動執行一系列的命令。在這個示例工作流中,GitHub Actions 會檢出提交的程式碼,安裝依賴,執行 bats -v

  1. 在你的倉庫,建立一個 .github/workflows/ 目錄
  2. .github/workflows/ 目錄,建立一個檔案,名為 learn-github-actions.yml ,新增下面的程式碼:

    name: learn-github-actions
    on: [push]
    jobs:
      check-bats-version:
     runs-on: ubuntu-latest
     steps:
       - uses: actions/checkout@v2
       - uses: actions/setup-node@v2
         with:
           node-version: '14'
       - run: npm install -g bats
       - run: bats -v
  3. 提交這些改動,推送到你的 GitHub 倉庫。

你的新 GitHub Actions 工作流檔案就會被安裝在你的倉庫,當有人提交程式碼的時候,工作流就會自動執行。關於一個任務的執行歷史,檢視「檢視工作流活動」章節。

理解工作流檔案

為了幫助你理解 YAML 語法,這節會解釋例子中的每行程式碼:

name: learn-github-actions

可選,工作流的名字,會出現在 GitHub 倉庫的 Actions 選項欄裡。

on: [push]

指定工作流的觸發事件。這個例子裡,使用是 push 事件,當有人提交了一個程式碼修改或者合併了一個 pull request ,工作流就會觸發。提交到每個分支都會被觸發,如果你想在指定分支、路徑、標籤,檢視 「GitHub Actions 工作流語法

jobs:

將執行在 learn-github-actions 工作流的所有任務分組在一起。

check-bats-version:

定義了一個名為check-bats-version 的任務,子鍵(child key)會定義該任務的屬性。

  runs-on: ubuntu-latest

配置任務執行在最新的 Ubuntu Linux 執行器。

 steps:

check-bats-version 任務下的所有步驟分為一組,巢狀的每一個條目都是一個獨立的 action 或者 shell 指令碼。

- uses: actions/checkout@v2

uses 關鍵字指定了這個步驟執行 actions/checkout 動作的 v2 大版本 。這是一個可以檢出倉庫程式碼到執行器的動作,它允許你執行指令碼或者其他動作侵入你的程式碼(比如構建或者測試工具)。

- uses: actions/setup-node@v2
  with:
    node-version: '14'

這個步驟會使用 actions/setup-node@v2 動作安裝指定版本的 Nodejs ,這會在你的 PATH 加上 nodenpm 命令。

- run: npm install -g bats

run 關鍵字會告訴任務在執行器上執行一個命令。在這個例子中,你正在使用 npm 安裝 bats 軟體測試包。

- run: bats -v

最終,你執行 bats 命令,傳入一個可以列印軟體版本的引數。

視覺化工作流檔案

在這個圖表,你可以看到你剛建立的工作流檔案,以及這些 GitHub Actions 元件是如何組織的。每一個步驟都會執行一個獨立的動作或者指令碼檔案。任務1 和 2 是執行命令,任務3 和 任務 4 是執行指令碼檔案。找到更多預構建的動作,檢視 「查詢和自定義動作」。

檢視工作流活動

一旦你的工作流開始執行,你可以在 GitHub 看到一個視覺化的執行進度圖表 ,檢視每一個步驟的執行情況。

  1. 在 GitHub.com ,導航至倉庫主主頁
  2. 在你的倉庫名下,點選 Actions

  1. 在左側 sidebar,點選你想檢視的工作流

  1. Workflow runs ,點選你想檢視的執行記錄的名稱:

  1. 在 Jobs 或者在視覺化圖表中,點選你想看到的任務:

  1. 檢視每一個步驟的結果:

上篇文章程式碼解析

現在我們再來看 GitHub 同步 Gitee 的程式碼,是不是就清楚很多了:

name: syncToGitee
on:
  push:
    branches:
      - gh-pages
jobs:
  repo-sync:
    runs-on: ubuntu-latest
    steps:
      - name: Mirror the Github organization repos to Gitee.
        uses: Yikun/hub-mirror-action@master
        with:
          src: 'github/mqyqingfeng'
          dst: 'gitee/mqyqingfeng'
          dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
          dst_token:  ${{ secrets.GITEE_TOKEN }}
          static_list: "learn-typescript"
          force_update: true
          debug: true

在這個例子裡,我們定義了一個名為 syncToGitee 的工作流,指定程式碼提交到分支 gh-pages 才觸發工作流。

任務下只有一個名為 repo-sync 的任務,執行在 ubuntu-latest,具體的步驟下,也只有一個名為 Mirror the GitHub organization repos to Gitee. 的步驟,使用了 Yikun/hub-mirror-action@master 動作,而 with 裡的內容則是該動作需要的一些引數。

系列文章

系列文章目錄地址:https://github.com/mqyqingfen...

微信:「mqyqingfeng」,加我進冴羽唯一的讀者群。

如果有錯誤或者不嚴謹的地方,請務必給予指正,十分感謝。如果喜歡或者 有所啟發,歡迎 star,對作者也是一種鼓勵。

相關文章