Skip to content

Commit 60b1350

Browse files
committed
feat(build): add docker packager
1 parent f31e198 commit 60b1350

File tree

13 files changed

+128
-619
lines changed

13 files changed

+128
-619
lines changed

labs/playground1/Makefile

+1-5
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,9 @@
22
.PHONY: install build start pkg-core pkg-build pkg-serve pkg-cli clean pkg-extension-driver-duckdb
33

44
# start vulcan server (default goal)
5-
start: install build test-data/moma.db ../../node_modules
5+
start: build test-data/moma.db ../../node_modules
66
@vulcan start
77

8-
# install node modules and like playground extensions
9-
install:
10-
@yarn;
11-
128
# build the required packages
139
build: pkg-core pkg-build pkg-serve pkg-cli pkg-extension-driver-duckdb
1410

labs/playground1/package.json

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
{
22
"name": "my-first-vulcan-project",
33
"dependencies": {
4-
"lodash": "^4.17.21",
5-
"redoc": "^2.0.0-rc.76"
4+
"@vulcan-sql/core": "0.2.0-dev.20220922.0",
5+
"@vulcan-sql/extension-driver-duckdb": "0.2.0-dev.20220919.0",
6+
"@vulcan-sql/serve": "0.2.0-dev.20220922.0"
7+
},
8+
"devDependencies": {
9+
"@vulcan-sql/build": "0.2.0-dev.20220922.0"
610
}
711
}

labs/playground1/yarn.lock

-607
This file was deleted.

packages/build/project.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"tsConfig": "packages/build/tsconfig.lib.json",
2424
"assets": [
2525
"packages/build/*.md",
26-
"packages/build/src/models/extensions/packager/assets/**/*"
26+
"packages/build/src/models/extensions/packager/assets/**/*",
27+
"packages/build/src/lib/packager/dockerPackager/assets/**/*"
2728
],
2829
"buildableProjectDepsInPackageJsonType": "dependencies"
2930
},
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Use bullseye for glibc > 2.29
2+
FROM node:16-bullseye AS build
3+
4+
# create app directory
5+
WORKDIR /usr/app
6+
7+
# install dependencies
8+
COPY package.json .
9+
RUN npm install --omit=dev
10+
11+
FROM node:16-bullseye-slim
12+
WORKDIR /usr/app
13+
COPY --from=build /usr/app /usr/app
14+
COPY config.json .
15+
COPY index.js .
16+
COPY result.json .
17+
ENV NODE_ENV production
18+
19+
CMD [ "node", "index.js" ]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
import {
2+
ArtifactBuilderProviderType,
3+
VulcanExtensionId,
4+
VulcanInternalExtension,
5+
} from '@vulcan-sql/core';
6+
import { IBuildOptions } from '../../../models/buildOptions';
7+
import { Packager, PackagerType } from '../../../models/extensions';
8+
import * as path from 'path';
9+
import { promises as fs } from 'fs';
10+
11+
export interface DockerPackagerConfig {
12+
folderPath?: string;
13+
}
14+
15+
@VulcanExtensionId(PackagerType.Docker)
16+
@VulcanInternalExtension('docker-packager')
17+
export class DockerPackager extends Packager<DockerPackagerConfig> {
18+
private logger = this.getLogger();
19+
20+
public async package(option: IBuildOptions): Promise<void> {
21+
const { folderPath = 'dist' } = this.getConfig() || {};
22+
const distFolder = path.resolve(process.cwd(), folderPath);
23+
await fs.rm(distFolder, { recursive: true, force: true });
24+
await fs.mkdir(distFolder, { recursive: true });
25+
// package.json
26+
await fs.writeFile(
27+
path.resolve(distFolder, 'package.json'),
28+
JSON.stringify(await this.getPackageJson(), null, 4),
29+
'utf-8'
30+
);
31+
// config.json (vulcan config)
32+
await fs.writeFile(
33+
path.resolve(distFolder, 'config.json'),
34+
JSON.stringify(option),
35+
'utf-8'
36+
);
37+
// entrypoint
38+
await fs.writeFile(
39+
path.resolve(distFolder, 'index.js'),
40+
await this.getEntryJS(),
41+
'utf-8'
42+
);
43+
// result.json
44+
if (
45+
option.artifact.provider === ArtifactBuilderProviderType.LocalFile &&
46+
option.artifact.filePath
47+
) {
48+
await fs.copyFile(
49+
path.resolve(process.cwd(), option.artifact.filePath),
50+
path.resolve(distFolder, option.artifact.filePath)
51+
);
52+
}
53+
// Dockerfile
54+
await fs.copyFile(
55+
path.resolve(__dirname, 'assets', 'Dockerfile'),
56+
path.resolve(distFolder, 'Dockerfile')
57+
);
58+
this.logger.info(
59+
`Package successfully, you can go to "${folderPath}" folder and run "docker build ." to build the image.`
60+
);
61+
}
62+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './dockerPackager';
+3-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1+
import { DockerPackager } from './dockerPackager';
12
import { NodePackager } from './nodePackager';
23

34
export * from './nodePackager';
5+
export * from './dockerPackager';
46

5-
export const builtInPackager = [NodePackager];
7+
export const builtInPackager = [NodePackager, DockerPackager];

packages/build/src/lib/packager/nodePackager.ts

+5
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ export interface NodePackagerConfig {
1515
@VulcanExtensionId(PackagerType.Node)
1616
@VulcanInternalExtension('node-packager')
1717
export class NodePackager extends Packager<NodePackagerConfig> {
18+
private logger = this.getLogger();
19+
1820
public async package(option: IBuildOptions): Promise<void> {
1921
const { folderPath = 'dist' } = this.getConfig() || {};
2022
const distFolder = path.resolve(process.cwd(), folderPath);
@@ -48,5 +50,8 @@ export class NodePackager extends Packager<NodePackagerConfig> {
4850
path.resolve(distFolder, option.artifact.filePath)
4951
);
5052
}
53+
this.logger.info(
54+
`Package successfully, you can go to "${folderPath}" folder and run "npm install && node index.js" to start the server`
55+
);
5156
}
5257
}

packages/build/src/models/extensions/packager/packager.ts

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { IBuildOptions } from '../../buildOptions';
66

77
export enum PackagerType {
88
Node = 'node',
9+
Docker = 'docker',
910
}
1011

1112
@VulcanExtension(TYPES.Extension_Packager, { enforcedId: true })
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
dist
1+
dist-*
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { ArtifactBuilderProviderType } from '@vulcan-sql/core';
2+
import { DockerPackager } from '../../src/lib/packager';
3+
import * as fs from 'fs';
4+
5+
it('DockerPackager should create package.json, config.json, index.js, result.json, and Dockerfile', async () => {
6+
// Arrange
7+
process.chdir(__dirname);
8+
const dockerPackager = new DockerPackager(
9+
{
10+
folderPath: 'dist-docker',
11+
},
12+
''
13+
);
14+
const options: any = {
15+
artifact: {
16+
provider: ArtifactBuilderProviderType.LocalFile,
17+
filePath: 'result.json',
18+
},
19+
};
20+
// Act
21+
await dockerPackager.package(options);
22+
const result = fs.readdirSync('dist-docker');
23+
// Assert
24+
expect(result.length).toBe(5);
25+
});

packages/build/test/packager/nodePackager.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ it('NodePackager should create package.json, config.json, index.js, and result.j
77
process.chdir(__dirname);
88
const nodePackager = new NodePackager(
99
{
10-
folderPath: 'dist',
10+
folderPath: 'dist-node',
1111
},
1212
''
1313
);
@@ -19,7 +19,7 @@ it('NodePackager should create package.json, config.json, index.js, and result.j
1919
};
2020
// Act
2121
await nodePackager.package(options);
22-
const result = fs.readdirSync('dist');
22+
const result = fs.readdirSync('dist-node');
2323
// Assert
2424
expect(result.length).toBe(4);
2525
});

0 commit comments

Comments
 (0)