我該如何使用 GitHub Actions 來建立 CI 的工作流程?

已完成

您將在此學到適用於 CI 的 GitHub Actions 和工作流程。

您將學習如何:

  • 從範本建立工作流程
  • 瞭解 GitHub Actions 記錄
  • 針對多個目標進行測試
  • 個別組建和測試作業
  • 儲存和存取組建成品
  • 在檢閱時自動標記 PR

從範本建立工作流程

若要建立工作流程,您可以使用範本來開始。 範本已針對您要實作的特定自動化類型,預先設定常見的作業和步驟。 如果您不熟悉工作流程、作業和步驟,請參閱 使用 GitHub Actions 將開發工作自動化模組。

在存放庫的主頁面上,選取 [動作] 索引標籤,然後選取 [新增工作流程]

在 [選擇工作流程] 頁面上,您可以選擇許多不同的範本。 其中一個範例是 Node.js 範本,會執行節點相依性的全新安裝、建置原始程式碼,並且對不同版本的 Node 執行測試。 另一個範例是 Python 套件範本,會安裝 Python 相依性,並且對不同版本的 Python 執行測試,包括 lint。

在搜尋方塊中,輸入 Node.js

Screenshot showing GitHub Actions tab with the search box highlighted and containing the text 'Node.js'.

在搜尋結果的 [Node.js] 窗格中,選取 [設定]

Screenshot showing GitHub Actions tab with the Node.js pane highlighted and the Node.js template selected.

您會在新建立的檔案 node.js.yml 中看到這個預設 Node.js 範本工作流程。

name: Node.js CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        node-version: [14.x, 16.x, 18.x]

    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
    - run: npm ci
    - run: npm run build --if-present
    - run: npm test

請注意 on: 屬性。 此工作流程會在推送至存放庫時觸發,以及對主分支進行提取要求時也會觸發。

此工作流程中有一個 job。 讓我們複習已討論的內容。

runs-on: 屬性指定工作流程會在 ubuntu-latest 作業系統上執行。 node-version: 屬性會指定共有三個組建,Node 14.x、16.x 和 18.x 版各一個。 我們稍後會在自訂工作流程時,深入說明 matrix 的部分。

作業中的 steps 會使用 GitHub Actions actions/checkout@v3 動作,將您存放庫中的程式碼放入 VM,而 actions/setup-node@v3 動作則用來設定 Node.js 的正確版本。 我們指定要使用 ${{ matrix.node-version }} 屬性來測試 Node.js 的三個版本。 此屬性會參考我們先前定義的矩陣。 cache 屬性會指定套件管理員,以在預設目錄中快取。

此步驟的最後一個部分會執行 Node.js 專案所使用的命令。 npm ci 命令會從 package-lock. json 檔案安裝相依性,npm run build --if-present 會執行組建指令碼 (如果有),而 npm test 會執行測試架構。 請注意,此範本同時包含相同作業中的組建和測試步驟。

若要深入了解 npm,請參閱 npm 文件:

組建的動作記錄

執行工作流程時,系統會產生記錄檔,其中包含發生事件和任何錯誤,或是測試失敗的詳細資料。

如果發生錯誤或測試失敗,您會在記錄中看到紅色的 ✖,而非綠色的核取標記 ✔。 您可以檢查錯誤或失敗的詳細資料,以調查發生了什麼問題。

 GitHub Actions log with details on a failed test.

在練習中,您可以透過檢查記錄檔中的詳細資料識別失敗的測試。 您可以從 [動作] 索引標籤存取記錄。

自訂工作流程範本

在此課程模組的一開始,我們描述了一種情境,其中您必須為您的小組設定 CI。 Node.js 範本就是不錯的起點,但是您想要自訂 Node.js 範本,以便更貼近您專屬小組的需求。 您想要以不同版本的節點和不同的作業系統為目標。 您也希望建置和測試步驟是個別的作業。

讓我們看一下您要如何自訂工作流程。

strategy:
  matrix:
    os: [ubuntu-latest, windows-latest]
    node-version: [16.x, 18.x]

我們在這裡設定了一個組建矩陣,以便跨多個作業系統和語言版本進行測試。 此矩陣會產生四個組建,分別與每個節點版本配對的作業系統搭配。

四個組建及其所有測試都會產生大量的記錄檔資訊。 所以可能難以將所有資訊逐一排序。 在下列範例中,我們會說明如何將測試步驟移至專用的測試作業。 這項作業針對多個目標進行測試。 將組建和測試步驟分開,可讓您更輕鬆地了解記錄。

test:
  runs-on: ${{ matrix.os }}
  strategy:
    matrix:
      os: [ubuntu-latest, windows-latest]
      node-version: [16.x, 18.x]
  steps:
  - uses: actions/checkout@v3
  - name: Use Node.js ${{ matrix.node-version }}
    uses: actions/setup-node@v3
    with:
      node-version: ${{ matrix.node-version }}
  - name: npm install, and test
    run: |
      npm install
      npm test
    env:
      CI: true

什麼是成品?

當工作流程產生記錄項目以外的產物時,我們就稱之為「成品」。 例如,Node.js 組建會產生可部署的 Docker 容器。 此成品 (容器) 可以透過 actions/upload-artifact 動作上傳至儲存體,後續再透過 actions/download-artifact 動作從儲存體下載。

儲存成品可讓您在作業之間保留該成品。 每項作業都會使用虛擬機器 (VM) 的全新執行個體,因此您無法在 VM 上儲存以重複使用該成品。 如果您需要在不同的作業中使用成品,您可以將成品上傳至某個作業中的儲存體,並將其下載用於另一個作業。

成品儲存體

成品會儲存在 GitHub 上的儲存空間中。 公用存放庫的空間是免費的,私人存放庫也會提供少量免費空間 (視帳戶而定)。 GitHub 會儲存您的成品 90 天。

在下列工作流程程式碼片段中,請注意 actions/upload-artifact@main 動作中有 path: 屬性。 此屬性的值是儲存成品的路徑。 在這裡,我們會指定 public/,將所有內容上傳至目錄。 如果只要上傳單一檔案,請使用 public/mytext.txt 之類的項目。

  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: npm install and build webpack
        run: |
          npm install
          npm run build
      - uses: actions/upload-artifact@main
        with:
          name: webpack artifacts
          path: public/

若要下載用於測試的成品,組建必須已經順利完成且上傳成品。 在下列程式碼,我們會指定測試作業相依於組建作業。

test:
    needs: build
    runs-on: ubuntu-latest

在下列的工作流程程式碼片段中,我們會下載成品。 現在測試作業可以使用成品進行測試。

steps:
    - uses: actions/checkout@v3
    - uses: actions/download-artifact@main
      with:
        name: webpack artifacts
        path: public

如需關於在工作流程中使用成品的詳細資訊,請參閱 GitHub 說明文件中的將工作流程資料儲存為成品

使用工作流程自動化 GitHub 中的檢閱

到目前為止,我們說明了如何使用 GitHub 事件 (例如 pushpull-request) 開始工作流程。 我們也可以依照排程或 GitHub 外部的部分事件來執行工作流程。

有時候,我們只想要在他人執行動作之後執行工作流程。 例如,我們可能只想要在檢閱者核准提取要求之後執行工作流程。 在此情節中,我們可以在 pull-request-review 上觸發。

我們可以採取的另一個動作是將標籤加入至提取要求。 在此情況下,我們會使用 pullreminders/label-when-approved-action 動作。

    steps:
     - name: Label when approved
       uses: pullreminders/label-when-approved-action@main
       env:
         APPROVALS: "1"
         GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
         ADD_LABEL: "approved"

請注意名為 env: 的區塊。 此區塊是您為此動作設定環境變數的位置。 例如,您可以設定所需的核准者數。 在此只需一位。 secrets.GITHUB_TOKEN 驗證變數是必要的,因為此動作必須藉由加入標籤以變更您的存放庫。 最後,您要提供要加入的標籤名稱。

新增標籤可以是啟動另一個工作流程的事件 (例如合併)。 我們將在下一個課程模組中討論此事件:使用 GitHub Actions 進行持續傳遞。