TypeScript 项目的 CI/CD:GitHub Actions 高级水平

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么需要高级 CI/CD for TypeScript?

一个只运行 npm test 和 npm build 的基本 CI/CD 管道,一旦 TypeScript 项目开始增长,就会变得低效。构建时间增加,测试耗时数小时,手动版本管理导致错误。GitHub Actions 的高级配置水平可以解决这些问题:通过缓存加速管道,为不同版本的 Node.js 和操作系统并行执行测试,并自动化生产环境部署。

在本文中,我们将讨论 TypeScript 项目的三个关键技术:智能缓存 node_modules、用于检查兼容性的矩阵构建,以及使用 actions/upload-pages-artifact 的自动部署。所有示例均用 TypeScript 编写,并可直接集成到您的仓库中。



1. 智能缓存依赖项和编译

大型 TypeScript 项目的第一个问题是依赖项安装和编译耗时过长。GitHub Actions 提供了缓存机制,但需要正确配置。与其缓存整个 node_modules 文件夹(可能导致版本过时),不如缓存 package-lock.json 和编译器的 .cache 文件夹。

TypeScript 高级缓存示例:

name: TypeScript CI (Advanced)on: [push, pull_request]

jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Cache TypeScript cache uses: actions/cache@v4 with: path: | **/node_modules **/.tsbuildinfo key: ${{ runner.os }}-ts-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-ts- - run: npm ci - run: npm run build --if-present - run: npm test

这里的关键优化是使用 hashFiles('**/package-lock.json') 生成唯一的缓存键。如果 package-lock.json 没有变化,缓存可以在几秒钟内恢复。标志 --if-present 允许在构建脚本未定义时跳过它。



2. 矩阵构建:在不同版本的 Node.js 和操作系统上测试

TypeScript 编译为 JavaScript,但代码在不同运行时环境中的行为可能不同。GitHub Actions 的矩阵策略允许在多个操作系统和 Node.js 版本的组合上运行同一个管道。这对于库和服务器端应用程序至关重要。

TypeScript 项目矩阵配置示例:

jobs:  test:    runs-on: ${{ matrix.os }}    strategy:      matrix:        os: [ubuntu-latest, windows-latest, macos-latest]        node-version: [18, 20, 22]        exclude:          - os: windows-latest            node-version: 22      fail-fast: false

steps: - uses: actions/checkout@v4 - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - run: npx tsc --noEmit - run: npm test - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage-${{ matrix.os }}-${{ matrix.node-version }} path: coverage/

关键点:

  • fail-fast: false — 当其中一个作业失败时,不会停止其他作业。允许您立即看到所有问题。
  • exclude — 允许排除已知不工作的组合(例如,如果存在已知问题,则排除 Windows 上的 Node 22)。

博客

书籍推荐