Skip to content

Commit

Permalink
feat: reclaim disk space after each test
Browse files Browse the repository at this point in the history
  • Loading branch information
turadg committed Jan 26, 2024
1 parent fecdde0 commit 968cad4
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 21 deletions.
31 changes: 22 additions & 9 deletions packages/synthetic-chain/cli.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
#!/usr/bin/env tsx

import { parseArgs } from 'node:util';
import path from 'node:path';
import { execSync } from 'node:child_process';
import path from 'node:path';
import { parseArgs } from 'node:util';
import {
bakeTarget,
buildProposalSubmissions,
bakeImages,
readBuildConfig,
} from './src/cli/build.js';
import {
writeBakefileProposals,
writeDockerfile,
} from './src/cli/dockerfileGen.js';
import { matchOneProposal, readProposals } from './src/cli/proposals.js';
import { debugTestImage, runTestImages } from './src/cli/run.js';
import { runDoctor } from './src/cli/doctor.js';
import { imageNameForProposal, matchOneProposal, readProposals } from './src/cli/proposals.js';
import { debugTestImage, runTestImage } from './src/cli/run.js';

const { positionals, values } = parseArgs({
options: {
Expand Down Expand Up @@ -62,18 +62,31 @@ const prepareDockerBuild = () => {
switch (cmd) {
case 'build': {
prepareDockerBuild();
bakeImages('use', values.dry);
bakeTarget('use', values.dry);
break;
}
case 'test':
// Always rebuild all test images to keep it simple. With the "use" stages
// cached, these are pretty fast building doesn't run agd.
prepareDockerBuild();
bakeImages('test', values.dry);

if (values.debug) {
debugTestImage(matchOneProposal(proposals, match!));
const proposal = matchOneProposal(proposals, match!);
bakeTarget(imageNameForProposal(proposal, 'test').target, values.dry);
debugTestImage(proposal);
// don't bother to delete the test image because there's just one
// and the user probably wants to run it again.
} else {
runTestImages(proposals);
for (const proposal of proposals) {
const image = imageNameForProposal(proposal, 'test');
bakeTarget(image.target, values.dry);
runTestImage(proposal);
// delete the image to reclaim disk space. The next build
// will use the build cache.
execSync('docker system df', { stdio: 'inherit' });
execSync(`docker rmi ${image.name}`, { stdio: 'inherit' });
execSync('docker system df', { stdio: 'inherit' });
}
}
break;
case 'doctor':
Expand Down
11 changes: 7 additions & 4 deletions packages/synthetic-chain/src/cli/build.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,16 @@ export const buildProposalSubmissions = (proposals: ProposalInfo[]) => {

/**
* Bake images using the docker buildx bake command.
*
* Note this uses `--load` which pushes the completed images to the builder,
* consuming 2-3 GB per image.
* @see {@link https://docs.docker.com/engine/reference/commandline/buildx_build/#load}
*
* @param matrix - The group target
* @param target - The image or group target
* @param [dry] - Whether to skip building and just print the build config.
*/
export const bakeImages = (matrix: 'test' | 'use', dry = false) => {
// https://docs.docker.com/engine/reference/commandline/buildx_build/#load
const cmd = `docker buildx bake --load ${matrix} ${dry ? '--print' : ''}`;
export const bakeTarget = (target: string, dry = false) => {
const cmd = `docker buildx bake --load ${target} ${dry ? '--print' : ''}`;
console.log(cmd);
execSync(cmd, { stdio: 'inherit' });
};
14 changes: 6 additions & 8 deletions packages/synthetic-chain/src/cli/run.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
import { execSync } from 'node:child_process';
import { ProposalInfo, imageNameForProposal } from './proposals.js';

export const runTestImages = (proposals: ProposalInfo[]) => {
for (const proposal of proposals) {
console.log(`Running test image for proposal ${proposal.proposalName}`);
const { name } = imageNameForProposal(proposal, 'test');
// 'rm' to remove the container when it exits
const cmd = `docker run --rm ${name}`;
execSync(cmd, { stdio: 'inherit' });
}
export const runTestImage = (proposal: ProposalInfo) => {
console.log(`Running test image for proposal ${proposal.proposalName}`);
const { name } = imageNameForProposal(proposal, 'test');
// 'rm' to remove the container when it exits
const cmd = `docker run --rm ${name}`;
execSync(cmd, { stdio: 'inherit' });
};

export const debugTestImage = (proposal: ProposalInfo) => {
Expand Down

0 comments on commit 968cad4

Please sign in to comment.