Uppy CI/CD集成:自动化测试与部署上传系统
你是否还在为文件上传系统的测试部署流程繁琐而烦恼?每次更新都需要手动运行测试、打包代码、上传到分发系统,不仅耗时还容易出错。本文将带你一文掌握Uppy的CI/CD全流程自动化,从代码提交到生产环境部署,让上传系统的迭代效率提升10倍!
读完本文你将学到:
- 如何利用GitHub Actions实现Uppy自动化测试
- 配置文件上传系统的持续部署流程
- 解决大型文件上传测试中的常见问题
- 构建稳定可靠的文件上传服务发布管道
Uppy CI/CD流程概览
Uppy作为一款开源的文件上传器,其自身的开发流程已经实现了完整的CI/CD集成。项目通过GitHub Actions实现了从代码提交到自动测试、构建、发布的全流程自动化。核心流程包括:代码检查→单元测试→类型验证→构建打包→分发系统部署→镜像发布。
项目的CI/CD配置主要集中在.github/workflows/目录下,包含多个工作流文件,分别负责不同的自动化任务:
- ci.yml:主CI工作流,处理测试和构建
- release.yml:发布流程,处理版本更新和部署
- e2e.yml:端到端测试
- bundlers.yml:打包工具兼容性测试
自动化测试配置详解
Uppy的测试策略采用多层次验证机制,确保代码质量和功能稳定性。在.github/workflows/ci.yml中定义了三个关键测试阶段:单元测试、类型检查和代码 linting。
单元测试与集成测试
单元测试阶段使用Jest作为测试框架,配合Playwright进行浏览器环境测试。核心配置如下:
jobs:
unit_tests:
name: Tests
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v5
- name: Install dependencies
run: corepack yarn install
- name: Install Playwright Browsers
run: corepack yarn workspace @uppy/dashboard playwright install --with-deps
- name: Build
run: corepack yarn run build
- name: Run tests
run: corepack yarn run test
env:
COMPANION_DATADIR: ./output
COMPANION_DOMAIN: localhost:3020
COMPANION_PROTOCOL: http
COMPANION_REDIS_URL: redis://localhost:6379
测试覆盖率和执行情况可以通过查看GitHub Actions的运行结果获得,这确保了每次代码提交都经过全面的功能验证。
类型检查与代码质量
Uppy使用TypeScript开发,类型检查是确保代码质量的重要环节:
types:
name: Types
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v5
- name: Install dependencies
run: corepack yarn install
- run: corepack yarn run typecheck
同时,代码风格和格式通过ESLint和Prettier进行检查,配置在biome.json中:
lint_js:
name: Lint
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v5
- name: Install dependencies
run: corepack yarn workspaces focus @uppy-dev/build
- name: Run linter
run: corepack yarn run check:ci
持续部署流程实现
Uppy的部署流程在.github/workflows/release.yml中定义,实现了从版本更新到多平台部署的自动化。
版本管理与发布
项目使用Changesets进行版本管理和CHANGELOG生成,当合并包含changeset的PR到main分支时,自动触发发布流程:
release:
name: Release
runs-on: ubuntu-latest
steps:
- name: Checkout Repo
uses: actions/checkout@v5
with:
fetch-depth: 2
- name: Setup Node.js
uses: actions/setup-node@v5
with:
node-version: lts/*
- name: Install dependencies
run: corepack yarn install --immutable
- name: Build
run: corepack yarn build
- name: Create Release Pull Request or Publish
id: changesets
uses: changesets/action@v1
with:
version: corepack yarn run version
publish: corepack yarn run release
commit: '[ci] release'
title: '[ci] release'
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
版本变更记录会自动更新到CHANGELOG.md,记录所有功能更新和bug修复。
分发系统部署与容器镜像
发布成功后,系统会自动将构建产物上传到分发系统,并构建容器镜像推送到容器镜像仓库:
- name: Upload `uppy` to分发系统
if: steps.changesets.outputs.published == 'true'
run: node packages/uppy/upload-to-cdn.js uppy
env:
EDGLY_KEY: ${{secrets.EDGLY_KEY}}
EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
- name: Upload `@uppy/locales` to分发系统 if it was released
if: steps.changesets.outputs.published == 'true'
run: node packages/uppy/upload-to-cdn.js @uppy/locales
env:
EDGLY_KEY: ${{secrets.EDGLY_KEY}}
EDGLY_SECRET: ${{secrets.EDGLY_SECRET}}
容器镜像构建与推送:
docker:
name: Container Registry
needs: release
if: ${{ needs.release.outputs.published == 'true' && needs.release.outputs.companionWasReleased }}
runs-on: ubuntu-latest
steps:
- name: Checkout sources
uses: actions/checkout@v5
- name: Docker meta
id: docker_meta
uses: docker/metadata-action@v5.8.0
with:
images: transloadit/companion
tags: |
type=edge
type=semver,pattern={{version}},value=${{ needs.release.outputs.companionWasReleased }}
type=raw,value=latest,enable=true
- name: Build and push
uses: docker/build-push-action@v6.15.0
with:
push: true
context: .
platforms: linux/amd64,linux/arm64
file: Dockerfile
tags: ${{ steps.docker_meta.outputs.tags }}
实际应用:集成到你的项目
要在自己的项目中集成Uppy并配置CI/CD流程,可以参考以下步骤:
1. 安装Uppy核心包
npm install @uppy/core @uppy/dashboard @uppy/tus
2. 基础使用示例
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Tus from '@uppy/tus'
const uppy = new Uppy()
.use(Dashboard, { trigger: '#select-files' })
.use(Tus, { endpoint: 'https://tusd.tusdemo.net/files/' })
.on('complete', (result) => {
console.log('Upload result:', result)
})
3. 添加测试用例
创建测试文件测试上传功能,例如:
import { test, expect } from '@playwright/test';
test('should upload a file successfully', async ({ page }) => {
await page.goto('/');
await page.setInputFiles('input[type="file"]', 'test-file.txt');
await page.click('button[type="submit"]');
await expect(page.locator('.upload-success')).toBeVisible();
});
4. 配置CI/CD工作流
创建.github/workflows/uppy-ci.yml文件,配置测试和部署流程:
name: Uppy CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v5
with:
node-version: lts/*
- run: npm install
- run: npm test
常见问题与解决方案
在配置和使用Uppy的CI/CD流程时,可能会遇到以下常见问题:
测试环境中的文件上传限制
问题:CI环境中上传大文件时经常超时或失败。
解决方案:使用Tus协议的断点续传功能,并在测试中设置合理的超时时间:
.use(Tus, {
endpoint: 'https://tusd.tusdemo.net/files/',
chunkSize: 5 * 1024 * 1024, // 5MB chunks
retryDelays: [0, 1000, 3000, 5000]
})
跨浏览器兼容性测试
问题:不同浏览器中的上传行为不一致。
解决方案:使用Playwright的多浏览器测试能力,在ci.yml中配置:
- name: Install Playwright Browsers
run: corepack yarn workspace @uppy/dashboard playwright install --with-deps
- name: Run cross-browser tests
run: corepack yarn run test:browsers
分发系统缓存问题
问题:新版本发布后,用户仍加载旧版本资源。
解决方案:利用版本化URL和缓存控制策略,Uppy的分发系统上传脚本packages/uppy/upload-to-cdn.js已经内置了这些机制。
总结与最佳实践
通过本文的介绍,我们了解了Uppy项目如何通过GitHub Actions实现完整的CI/CD流程,包括自动化测试、构建、发布和部署。关键最佳实践总结如下:
- 多层次测试:结合单元测试、类型检查和端到端测试,确保代码质量
- 自动化版本管理:使用Changesets自动处理版本号和更新日志
- 多平台部署:同时支持npm包、分发系统和容器镜像
- 安全的密钥管理:利用GitHub Secrets存储敏感信息
- 构建产物缓存:优化CI流程,减少重复依赖安装时间
Uppy的CI/CD流程不仅保证了自身代码质量,也为开发者提供了一个可参考的自动化部署范例。通过这些实践,可以显著提升文件上传系统的开发效率和可靠性。
想要了解更多细节,可以查阅项目的README.md和官方文档,开始构建你自己的自动化文件上传系统吧!
点赞收藏本文,关注Uppy项目获取更多文件上传最佳实践和CI/CD技巧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




