引言:为什么需要高级 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)。