mirror of
https://github.com/cita-777/metapi.git
synced 2026-10-31 11:11:38 +08:00
* ``` feat(accounts): 支持批量添加API密钥连接 - 添加accessTokens字段到账户创建载荷模式,允许传递多个API密钥 - 实现批量API密钥解析功能,支持换行符、空格和逗号分隔 - 重构账户创建逻辑以支持单个和批量API密钥处理 - 在前端界面中添加批量API密钥输入检测和处理 - 添加批量创建结果返回和错误处理 - 更新验证流程以支持批量模式下的逐条验证 - 添加详细的批量API密钥测试用例 该更改允许用户一次提交多个API密钥,系统将为每个密钥创建独立的连接并参与负载均衡。 ``` * ``` fix(tokenRouter): 调整路由匹配优先级以优先匹配显示名称别名 当精确路由和显式组显示名称冲突时,现在优先选择显式组显示名称 而不是精确路由模式。这修正了路由决策逻辑,使显式组路由能够正 确覆盖精确模型匹配。 相关的测试用例已更新以反映新的匹配行为,确保显式组路由在冲 突情况下获得更高优先级。 ``` * ``` fix(accounts): 修复API密钥验证错误消息显示逻辑 当凭证模式不为apikey时显示会话令牌提示信息,否则显示API密钥验证失败信息 feat(accounts): 更新API密钥输入界面提示文本 将批量添加说明从输入框占位符移至独立提示文本, 使界面更清晰易懂 ``` * ``` feat(workflow): 在CI/CD工作流中使用动态Docker Hub镜像名称 - 在ci.yml和release.yml工作流中添加DOCKERHUB_IMAGE环境变量 - 将硬编码的Docker Hub用户名替换为从secrets.DOCKERHUB_USERNAME动态获取 - 更新docker.metadata-action配置以使用环境变量中的镜像名称 - 添加测试用例验证Docker Hub镜像名称的正确配置 ``` * fix(accounts): 修复批量创建回归并下沉创建流程
47 lines
2.3 KiB
TypeScript
47 lines
2.3 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import { readFileSync } from 'node:fs';
|
|
import { resolve } from 'node:path';
|
|
|
|
describe('docker workflows', () => {
|
|
it('publishes armv7 docker images in ci and release workflows', () => {
|
|
const ciWorkflow = readFileSync(resolve(process.cwd(), '.github/workflows/ci.yml'), 'utf8');
|
|
const releaseWorkflow = readFileSync(resolve(process.cwd(), '.github/workflows/release.yml'), 'utf8');
|
|
|
|
expect(ciWorkflow).toContain('arch: armv7');
|
|
expect(ciWorkflow).toContain('platform: linux/arm/v7');
|
|
expect(ciWorkflow).toContain('"${tag}-armv7"');
|
|
|
|
expect(releaseWorkflow).toContain('arch: armv7');
|
|
expect(releaseWorkflow).toContain('platform: linux/arm/v7');
|
|
expect(releaseWorkflow).toContain('"${tag}-armv7"');
|
|
});
|
|
|
|
it('derives Docker Hub image names from the configured username secret', () => {
|
|
const ciWorkflow = readFileSync(resolve(process.cwd(), '.github/workflows/ci.yml'), 'utf8');
|
|
const releaseWorkflow = readFileSync(resolve(process.cwd(), '.github/workflows/release.yml'), 'utf8');
|
|
|
|
expect(ciWorkflow).toContain('DOCKERHUB_IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/metapi');
|
|
expect(ciWorkflow).not.toContain('images: 1467078763/metapi');
|
|
|
|
expect(releaseWorkflow).toContain('DOCKERHUB_IMAGE: ${{ secrets.DOCKERHUB_USERNAME }}/metapi');
|
|
expect(releaseWorkflow).not.toContain('1467078763/metapi');
|
|
});
|
|
|
|
it('uses an armv7-capable node base image in the Dockerfile', () => {
|
|
const dockerfile = readFileSync(resolve(process.cwd(), 'docker/Dockerfile'), 'utf8');
|
|
|
|
expect(dockerfile).toContain('FROM node:22-bookworm-slim AS builder');
|
|
expect(dockerfile).toContain('FROM node:22-bookworm-slim');
|
|
});
|
|
|
|
it('keeps server docker builds isolated from desktop packaging dependencies', () => {
|
|
const dockerfile = readFileSync(resolve(process.cwd(), 'docker/Dockerfile'), 'utf8');
|
|
|
|
expect(dockerfile).toContain('npm ci --ignore-scripts --no-audit --no-fund');
|
|
expect(dockerfile).toContain('npm rebuild esbuild sharp better-sqlite3 --no-audit --no-fund');
|
|
expect(dockerfile).not.toContain('npm ci --no-audit --no-fund');
|
|
expect(dockerfile).toContain('RUN npm run build:web && npm run build:server');
|
|
expect(dockerfile).toContain('npm prune --omit=dev --no-audit --no-fund');
|
|
});
|
|
});
|