CI/CD 流水线
相关源文件
本文档详细介绍了用于测试、构建和发布 code-server 的自动化工作流。它解释了代码更改如何被测试,以及如何创建和打包发布版,并将其发布到各种分发平台。
有关特定发布包格式的信息,请参阅 发布包。有关 npm 发布详情,请参阅 NPM 发布。
概述
code-server 项目采用强大的 CI/CD 流水线,构建于 GitHub Actions 之上,以实现自动化测试、构建和发布流程。此流水线可确保代码质量,促进一致性发布,并发布到多个分发渠道。
来源
构建工作流
构建工作流是 CI/CD 流水线的基石,它在每次拉取请求和推送到主分支时运行。
来源
构建工作流的关键组件
-
变更检测:工作流使用 dorny/paths-filter@v3 来确定已更改的文件,从而允许它有选择性地运行与这些更改相关的作业。
-
代码质量检查:
- Prettier 格式化
- TypeScript 代码检查
- GitHub Actions 工作流验证
- Helm Chart 检查
-
测试:
- 单元测试(带 Codecov 覆盖率报告)
- 使用 Playwright 进行端到端测试
- 带代理配置的端到端测试
-
构建流程:
- 构建 VS Code(或使用缓存版本)
- 构建 code-server
- 创建 npm 包工件以供后续作业使用
VS Code 集成
构建过程包含 VS Code 的缓存机制,以避免在可能的情况下重新构建
来源
发布工作流
发布工作流会创建包含不同平台包的草稿发布。它通过指定版本号手动触发。
来源
发布工作流的关键组件
-
版本管理:
- 接受版本输入(例如,“v4.9.1”)
- 更新 package.json 中的版本
- 更新 VS Code product.json 中的版本
-
跨平台打包:
- Linux 包(x86_64、arm64、armv7l)
- macOS 包(x86_64、arm64)
- npm 包准备
-
包格式:
- 适用于 Debian 系列发行的 .deb 包
- 适用于 Red Hat 系列发行的 .rpm 包
- 用于独立安装的 .tar.gz 归档
- 用于通过 npm 安装的 npm 包
-
GitHub 发布:
- 创建草稿 GitHub 发布
- 上传所有包到发布
- 设置讨论类别
发布工作流
发布工作流将发布的包分发到各个平台。它在 GitHub 发布被发布或手动触发时触发。
来源
发布工作流的关键组件
-
NPM 发布:
- 将 npm 包发布到 npm 注册表
- 使用 NPM_TOKEN 密钥进行身份验证
-
Homebrew 更新:
- 使用新版本更新 Homebrew 公式
- 如有必要,运行脚本以创建对 Homebrew 存储库的 PR
-
AUR 更新:
- 更新 AUR(Arch 用户存储库)包
- 创建到 code-server-aur 存储库的 PR
-
Docker 镜像发布:
- 从 GitHub 发布下载 .deb 和 .rpm 包
- 使用 Buildx 构建多架构 Docker 镜像
- 将镜像推送到 Docker Hub 和 GitHub Container Registry
- 使用版本和 latest 标签进行标记
安全扫描
安全扫描已集成到 CI/CD 流水线中,以识别和处理漏洞。
来源
安全扫描的关键组件
-
依赖项扫描:
- npm audit 检查 JavaScript 依赖项中的漏洞
- 在 package.json 更改时运行,并按计划运行
-
代码分析:
- CodeQL 执行静态分析以识别潜在的安全问题
- 使用自定义配置文件进行配置
-
容器扫描:
- Trivy 扫描 Docker 镜像中的漏洞
- 每晚运行一次
- 专注于高危和严重漏洞
-
报告:
- 结果上传到 GitHub 安全仪表板
- 使用 SARIF 格式进行结构化报告
发布流程中的手动步骤
虽然 CI/CD 流水线自动化了大部分发布流程,但仍需要一些手动步骤。
| 步骤 | 描述 |
|---|
| 1 | 检查变更日志是否列出了所有重要更改 |
| 2 | 使用发布日期更新变更日志 |
| 3 | 使用版本号手动触发草稿发布工作流 |
| 4 | 更新草稿发布描述中的变更日志内容 |
| 5 | 发布 GitHub 发布 |
| 6 | 在 Docker 镜像发布后,更新 Helm Chart 版本 |
对于发布候选版本
- 在版本号后添加
-rc.<数字> 后缀
- 发布时选择“预发布”
- 在最终发布之前,不要更新 Chart 版本或合并变更日志
来源
端到端发布流程
从代码更改到发布包的完整发布流程遵循此序列
来源
这个端到端流程确保 code-server 经过彻底测试,正确版本化,并通过多个渠道分发,以满足不同的用户安装偏好。