Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: separate C and CL build paths — variant parameter

POST /native-build now accepts {"variant": "c"|"cl"|"both"}.
Default is "c". Each variant runs its own full pipeline independently
instead of CL piggybacking on the C build as phase 5.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

+78 -73
+77 -73
oven/native-builder.mjs
··· 378 378 379 379 job.percent = 30; 380 380 381 - // Phase 2: Docker run → compile binary + initramfs + kernel 382 - addLogLine(job, "stdout", "Phase 2: Compiling kernel in Docker..."); 383 - const cidFile = `/tmp/oven-cid-${job.id}`; 384 - await runPhase(job, "build", "bash", ["-c", [ 385 - `CID=$(docker create -e AC_BUILD_NAME=${buildName} ac-os-builder)`, 386 - `echo $CID > ${cidFile}`, 387 - `docker start -a $CID`, 388 - ].join(" && ")], repoDir); 389 - 390 - job.percent = 75; 391 - 392 - // Phase 3: Extract vmlinuz + ISO from container 393 - addLogLine(job, "stdout", "Phase 3: Extracting kernel + ISO..."); 394 - const cid = (await fs.readFile(cidFile, "utf8")).trim(); 395 - const isoOut = `/tmp/oven-iso-${job.id}`; 396 - await runPhase(job, "extract", "bash", ["-c", 397 - `docker cp ${cid}:/tmp/ac-build/vmlinuz ${vmlinuzOut} && docker cp ${cid}:/tmp/ac-build/ac-os.iso ${isoOut} 2>/dev/null; docker rm ${cid} >/dev/null` 398 - ], repoDir); 399 - 400 - job.percent = 80; 401 - 402 - // Phase 4: Upload vmlinuz + ISO to DO Spaces CDN 403 - // Place ISO next to vmlinuz so upload-release.sh finds it as a sibling 404 - // and uploads both with the same build name (no separate --iso call). 405 - addLogLine(job, "stdout", "Phase 4: Uploading to CDN..."); 381 + // Determine variant: "c" (default), "cl", or "both" 382 + const variant = job.variant || "c"; 383 + const buildC = variant === "c" || variant === "both"; 384 + const buildCL = variant === "cl" || variant === "both"; 406 385 const uploadScript = path.join(NATIVE_DIR, "scripts/upload-release.sh"); 407 386 const uploadEnv = { 408 387 DO_SPACES_KEY: process.env.DO_SPACES_KEY || process.env.ART_SPACES_KEY || "", 409 - DO_SPACES_SECRET: 410 - process.env.DO_SPACES_SECRET || process.env.ART_SPACES_SECRET || "", 411 - ALLOW_DIRTY_UPLOAD: "1", // oven builds from a managed git clone 412 - AC_BUILD_NAME: buildName, // reuse compile-time name so kernel matches CDN 388 + DO_SPACES_SECRET: process.env.DO_SPACES_SECRET || process.env.ART_SPACES_SECRET || "", 389 + ALLOW_DIRTY_UPLOAD: "1", 390 + AC_BUILD_NAME: buildName, 413 391 }; 414 - const uploadDir = `/tmp/oven-upload-${job.id}`; 415 - const vmlinuzUpload = `${uploadDir}/vmlinuz`; 416 - const isoUpload = `${uploadDir}/ac-os.iso`; 417 - await fs.mkdir(uploadDir, { recursive: true }); 418 - await fs.rename(vmlinuzOut, vmlinuzUpload); 419 - try { await fs.rename(isoOut, isoUpload); } catch {} 420 - await runPhase(job, "upload", "bash", [uploadScript, vmlinuzUpload], NATIVE_DIR, uploadEnv); 421 392 422 - // Cleanup C build 423 - try { await fs.rm(uploadDir, { recursive: true }); } catch {} 424 - try { await fs.unlink(cidFile); } catch {} 393 + // ── C variant ── 394 + if (buildC) { 395 + addLogLine(job, "stdout", "Phase 2: Compiling C kernel in Docker..."); 396 + const cidFile = `/tmp/oven-cid-${job.id}`; 397 + await runPhase(job, "build", "bash", ["-c", [ 398 + `CID=$(docker create -e AC_BUILD_NAME=${buildName} ac-os-builder)`, 399 + `echo $CID > ${cidFile}`, 400 + `docker start -a $CID`, 401 + ].join(" && ")], repoDir); 425 402 426 - job.percent = 85; 403 + job.percent = 75; 427 404 428 - // Phase 5: Build CL variant (non-blocking — failure doesn't fail the job) 429 - const clChanged = (job.changedPaths || "").includes("fedac/native/cl/"); 430 - if (clChanged) { 431 - try { 432 - addLogLine(job, "stdout", "Phase 5: Building Common Lisp variant..."); 433 - const clCidFile = `/tmp/oven-cl-cid-${job.id}`; 434 - const clVmlinuzOut = `/tmp/oven-cl-vmlinuz-${job.id}`; 435 - const clBuildName = job.buildName || `cl-${job.ref.slice(0, 7)}`; 405 + addLogLine(job, "stdout", "Phase 3: Extracting C kernel + ISO..."); 406 + const cid = (await fs.readFile(cidFile, "utf8")).trim(); 407 + const isoOut = `/tmp/oven-iso-${job.id}`; 408 + await runPhase(job, "extract", "bash", ["-c", 409 + `docker cp ${cid}:/tmp/ac-build/vmlinuz ${vmlinuzOut} && docker cp ${cid}:/tmp/ac-build/ac-os.iso ${isoOut} 2>/dev/null; docker rm ${cid} >/dev/null` 410 + ], repoDir); 436 411 437 - await runPhase(job, "cl-build", "bash", ["-c", [ 438 - `CID=$(docker create -e AC_BUILD_NAME=${clBuildName} -e AC_BUILD_VARIANT=cl -e AC_BUILD_LISP=1 ac-os-builder)`, 439 - `echo $CID > ${clCidFile}`, 440 - `docker start -a $CID`, 441 - ].join(" && ")], repoDir); 412 + job.percent = 80; 413 + 414 + addLogLine(job, "stdout", "Phase 4: Uploading C variant to CDN..."); 415 + const uploadDir = `/tmp/oven-upload-${job.id}`; 416 + const vmlinuzUpload = `${uploadDir}/vmlinuz`; 417 + const isoUpload = `${uploadDir}/ac-os.iso`; 418 + await fs.mkdir(uploadDir, { recursive: true }); 419 + await fs.rename(vmlinuzOut, vmlinuzUpload); 420 + try { await fs.rename(isoOut, isoUpload); } catch {} 421 + await runPhase(job, "upload", "bash", [uploadScript, vmlinuzUpload], NATIVE_DIR, uploadEnv); 422 + 423 + try { await fs.rm(uploadDir, { recursive: true }); } catch {} 424 + try { await fs.unlink(cidFile); } catch {} 425 + addLogLine(job, "stdout", "C variant uploaded successfully"); 426 + } 427 + 428 + job.percent = buildCL ? 50 : 90; 429 + 430 + // ── CL variant ── 431 + if (buildCL) { 432 + addLogLine(job, "stdout", `Phase ${buildC ? 5 : 2}: Compiling CL kernel in Docker...`); 433 + const clCidFile = `/tmp/oven-cl-cid-${job.id}`; 434 + const clVmlinuzOut = `/tmp/oven-cl-vmlinuz-${job.id}`; 435 + 436 + await runPhase(job, "cl-build", "bash", ["-c", [ 437 + `CID=$(docker create -e AC_BUILD_NAME=${buildName} -e AC_BUILD_VARIANT=cl -e AC_BUILD_LISP=1 ac-os-builder)`, 438 + `echo $CID > ${clCidFile}`, 439 + `docker start -a $CID`, 440 + ].join(" && ")], repoDir); 441 + 442 + job.percent = buildC ? 85 : 75; 443 + 444 + addLogLine(job, "stdout", "Extracting CL kernel..."); 445 + const clCid = (await fs.readFile(clCidFile, "utf8")).trim(); 446 + const clIsoOut = `/tmp/oven-cl-iso-${job.id}`; 447 + await runPhase(job, "cl-extract", "bash", ["-c", 448 + `docker cp ${clCid}:/tmp/ac-build/vmlinuz ${clVmlinuzOut} && docker cp ${clCid}:/tmp/ac-build/ac-os.iso ${clIsoOut} 2>/dev/null; docker rm ${clCid} >/dev/null` 449 + ], repoDir); 442 450 443 - const clCid = (await fs.readFile(clCidFile, "utf8")).trim(); 444 - await runPhase(job, "cl-extract", "bash", ["-c", 445 - `docker cp ${clCid}:/tmp/ac-build/vmlinuz ${clVmlinuzOut} && docker rm ${clCid} >/dev/null` 446 - ], repoDir); 451 + job.percent = buildC ? 90 : 80; 447 452 448 - // Upload CL variant to separate OTA channel 449 - addLogLine(job, "stdout", "Uploading CL variant to CDN..."); 450 - const uploadScript = path.join(NATIVE_DIR, "scripts/upload-release.sh"); 451 - await runPhase(job, "cl-upload", "bash", [uploadScript, clVmlinuzOut], NATIVE_DIR, { 452 - DO_SPACES_KEY: process.env.DO_SPACES_KEY || process.env.ART_SPACES_KEY || "", 453 - DO_SPACES_SECRET: process.env.DO_SPACES_SECRET || process.env.ART_SPACES_SECRET || "", 454 - OTA_CHANNEL: "cl", // uploads to os/cl-native-notepat-latest.vmlinuz 455 - ALLOW_DIRTY_UPLOAD: "1", 456 - AC_BUILD_NAME: clBuildName, 457 - }); 453 + addLogLine(job, "stdout", "Uploading CL variant to CDN..."); 454 + const clUploadDir = `/tmp/oven-cl-upload-${job.id}`; 455 + const clVmlinuzUpload = `${clUploadDir}/vmlinuz`; 456 + const clIsoUpload = `${clUploadDir}/ac-os.iso`; 457 + await fs.mkdir(clUploadDir, { recursive: true }); 458 + await fs.rename(clVmlinuzOut, clVmlinuzUpload); 459 + try { await fs.rename(clIsoOut, clIsoUpload); } catch {} 460 + await runPhase(job, "cl-upload", "bash", [uploadScript, clVmlinuzUpload], NATIVE_DIR, { 461 + ...uploadEnv, 462 + OTA_CHANNEL: "cl", 463 + }); 458 464 459 - try { await fs.unlink(clVmlinuzOut); } catch {} 460 - try { await fs.unlink(clCidFile); } catch {} 461 - addLogLine(job, "stdout", "CL variant uploaded successfully"); 462 - } catch (clErr) { 463 - addLogLine(job, "stderr", `CL build failed (non-fatal): ${clErr.message}`); 464 - } 465 + try { await fs.rm(clUploadDir, { recursive: true }); } catch {} 466 + try { await fs.unlink(clCidFile); } catch {} 467 + addLogLine(job, "stdout", "CL variant uploaded successfully"); 465 468 } 466 469 467 470 job.status = "success"; ··· 508 511 exitCode: null, 509 512 error: null, 510 513 changedPaths: options.changed_paths || "", 514 + variant: options.variant || "c", 511 515 logs: [], 512 516 }; 513 517
+1
oven/server.mjs
··· 3480 3480 const job = await startNativeBuild({ 3481 3481 ref: req.body?.ref || 'unknown', 3482 3482 changed_paths: req.body?.changed_paths || '', 3483 + variant: req.body?.variant || 'c', // "c", "cl", or "both" 3483 3484 }); 3484 3485 addServerLog('info', '🔨', `Native OTA build started: ${job.id} (ref=${job.ref}, flags=${job.flags.join(' ') || 'none'})`); 3485 3486 return res.status(202).json(job);