跳至主要內容

持續整合

Deno 內建的工具讓您能輕鬆地為專案設定持續整合 (CI) 管線。測試、程式碼檢查和格式化都可以透過對應的指令完成,例如 deno testdeno lintdeno fmt。此外,您還可以在管線中使用 deno coverage 從測試結果產生程式碼覆蓋率報告。

本頁將會討論

設定基本管線

本頁將說明如何為 GitHub Actions 中的 Deno 專案設定基本管線。本頁說明的概念在很大程度上也適用於其他 CI 提供者,例如 Azure Pipelines、CircleCI 或 GitLab。

建立 Deno 管線通常從簽出儲存庫和安裝 Deno 開始

name: Build

on: push

jobs:
build:
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v3
- uses: denoland/setup-deno@v1
with:
deno-version: v1.x # Run with latest stable Deno.

若要擴充工作流程,只需新增您可能需要的任何 deno 子指令

      # Check if the code is formatted according to Deno's default
# formatting conventions.
- run: deno fmt --check

# Scan the code for syntax errors and style issues. If
# you want to use a custom linter configuration you can add a configuration file with --config <myconfig>
- run: deno lint

# Run all test files in the repository and collect code coverage. The example
# runs with all permissions, but it is recommended to run with the minimal permissions your program needs (for example --allow-read).
- run: deno test --allow-all --coverage=cov/

# This generates a report from the collected coverage in `deno test --coverage`. It is
# stored as a .lcov file which integrates well with services such as Codecov, Coveralls and Travis CI.
- run: deno coverage --lcov cov/ > cov.lcov

跨平台工作流程

身為 Deno 模組維護者,您可能想知道您的程式碼是否能在現今使用最廣泛的所有主要作業系統上執行:Linux、MacOS 和 Windows。透過執行平行工作的矩陣,每個工作在不同的作業系統上執行建置,即可達成跨平台工作流程

jobs:
build:
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ ubuntu-22.04, macos-12, windows-2022 ]
steps:
- run: deno test --allow-all --coverage cov/

注意:GitHub Actions 有個已知的 問題,在處理 Windows 式行尾 (CRLF) 時。這可能會導致在管線中執行 deno fmt 時發生問題,而該管線的工作在 windows 上執行。若要防止發生這種情況,請在執行 actions/checkout@v3 步驟之前,將 Actions 執行器設定為使用 Linux 式行尾

git config --system core.autocrlf false
git config --system core.eol lf

如果您使用的是實驗性或不穩定的 Deno API,您可以納入一個執行 Deno 金絲雀版本的矩陣工作。這有助於及早發現重大變更

jobs:
build:
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.canary }} # Continue in case the canary run does not succeed
strategy:
matrix:
os: [ ubuntu-22.04, macos-12, windows-2022 ]
deno-version: [ v1.x ]
canary: [ false ]
include:
- deno-version: canary
os: ubuntu-22.04
canary: true

加速 Deno 管線

減少重複

在跨平台執行時,管線的特定步驟不必針對每個作業系統執行。例如,在 Linux、MacOS 和 Windows 上產生相同的測試涵蓋率報告有點多餘。在這些情況下,您可以使用 GitHub Actions 的條件關鍵字 if。以下範例顯示如何僅在 ubuntu (Linux) 執行器上執行程式碼涵蓋率產生和上傳步驟

- name: Generate coverage report
if: matrix.os == 'ubuntu-22.04'
run: deno coverage --lcov cov > cov.lcov

- name: Upload coverage to Coveralls.io
if: matrix.os == 'ubuntu-22.04'
# Any code coverage service can be used, Coveralls.io is used here as an example.
uses: coverallsapp/github-action@master
with:
github-token: ${{ secrets.GITHUB_TOKEN }} # Generated by GitHub.
path-to-lcov: cov.lcov

快取相依性

隨著專案規模擴大,相依性也越來越多。Deno 會在測試期間下載這些相依性,如果工作流程每天執行多次,這可能會變成耗時的程序。加速的常見解決方案是快取相依性,這樣就不需要重新下載它們。

Deno 將相依性儲存在快取目錄中的本機。在管線中,快取可以在工作流程之間保留,方法是設定 DENO_DIR 環境變數,並將快取步驟新增到工作流程

# Set DENO_DIR to an absolute or relative path on the runner.
env:
DENO_DIR: my_cache_directory

steps:
- name: Cache Deno dependencies
uses: actions/cache@v2
with:
path: ${{ env.DENO_DIR }}
key: my_cache_key

一開始,當此工作流程執行時,快取仍然是空的,而且像 deno test 的指令仍然必須下載相依性,但當工作成功時,DENO_DIR 的內容會儲存起來,任何後續執行都可以從快取中還原它們,而不是重新下載。

上述工作流程中仍存在一個問題:目前快取金鑰名稱已硬編碼為 my_cache_key,這會在每次還原同一快取時使用,即使一個或多個相依性已更新。這可能會導致在更新某些相依性後,仍會在管線中使用舊版本。解決方案是在每次需要更新快取時產生不同的金鑰,這可以使用鎖定檔和 GitHub Actions 提供的 hashFiles 函數來達成

key: ${{ hashFiles('deno.lock') }}

要讓此方法運作,您還需要在 Deno 專案中有一個鎖定檔,詳細說明 在此。現在,如果 deno.lock 的內容已變更,將會建立新的快取並在之後的管線執行中使用。

為了示範,假設您有一個專案使用來自 deno.land/std 的記錄器

import * as log from "https://deno.land/std@0.220.0/log/mod.ts";

為了遞增此版本,您可以更新 import 陳述式,然後重新載入快取並在本地更新鎖定檔

deno cache --reload --lock=deno.lock --lock-write deps.ts

執行此操作後,您應該會看到鎖定檔內容的變更。當提交並透過管線執行時,您應該會看到 hashFiles 函數儲存新的快取並在後續任何執行中使用它。

清除快取

偶爾您可能會遇到已損毀或格式錯誤的快取,這可能會因為各種原因而發生。可以從 GitHub Actions UI 清除快取,或者您可以簡單地變更快取金鑰名稱。一種實用的方法是在不強制變更鎖定檔的情況下,將變數新增到快取金鑰名稱中,該變數可以儲存在 GitHub 機密中,並且可以在需要新的快取時變更

key: ${{ secrets.CACHE_VERSION }}-${{ hashFiles('deno.lock') }}