CI/CD 用于 TypeScript 项目:从零开始配置 GitHub Actions

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

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

开始课程

TypeScript 项目的 CI/CD 简介



现代软件开发离不开自动化。CI/CD(持续集成 / 持续交付)是一种实践,它使开发团队能够快速、安全地将变更交付到生产环境。对于 TypeScript 项目,尤其是在 Node.js 生态系统中,配置 CI/CD 管道变得至关重要。



在本文中,我们将介绍如何使用 GitHub Actions 为 TypeScript 项目配置一个完整的 CI/CD 管道。您将学习如何自动化运行测试、构建项目以及部署到托管平台。本文面向已经熟悉 TypeScript 并希望引入现代 DevOps 实践的开发者。



什么是 GitHub Actions,为什么它适合 TypeScript



GitHub Actions 是一个内置的 CI/CD 系统,允许您直接在 GitHub 仓库中创建自动化工作流程(workflows)。主要优势包括:



  • 免费额度 — 公共仓库每月提供 2000 分钟的构建时间。
  • 与 GitHub 集成 — 无需配置第三方服务。
  • 灵活性 — 通过运行 shell 命令支持任何语言,包括 TypeScript。
  • 庞大的生态系统 — 现成的 actions 可用于部署到 AWS、Vercel、Netlify 等平台。


对于 TypeScript 项目,GitHub Actions 是理想的选择,因为它可以轻松运行 npm 或 yarn 命令,使用依赖缓存以及并行任务。



Workflow 文件的基本结构



GitHub Actions 中的 Workflow 使用 YAML 文件描述,这些文件存储在 .github/workflows/ 目录中。我们来看一个 TypeScript 项目的最小配置。



创建文件 .github/workflows/ci.yml:



name: CI Pipeline

on: push: branches: [ main, develop ] pull_request: branches: [ main ]

jobs: build-and-test: runs-on: ubuntu-latest

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

steps: - name: Checkout repository uses: actions/checkout@v4

- name: Setup Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }}

- name: Install dependencies run: npm ci

- name: Lint check run: npm run lint

- name: Type check run: npx tsc --noEmit

- name: Run tests run: npm test

- name: Build project run: npm run build


关键元素解析:

  • on — 触发条件(推送到 main/develop,pull request)。
  • runs-on — 执行环境操作系统(ubuntu-latest)。
  • matrix — 在不同 Node.js 版本(18 和 20)上并行运行。
  • actions/checkout — 用于克隆仓库的标准 action。
  • actions/setup-node — 安装指定版本的 Node.js。
  • npm ci — 从 lock 文件进行干净的依赖安装(比 npm install 更快更可靠)。


添加缓存以加速构建



为了避免每次都下载依赖,可以添加缓存:



      - name: Cache Node.js modules        uses: actions/cache@v3        with:          path: ~/.npm          key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}          restore-keys: |            ${{ runner.os }}-node-


此步骤基于 package-lock.json 的哈希值缓存 ~/.npm。在后续运行时,如果依赖没有变化,将恢复缓存,从而节省 30-60 秒的时间。

博客

书籍推荐