n8n/packages/testing/playwright/scripts/build-test-image.mjs
Declan Carroll 4a613a8758
build: Revert n8n image to alpine 3.22 to restore graphicsmagick GPL pin (#30673)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-19 08:15:34 +00:00

78 lines
2.3 KiB
JavaScript

#!/usr/bin/env node
import { execSync } from 'child_process';
import { writeFileSync, existsSync, mkdirSync, copyFileSync, rmSync } from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const repoRoot = path.resolve(__dirname, '../../../..');
function execCommand(command, options = {}) {
return execSync(command, { cwd: repoRoot, stdio: 'inherit', ...options });
}
function cleanup(paths = []) {
paths.forEach((p) => {
try {
rmSync(p, { recursive: true, force: true });
} catch {}
});
}
function buildTestImage(targetImage) {
const tempBuildDir = path.join(repoRoot, 'temp-build-e2e');
const dockerfilePath = path.join(tempBuildDir, 'Dockerfile');
const tempTag = `${targetImage}-temp-${Date.now()}`;
try {
console.log(`🎯 Preparing test image from ${targetImage}`);
// Build CLI with e2e controller
execCommand('pnpm turbo build --filter=n8n', {
env: { ...process.env, INCLUDE_TEST_CONTROLLER: 'true' },
});
// Pull base image
execCommand(`docker pull ${targetImage}`);
// Verify controller exists
const controllerPath = path.join(repoRoot, 'packages/cli/dist/controllers/e2e.controller.js');
if (!existsSync(controllerPath)) {
throw new Error(`E2E controller not found. Build may have failed.`);
}
// Setup temp build context (self-contained, decoupled from repo .dockerignore)
cleanup([tempBuildDir]);
mkdirSync(tempBuildDir, { recursive: true });
copyFileSync(controllerPath, path.join(tempBuildDir, 'e2e.controller.js'));
writeFileSync(
dockerfilePath,
`FROM ${targetImage}
COPY e2e.controller.js /usr/local/lib/node_modules/n8n/dist/controllers/e2e.controller.js
`,
);
// Build with the temp dir as the build context — avoids repo-root .dockerignore whitelist
execCommand(`docker build -f ${dockerfilePath} -t ${tempTag} ${tempBuildDir}`);
execCommand(`docker rmi ${targetImage}`);
execCommand(`docker tag ${tempTag} ${targetImage}`);
execCommand(`docker rmi ${tempTag}`);
console.log(`✅ Modified ${targetImage} with e2e controller`);
} finally {
cleanup([tempBuildDir]);
}
}
// Main execution
const targetImage = process.argv[2] || 'n8nio/n8n:nightly';
try {
buildTestImage(targetImage);
} catch (error) {
console.error('❌ Failed:', error.message);
process.exit(1);
}