forked from boos/BoosAPI
88f40e91f7
The root checkout already contained a large in-progress proxy, transformer, and settings refactor. This commit captures that exact work on a dedicated local dev branch without disturbing the original dirty worktree, so the changes can be continued or split from dev instead of living only as uncommitted state. Constraint: The source checkout was already dirty on another branch, so the move had to preserve that worktree while excluding local .idea and .omx residue from the commit Rejected: Switch the dirty root checkout directly to dev | risked disrupting the original branch and in-progress state Confidence: medium Scope-risk: broad Reversibility: clean Directive: Treat this as a transfer snapshot; fix the failing oauth/accountTokens/normalized/docs test regressions before merge or publication Tested: git diff --check; npm run typecheck; npm run repo:drift-check Not-tested: Clean test pass; npm test currently fails in oauth routes, accountTokens sync, shared normalized helpers, gemini route expectations, architecture-boundaries, and docs vitepress config
54 lines
2.6 KiB
TypeScript
54 lines
2.6 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('avoids buildkit-only frontend syntax so managed docker builders can parse it reliably', () => {
|
|
const dockerfile = readFileSync(resolve(process.cwd(), 'docker/Dockerfile'), 'utf8');
|
|
|
|
expect(dockerfile).not.toContain('# syntax=docker/dockerfile:');
|
|
expect(dockerfile).not.toContain('RUN --mount=type=cache');
|
|
});
|
|
|
|
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');
|
|
});
|
|
});
|