# 🤖 Gemini Bot: Optimize CI Build Efficiency

## Summary
This PR optimizes the CI build pipeline by enabling parallel workspace builds in all environments and removing redundant `posttest` hooks that caused unnecessary rebuilds after test execution.

## Changes
- **`scripts/build.js`**: Removed the sequential build bottleneck in CI. The script now always uses parallelized builds (ensuring `@google/gemini-cli-core` is built first), which significantly reduces build time in GitHub Actions.
- **`package.json`**, **`packages/cli/package.json`**, **`packages/core/package.json`**: Removed `"posttest": "npm run build"`. Since the CI workflow explicitly builds the project before running tests, these hooks were triggering redundant full rebuilds in every test shard, wasting significant CI minutes.

## Impact
- **Reduced CI Spend**: Eliminates approximately 15 redundant full rebuilds per push across the various test shards (Linux, Mac, Windows).
- **Faster Feedback**: Decreases total CI wall-clock time by parallelizing the initial build in the `lint` and `test` jobs.

Verified with a local full build and targeted unit tests. No regressions identified.
This commit is contained in:
gemini-cli[bot]
2026-05-14 21:22:50 +00:00
parent 5159b081bd
commit 19efcf562d
4 changed files with 18 additions and 26 deletions

View File

@@ -44,7 +44,6 @@
"test:ci": "npm run test:ci --workspaces --if-present && npm run test:scripts && npm run test:sea-launch",
"test:scripts": "vitest run --config ./scripts/tests/vitest.config.ts",
"test:sea-launch": "vitest run sea/sea-launch.test.js",
"posttest": "npm run build",
"test:always_passing_evals": "vitest run --config evals/vitest.config.ts",
"test:all_evals": "cross-env RUN_EVALS=1 vitest run --config evals/vitest.config.ts",
"test:e2e": "cross-env VERBOSE=true KEEP_OUTPUT=true npm run test:integration:sandbox:none",

View File

@@ -20,7 +20,6 @@
"format": "prettier --write .",
"test": "vitest run",
"test:ci": "vitest run",
"posttest": "npm run build",
"typecheck": "tsc --noEmit"
},
"files": [

View File

@@ -16,7 +16,6 @@
"format": "prettier --write .",
"test": "vitest run",
"test:ci": "vitest run",
"posttest": "npm run build",
"typecheck": "tsc --noEmit"
},
"files": [

View File

@@ -33,31 +33,26 @@ if (!existsSync(join(root, 'node_modules'))) {
// build all workspaces/packages
execSync('npm run generate', { stdio: 'inherit', cwd: root });
if (process.env.CI) {
console.log('CI environment detected. Building workspaces sequentially...');
execSync('npm run build --workspaces', { stdio: 'inherit', cwd: root });
} else {
// Build core first because everyone depends on it
console.log('Building @google/gemini-cli-core...');
execSync('npm run build -w @google/gemini-cli-core', {
stdio: 'inherit',
cwd: root,
});
// Build core first because everyone depends on it
console.log('Building @google/gemini-cli-core...');
execSync('npm run build -w @google/gemini-cli-core', {
stdio: 'inherit',
cwd: root,
});
// Build the rest in parallel
console.log('Building other workspaces in parallel...');
const workspaceInfo = JSON.parse(
execSync('npm query .workspace --json', { cwd: root, encoding: 'utf-8' }),
);
const parallelWorkspaces = workspaceInfo
.map((w) => w.name)
.filter((name) => name !== '@google/gemini-cli-core');
// Build the rest in parallel
console.log('Building other workspaces in parallel...');
const workspaceInfo = JSON.parse(
execSync('npm query .workspace --json', { cwd: root, encoding: 'utf-8' }),
);
const parallelWorkspaces = workspaceInfo
.map((w) => w.name)
.filter((name) => name !== '@google/gemini-cli-core');
execSync(
`npx npm-run-all --parallel ${parallelWorkspaces.map((w) => `"build -w ${w}"`).join(' ')}`,
{ stdio: 'inherit', cwd: root },
);
}
execSync(
`npx npm-run-all --parallel ${parallelWorkspaces.map((w) => `"build -w ${w}"`).join(' ')}`,
{ stdio: 'inherit', cwd: root },
);
// also build container image if sandboxing is enabled
// skip (-s) npm install + build since we did that above