hammerkit 1.4.0 → 1.5.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devcontainer/Dockerfile +5 -0
- package/.devcontainer/devcontainer.json +40 -0
- package/README.md +13 -86
- package/SUMMARY.md +43 -0
- package/build.schema.json +56 -2
- package/dist/cli.js +97 -0
- package/dist/cli.spec.js +5 -0
- package/dist/console/console-context-mock.js +11 -0
- package/dist/console/get-logger.js +23 -0
- package/dist/docker/pull.js +5 -5
- package/dist/docker/remove-container.js +21 -0
- package/dist/docker/stream.js +14 -10
- package/dist/docker/using-container.js +28 -0
- package/dist/environment/get-process-env.js +4 -4
- package/dist/environment/replace-env-variables.js +2 -3
- package/dist/executer/abort.js +13 -0
- package/dist/executer/check-readiness.js +25 -0
- package/dist/executer/create-scheduler-state.js +32 -0
- package/dist/executer/docker-node.js +123 -0
- package/dist/executer/docker-service.js +113 -0
- package/dist/executer/environment-mock.js +17 -0
- package/dist/executer/event-cache.js +165 -0
- package/dist/executer/execute-command.js +42 -0
- package/dist/executer/execute-docker.js +58 -194
- package/dist/executer/execute.spec.js +37 -37
- package/dist/executer/execution-steps.js +57 -0
- package/dist/executer/get-docker-executor.js +6 -100
- package/dist/executer/hierarchy-scheduler.js +94 -0
- package/dist/executer/kubernetes-service.js +64 -0
- package/dist/executer/label-values.js +65 -0
- package/dist/executer/local-node.js +57 -0
- package/dist/executer/print-container-options.js +17 -0
- package/dist/{logging/log-strategy.js → executer/process-item.js} +1 -1
- package/dist/executer/process-listener.js +3 -0
- package/dist/executer/process-manager.js +111 -0
- package/dist/executer/process-manager.spec.js +91 -0
- package/dist/executer/{executor.js → process.js} +1 -1
- package/dist/executer/{execute-result.js → readonly-state.js} +1 -1
- package/dist/executer/schedule.js +139 -0
- package/dist/executer/scheduler/check-for-loop.js +21 -0
- package/dist/executer/scheduler/enqueue-next.js +27 -0
- package/dist/{testing/test-context.js → executer/scheduler/node-state.js} +1 -1
- package/dist/executer/scheduler/scheduler-result.js +3 -0
- package/dist/executer/scheduler/scheduler-state.js +3 -0
- package/dist/executer/scheduler/service-state.js +3 -0
- package/dist/executer/service-dns.js +6 -0
- package/dist/executer/set-user-permission.js +16 -0
- package/dist/executer/start-node.js +59 -0
- package/dist/executer/state-listener.js +3 -0
- package/dist/executer/state.js +49 -0
- package/dist/executer/states.js +4 -159
- package/dist/executer/watch-node.js +57 -0
- package/dist/executer/watch-service.js +54 -0
- package/dist/executer/work-scope.js +10 -0
- package/dist/file/get-file-context-mock.spec.js +5 -5
- package/dist/file/get-file-context.js +41 -18
- package/dist/file/move-files.js +1 -1
- package/dist/get-work-context.js +29 -0
- package/dist/index.js +8 -4
- package/dist/log.js +192 -50
- package/dist/logging/grouped-logger.js +31 -19
- package/dist/logging/interactive-logger.js +20 -23
- package/dist/logging/live-logger.js +7 -17
- package/dist/optimizer/calculate-checksum.js +1 -1
- package/dist/optimizer/get-cache-directory.js +8 -13
- package/dist/optimizer/get-work-node-cache-stats.js +68 -21
- package/dist/optimizer/read-work-node-cache.js +2 -2
- package/dist/optimizer/work-node-cache-description.js +12 -11
- package/dist/optimizer/write-work-node-cache.js +9 -8
- package/dist/{executer/execution-context.js → parser/build-file-service.js} +1 -1
- package/dist/{optimizer → parser}/cache-method.js +0 -0
- package/dist/parser/get-build-file.js +1 -1
- package/dist/parser/parse-boolean.js +29 -0
- package/dist/parser/parse-boolean.spec.js +48 -0
- package/dist/parser/parse-build-file-references.js +2 -2
- package/dist/parser/parse-build-file-services.js +58 -0
- package/dist/parser/parse-build-file-task-command.js +6 -5
- package/dist/parser/parse-build-file-task-source.js +5 -5
- package/dist/parser/parse-build-file.js +27 -15
- package/dist/parser/parse-context.js +13 -0
- package/dist/parser/parse-envs.js +4 -3
- package/dist/parser/parse-healthcheck.js +28 -0
- package/dist/parser/parse-label-arguments.js +23 -0
- package/dist/parser/parse-service-selector.js +39 -0
- package/dist/parser/parse-string-array.js +6 -5
- package/dist/parser/parse-string-map.js +30 -0
- package/dist/parser/parse-string.js +20 -0
- package/dist/parser/read-build-file.js +16 -5
- package/dist/parser/read-env-file.js +3 -3
- package/dist/planner/utils/get-container-mounts.js +24 -0
- package/dist/planner/utils/normalize-path.js +17 -0
- package/dist/planner/utils/parse-work-node-mount.js +3 -14
- package/dist/planner/utils/parse-work-node-mount.spec.js +10 -10
- package/dist/planner/utils/parse-work-service-volume.js +21 -0
- package/dist/planner/utils/plan-work-command.js +1 -1
- package/dist/planner/utils/plan-work-dependency.js +17 -5
- package/dist/planner/utils/plan-work-node.js +203 -128
- package/dist/planner/utils/plan-work-nodes.js +59 -14
- package/dist/planner/utils/plan-work-tree.js +8 -4
- package/dist/planner/utils/plan-work-volume.js +25 -0
- package/dist/planner/validate.js +56 -8
- package/dist/planner/work-context.js +20 -0
- package/dist/planner/work-mount.js +3 -0
- package/dist/planner/work-node-id.js +4 -4
- package/dist/planner/work-node-id.spec.js +11 -8
- package/dist/planner/work-node-path.js +0 -1
- package/dist/planner/work-node-status.js +121 -18
- package/dist/planner/work-node.js +3 -3
- package/dist/planner/work-service-id.js +13 -0
- package/dist/planner/work-service-volume.js +3 -0
- package/dist/planner/work-service.js +6 -0
- package/dist/planner/work-services.js +3 -0
- package/dist/planner/work-volume.js +3 -0
- package/dist/program.js +155 -90
- package/dist/program.spec.js +20 -0
- package/dist/start-watch-processes.js +28 -0
- package/dist/testing/cli.js +73 -0
- package/dist/testing/create-build-file.js +1 -1
- package/dist/testing/example-test-suite.js +54 -0
- package/dist/testing/expect.js +30 -18
- package/dist/testing/get-logger.js +23 -0
- package/dist/testing/get-node.js +2 -2
- package/dist/testing/get-test-context.js +5 -3
- package/dist/testing/get-test-suite.js +2 -50
- package/dist/testing/integration/cache.spec.js +25 -28
- package/dist/testing/integration/cancellation.spec.js +19 -21
- package/dist/testing/integration/clean.spec.js +25 -28
- package/dist/testing/integration/cmd.spec.js +5 -8
- package/dist/testing/integration/concurrency.spec.js +8 -17
- package/dist/testing/integration/docker.spec.js +6 -9
- package/dist/testing/integration/env.spec.js +27 -34
- package/dist/testing/integration/error.spec.js +5 -9
- package/dist/testing/integration/extend.spec.js +32 -0
- package/dist/testing/integration/glob.spec.js +35 -28
- package/dist/testing/integration/include.spec.js +17 -16
- package/dist/testing/integration/invalid.spec.js +3 -2
- package/dist/testing/integration/invalid_loop.spec.js +13 -0
- package/dist/testing/integration/kubernetes.spec.js +15 -0
- package/dist/testing/integration/labels.spec.js +47 -0
- package/dist/testing/integration/local.spec.js +4 -7
- package/dist/testing/integration/monorepo.spec.js +5 -9
- package/dist/testing/integration/multi-line.spec.js +4 -4
- package/dist/testing/integration/program.spec.js +3 -10
- package/dist/testing/integration/reference.spec.js +10 -13
- package/dist/testing/integration/services.spec.js +14 -0
- package/dist/testing/integration/store.spec.js +42 -38
- package/dist/testing/integration/unknown.spec.js +4 -4
- package/dist/testing/integration/validate.spec.js +4 -4
- package/dist/testing/integration/watch.spec.js +34 -33
- package/dist/testing/lazy.js +17 -0
- package/dist/testing/start-watch-processes.js +29 -0
- package/dist/testing/test-suite-setup.js +3 -0
- package/dist/utils/abort-event.js +14 -1
- package/dist/utils/abortable-function.js +71 -0
- package/dist/utils/debouncer.spec.js +8 -8
- package/dist/utils/environment-config.js +13 -0
- package/dist/utils/fail-never.js +1 -1
- package/dist/utils/sleep.spec.js +3 -3
- package/package.json +24 -21
- package/dist/console/get-console-context-mock.js +0 -33
- package/dist/executer/clean.js +0 -17
- package/dist/executer/execute-local.js +0 -59
- package/dist/executer/execute.js +0 -139
- package/dist/executer/execution-context-event.js +0 -3
- package/dist/executer/execution-context-mock.js +0 -3
- package/dist/executer/executor-mock.js +0 -61
- package/dist/executer/get-environment-mock.js +0 -16
- package/dist/executer/get-execution-context-mock.js +0 -18
- package/dist/executer/get-local-executor.js +0 -56
- package/dist/executer/restore.js +0 -19
- package/dist/executer/store.js +0 -19
- package/dist/logging/get-logger.js +0 -23
- package/dist/logging/message-to-console.js +0 -16
- package/dist/optimizer/optimize.js +0 -32
- package/dist/optimizer/work-node-description.js +0 -12
- package/dist/planner/utils/find-build-task.js +0 -18
- package/dist/testing/create-work-tree.js +0 -11
|
@@ -1,54 +1,47 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const expect_1 = require("../expect");
|
|
4
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
5
4
|
const get_test_suite_1 = require("../get-test-suite");
|
|
6
|
-
const execute_1 = require("../../executer/execute");
|
|
7
5
|
describe('env', () => {
|
|
8
|
-
const suite = get_test_suite_1.getTestSuite('env', ['build.yaml', '.env']);
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('env', ['build.yaml', '.env']);
|
|
9
7
|
afterAll(() => suite.close());
|
|
10
8
|
it('should use env from build file', async () => {
|
|
11
|
-
const {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
await expect_1.
|
|
15
|
-
await expect_1.expectLog(result, `example`, '16.6.0');
|
|
9
|
+
const { cli, environment } = await suite.setup({ taskName: 'example' });
|
|
10
|
+
const result = await cli.exec();
|
|
11
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
12
|
+
await (0, expect_1.expectLog)(result, environment, `example`, '16.6.0');
|
|
16
13
|
});
|
|
17
14
|
it('should pass env to docker', async () => {
|
|
18
|
-
const {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
await expect_1.
|
|
22
|
-
await expect_1.expectLog(result, `example_docker`, '16.6.0');
|
|
15
|
+
const { cli, environment } = await suite.setup({ taskName: 'example_docker' });
|
|
16
|
+
const result = await cli.exec();
|
|
17
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
18
|
+
await (0, expect_1.expectLog)(result, environment, `example_docker`, '16.6.0');
|
|
23
19
|
});
|
|
24
20
|
it('should use env from task', async () => {
|
|
25
|
-
const {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
await expect_1.
|
|
29
|
-
await expect_1.expectLog(result, `example_override`, '15.0.0');
|
|
21
|
+
const { cli, environment } = await suite.setup({ taskName: 'example_override' });
|
|
22
|
+
const result = await cli.exec();
|
|
23
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
24
|
+
await (0, expect_1.expectLog)(result, environment, `example_override`, '15.0.0');
|
|
30
25
|
});
|
|
31
26
|
it('should use env from .env', async () => {
|
|
32
|
-
const {
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
await expect_1.
|
|
36
|
-
await expect_1.expectLog(result, `example_with_dotenv`, '123456');
|
|
27
|
+
const { cli, environment } = await suite.setup({ taskName: 'example_with_dotenv' });
|
|
28
|
+
const result = await cli.exec();
|
|
29
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
30
|
+
await (0, expect_1.expectLog)(result, environment, `example_with_dotenv`, '123456');
|
|
37
31
|
});
|
|
38
32
|
it('should use process env', async () => {
|
|
39
|
-
const {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
33
|
+
const { cli, environment } = await suite.setup({
|
|
34
|
+
taskName: 'example_with_shell_env',
|
|
35
|
+
envs: {
|
|
36
|
+
VERSION: '1.0.0',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
const result = await cli.exec();
|
|
40
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
41
|
+
await (0, expect_1.expectLog)(result, environment, `example_with_shell_env`, '1.0.0');
|
|
45
42
|
});
|
|
46
43
|
it('should throw if process env is missing', async () => {
|
|
47
|
-
|
|
48
|
-
const workTree = plan_work_tree_1.planWorkTree(buildFile, 'example_with_shell_env');
|
|
49
|
-
const result = await execute_1.execute(workTree, executionContext);
|
|
50
|
-
expect(result.success).toBeFalsy();
|
|
51
|
-
//expect(result.nodes[`${buildFile.path}:example_with_shell_env`].type).toEqual('failed')
|
|
44
|
+
await expect(suite.setup({ taskName: 'example_with_shell_env' })).rejects.toThrow('missing env $VERSION');
|
|
52
45
|
});
|
|
53
46
|
});
|
|
54
47
|
//# sourceMappingURL=env.spec.js.map
|
|
@@ -1,21 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
4
3
|
const get_test_suite_1 = require("../get-test-suite");
|
|
5
|
-
const execute_1 = require("../../executer/execute");
|
|
6
4
|
describe('error', () => {
|
|
7
|
-
const suite = get_test_suite_1.getTestSuite('error', ['build.yaml']);
|
|
5
|
+
const suite = (0, get_test_suite_1.getTestSuite)('error', ['build.yaml']);
|
|
8
6
|
afterAll(() => suite.close());
|
|
9
7
|
it('should return error when local task failed', async () => {
|
|
10
|
-
const {
|
|
11
|
-
const
|
|
12
|
-
const result = await execute_1.execute(workTree, executionContext);
|
|
8
|
+
const { cli } = await suite.setup({ taskName: 'local_error' });
|
|
9
|
+
const result = await cli.exec();
|
|
13
10
|
expect(result.success).toBeFalsy();
|
|
14
11
|
});
|
|
15
12
|
it('should return error when docker task failed', async () => {
|
|
16
|
-
const {
|
|
17
|
-
const
|
|
18
|
-
const result = await execute_1.execute(workTree, executionContext);
|
|
13
|
+
const { cli } = await suite.setup({ taskName: 'docker_error' });
|
|
14
|
+
const result = await cli.exec();
|
|
19
15
|
expect(result.success).toBeFalsy();
|
|
20
16
|
});
|
|
21
17
|
});
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
describe('extend', () => {
|
|
5
|
+
const suite = (0, get_test_suite_1.getTestSuite)('extend', ['build.yaml']);
|
|
6
|
+
afterAll(() => suite.close());
|
|
7
|
+
it('should merge env variables', async () => {
|
|
8
|
+
const { cli } = await suite.setup({ taskName: 'extend_env' });
|
|
9
|
+
const node = await cli.node('extend_env');
|
|
10
|
+
expect(node.envs).toContainEntries([
|
|
11
|
+
['NAME', 'base'],
|
|
12
|
+
['KEEP', 'value'],
|
|
13
|
+
]);
|
|
14
|
+
});
|
|
15
|
+
it('should extend and override', async () => {
|
|
16
|
+
const { cli } = await suite.setup({ taskName: 'extend_container_task' });
|
|
17
|
+
const node = await cli.node('extend_container_task');
|
|
18
|
+
expect(node.envs).toEqual({
|
|
19
|
+
NAME: 'override',
|
|
20
|
+
});
|
|
21
|
+
expect(node.type).toBe('container');
|
|
22
|
+
if (node.type === 'container') {
|
|
23
|
+
expect(node.image).toBe('alpine');
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
it('should merge deps', async () => {
|
|
27
|
+
const { cli } = await suite.setup({ taskName: 'extend_dep' });
|
|
28
|
+
const node = await cli.node('extend_dep');
|
|
29
|
+
expect(node.deps.map((d) => d.name)).toIncludeSameMembers(['base_env', 'extend_env']);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=extend.spec.js.map
|
|
@@ -1,41 +1,48 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const path_1 = require("path");
|
|
4
|
-
const fs_1 = require("fs");
|
|
5
|
-
const write_work_node_cache_1 = require("../../optimizer/write-work-node-cache");
|
|
6
|
-
const optimize_1 = require("../../optimizer/optimize");
|
|
7
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
8
3
|
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
const expect_1 = require("../expect");
|
|
9
5
|
describe('glob', () => {
|
|
10
|
-
const suite = get_test_suite_1.getTestSuite('glob', ['build.yaml', 'test.md', 'test.txt']);
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('glob', ['build.yaml', 'test.md', 'test.txt']);
|
|
11
7
|
afterAll(() => suite.close());
|
|
8
|
+
async function testCache(expectInvalidate, action) {
|
|
9
|
+
const { cli, environment } = await suite.setup({ taskName: 'example' });
|
|
10
|
+
const result1 = await cli.exec();
|
|
11
|
+
await (0, expect_1.expectSuccessfulResult)(result1, environment);
|
|
12
|
+
const node = cli.node('example');
|
|
13
|
+
const nodeState1 = result1.state.node[node.id];
|
|
14
|
+
expect(nodeState1.type).toEqual('completed');
|
|
15
|
+
if (nodeState1.type === 'completed') {
|
|
16
|
+
expect(nodeState1.duration).toBeGreaterThanOrEqual(100);
|
|
17
|
+
}
|
|
18
|
+
if (action) {
|
|
19
|
+
await action(environment);
|
|
20
|
+
}
|
|
21
|
+
const result2 = await cli.exec();
|
|
22
|
+
await (0, expect_1.expectSuccessfulResult)(result2, environment);
|
|
23
|
+
const nodeState2 = result2.state.node[node.id];
|
|
24
|
+
expect(nodeState2.type).toEqual('completed');
|
|
25
|
+
if (nodeState2.type === 'completed') {
|
|
26
|
+
if (expectInvalidate) {
|
|
27
|
+
expect(nodeState2.cached).toBeFalsy();
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
expect(nodeState2.cached).toBeTruthy();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
12
34
|
it('should remove task after written cache', async () => {
|
|
13
|
-
|
|
14
|
-
const workTree = plan_work_tree_1.planWorkTree(buildFile, 'example');
|
|
15
|
-
expect(workTree.nodes[workTree.rootNode.id].status.state.type).toEqual('pending');
|
|
16
|
-
await optimize_1.optimize(workTree, executionContext);
|
|
17
|
-
expect(workTree.nodes[workTree.rootNode.id].status.state.type).toEqual('pending');
|
|
18
|
-
await write_work_node_cache_1.writeWorkNodeCache(workTree.rootNode, context);
|
|
19
|
-
await optimize_1.optimize(workTree, executionContext);
|
|
20
|
-
expect(workTree.nodes[workTree.rootNode.id].status.state.type).toEqual('completed');
|
|
35
|
+
await testCache(false);
|
|
21
36
|
});
|
|
22
37
|
it('should keep being cached after ignored file changed', async () => {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
await write_work_node_cache_1.writeWorkNodeCache(workTree.rootNode, context);
|
|
27
|
-
fs_1.appendFileSync(path_1.join(buildFile.path, 'test.txt'), '\n');
|
|
28
|
-
await optimize_1.optimize(workTree, executionContext);
|
|
29
|
-
expect(workTree.nodes[workTree.rootNode.id].status.state.type).toEqual('completed');
|
|
38
|
+
await testCache(false, async (env) => {
|
|
39
|
+
await env.file.appendFile('test.txt', '\n');
|
|
40
|
+
});
|
|
30
41
|
});
|
|
31
42
|
it('should invalid cache after file has changed', async () => {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
await write_work_node_cache_1.writeWorkNodeCache(workTree.rootNode, context);
|
|
36
|
-
fs_1.appendFileSync(path_1.join(buildFile.path, 'test.md'), '\n');
|
|
37
|
-
await optimize_1.optimize(workTree, executionContext);
|
|
38
|
-
expect(workTree.nodes[workTree.rootNode.id].status.state.type).toEqual('pending');
|
|
43
|
+
await testCache(true, async (env) => {
|
|
44
|
+
await env.file.appendFile('test.md', '\n');
|
|
45
|
+
});
|
|
39
46
|
});
|
|
40
47
|
});
|
|
41
48
|
//# sourceMappingURL=glob.spec.js.map
|
|
@@ -1,30 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const expect_1 = require("../expect");
|
|
4
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
5
4
|
const get_test_suite_1 = require("../get-test-suite");
|
|
6
|
-
const execute_1 = require("../../executer/execute");
|
|
7
5
|
describe('include', () => {
|
|
8
|
-
const suite = get_test_suite_1.getTestSuite('include', ['build.yaml', 'foo', 'foobar.txt']);
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('include', ['build.yaml', 'foo', 'foobar.txt']);
|
|
9
7
|
afterAll(() => suite.close());
|
|
10
8
|
it('should run included task', async () => {
|
|
11
|
-
const {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
await expect_1.
|
|
15
|
-
await expect_1.expectLog(result, `foo:bar`, 'foobar');
|
|
9
|
+
const { cli, environment } = await suite.setup({ taskName: 'example' });
|
|
10
|
+
const result = await cli.exec();
|
|
11
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
12
|
+
await (0, expect_1.expectLog)(result, environment, `foo:bar`, 'foobar');
|
|
16
13
|
});
|
|
17
14
|
it('should get name:example', async () => {
|
|
18
|
-
const {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
await expect_1.expectSuccessfulResult(result);
|
|
15
|
+
const { cli, environment } = await suite.setup({ taskName: 'name:example' });
|
|
16
|
+
const result = await cli.exec();
|
|
17
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
22
18
|
});
|
|
23
19
|
it('should get included task', async () => {
|
|
24
|
-
const {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
const { cli } = await suite.setup({ taskName: 'foo:bar' });
|
|
21
|
+
expect(cli.ls().map((n) => n.item.name)).toEqual(['foo:bar']);
|
|
22
|
+
const item = cli.ls()[0];
|
|
23
|
+
if (item.type === 'task') {
|
|
24
|
+
expect(item.item.cwd).toBe(suite.path);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
expect(item.type).toBe('task');
|
|
28
|
+
}
|
|
28
29
|
});
|
|
29
30
|
});
|
|
30
31
|
//# sourceMappingURL=include.spec.js.map
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
const work_scope_1 = require("../../executer/work-scope");
|
|
4
5
|
describe('invalid', () => {
|
|
5
|
-
const suite = get_test_suite_1.getTestSuite('invalid', ['build.yaml']);
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('invalid', ['build.yaml']);
|
|
6
7
|
afterAll(() => suite.close());
|
|
7
8
|
it('should throw on invalid yaml', async () => {
|
|
8
9
|
try {
|
|
9
|
-
await suite.setup();
|
|
10
|
+
await suite.setup((0, work_scope_1.emptyWorkLabelScope)());
|
|
10
11
|
expect.fail('should not be called');
|
|
11
12
|
}
|
|
12
13
|
catch (e) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
describe('invalid', () => {
|
|
5
|
+
const suite = (0, get_test_suite_1.getTestSuite)('invalid_loop', ['build.yaml']);
|
|
6
|
+
afterAll(() => suite.close());
|
|
7
|
+
it('should detect loop in execution', async () => {
|
|
8
|
+
const { cli } = await suite.setup({ taskName: 'foo' });
|
|
9
|
+
const result = await cli.exec();
|
|
10
|
+
expect(result.success).toBeFalsy();
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
//# sourceMappingURL=invalid_loop.spec.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
const expect_1 = require("../expect");
|
|
5
|
+
describe('kubernetes', () => {
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('kubernetes', ['index.js', 'package.json', 'package-lock.json', 'build.yaml']);
|
|
7
|
+
afterAll(() => suite.close());
|
|
8
|
+
// CI setup missing
|
|
9
|
+
xit('should forward deployment', async () => {
|
|
10
|
+
const { cli, environment } = await suite.setup({ taskName: 'api' });
|
|
11
|
+
const result = await cli.exec();
|
|
12
|
+
(0, expect_1.expectSuccessfulResult)(result, environment);
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=kubernetes.spec.js.map
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
describe('local', () => {
|
|
5
|
+
const suite = (0, get_test_suite_1.getTestSuite)('labels', ['build.yaml']);
|
|
6
|
+
afterAll(() => suite.close());
|
|
7
|
+
it('should run only run labeled task with app=bar and dependencies', async () => {
|
|
8
|
+
const { cli } = await suite.setup({
|
|
9
|
+
filterLabels: { app: ['bar'] },
|
|
10
|
+
excludeLabels: {},
|
|
11
|
+
});
|
|
12
|
+
expectNodes(cli.ls(), ['bar', 'base']);
|
|
13
|
+
});
|
|
14
|
+
it('should not run labeled task with app=foo and dependencies', async () => {
|
|
15
|
+
const { cli } = await suite.setup({
|
|
16
|
+
filterLabels: { app: ['foo'] },
|
|
17
|
+
excludeLabels: {},
|
|
18
|
+
});
|
|
19
|
+
expectNodes(cli.ls(), ['foo', 'base']);
|
|
20
|
+
});
|
|
21
|
+
it('should exclude foo labeled nodes', async () => {
|
|
22
|
+
const { cli } = await suite.setup({
|
|
23
|
+
filterLabels: {},
|
|
24
|
+
excludeLabels: { app: ['foo'] },
|
|
25
|
+
});
|
|
26
|
+
expectNodes(cli.ls(), ['bar', 'base']);
|
|
27
|
+
});
|
|
28
|
+
it('should exclude base labeled nodes', async () => {
|
|
29
|
+
const { cli } = await suite.setup({
|
|
30
|
+
filterLabels: {},
|
|
31
|
+
excludeLabels: { app: ['base'] },
|
|
32
|
+
});
|
|
33
|
+
expectNodes(cli.ls(), []);
|
|
34
|
+
});
|
|
35
|
+
it('should run nodes with label app=bar or app=foo', async () => {
|
|
36
|
+
const { cli } = await suite.setup({
|
|
37
|
+
filterLabels: { app: ['foo', 'bar'] },
|
|
38
|
+
excludeLabels: {},
|
|
39
|
+
});
|
|
40
|
+
expectNodes(cli.ls(), ['foo', 'bar', 'base']);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
function expectNodes(nodes, expectedNodes) {
|
|
44
|
+
const nodeNames = Object.values(nodes).map((n) => n.item.name);
|
|
45
|
+
expect(nodeNames).toIncludeSameMembers(expectedNodes);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=labels.spec.js.map
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const expect_1 = require("../expect");
|
|
4
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
5
4
|
const get_test_suite_1 = require("../get-test-suite");
|
|
6
|
-
const execute_1 = require("../../executer/execute");
|
|
7
5
|
describe('local', () => {
|
|
8
|
-
const suite = get_test_suite_1.getTestSuite('local', ['build.yaml']);
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('local', ['build.yaml']);
|
|
9
7
|
afterAll(() => suite.close());
|
|
10
8
|
it('should run local task', async () => {
|
|
11
|
-
const {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
await expect_1.expectSuccessfulResult(result);
|
|
9
|
+
const { cli, environment } = await suite.setup({ taskName: 'example' });
|
|
10
|
+
const result = await cli.exec();
|
|
11
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
15
12
|
});
|
|
16
13
|
});
|
|
17
14
|
//# sourceMappingURL=local.spec.js.map
|
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const expect_1 = require("../expect");
|
|
4
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
5
|
-
const clean_1 = require("../../executer/clean");
|
|
6
4
|
const get_test_suite_1 = require("../get-test-suite");
|
|
7
|
-
const execute_1 = require("../../executer/execute");
|
|
8
5
|
describe('monorepo', () => {
|
|
9
|
-
const suite = get_test_suite_1.getTestSuite('monorepo', ['build.yaml', 'projects', 'build.npm.yaml', 'build.tsc.yaml']);
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('monorepo', ['build.yaml', 'projects', 'build.npm.yaml', 'build.tsc.yaml']);
|
|
10
7
|
afterAll(() => suite.close());
|
|
11
8
|
it('should build and clean monorepo', async () => {
|
|
12
|
-
const {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
await
|
|
16
|
-
await clean_1.clean(workTree.nodes, executionContext.environment, executionContext.executor);
|
|
9
|
+
const { cli, environment } = await suite.setup({ taskName: 'build' });
|
|
10
|
+
const result = await cli.exec();
|
|
11
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
12
|
+
await cli.clean();
|
|
17
13
|
}, 120000);
|
|
18
14
|
});
|
|
19
15
|
//# sourceMappingURL=monorepo.spec.js.map
|
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const get_test_suite_1 = require("../get-test-suite");
|
|
4
4
|
describe('multi-line', () => {
|
|
5
|
-
const suite = get_test_suite_1.getTestSuite('multi-line', ['build.yaml']);
|
|
5
|
+
const suite = (0, get_test_suite_1.getTestSuite)('multi-line', ['build.yaml']);
|
|
6
6
|
afterAll(() => suite.close());
|
|
7
7
|
it('should get multi lines', async () => {
|
|
8
|
-
const {
|
|
9
|
-
const task =
|
|
10
|
-
expect(task.cmds || []).toEqual([
|
|
8
|
+
const { cli } = await suite.setup({ taskName: 'example' });
|
|
9
|
+
const task = cli.node('example');
|
|
10
|
+
expect((task.cmds || []).map((c) => c.cmd)).toEqual([
|
|
11
11
|
'some very long cmd continues on line 2',
|
|
12
12
|
'some other very long cmd continues on line 2',
|
|
13
13
|
]);
|
|
@@ -5,9 +5,9 @@ const get_test_context_1 = require("../get-test-context");
|
|
|
5
5
|
const program_1 = require("../../program");
|
|
6
6
|
describe('program', () => {
|
|
7
7
|
async function testCommand(commandArgs) {
|
|
8
|
-
const fileName = path_1.join(__dirname, '../../../examples/program');
|
|
9
|
-
const context = get_test_context_1.getTestContext(fileName);
|
|
10
|
-
const { program, args } = await program_1.getProgram(context, [process.argv[0], fileName, ...commandArgs]);
|
|
8
|
+
const fileName = (0, path_1.join)(__dirname, '../../../examples/program');
|
|
9
|
+
const context = (0, get_test_context_1.getTestContext)(fileName);
|
|
10
|
+
const { program, args } = await (0, program_1.getProgram)(context, [process.argv[0], fileName, ...commandArgs]);
|
|
11
11
|
return new Promise((resolve, reject) => {
|
|
12
12
|
program
|
|
13
13
|
.exitOverride((err) => {
|
|
@@ -18,13 +18,6 @@ describe('program', () => {
|
|
|
18
18
|
.then(() => resolve());
|
|
19
19
|
});
|
|
20
20
|
}
|
|
21
|
-
it('should get help with description', async () => {
|
|
22
|
-
const fileName = path_1.join(__dirname, '../../../examples/program');
|
|
23
|
-
const context = get_test_context_1.getTestContext(fileName);
|
|
24
|
-
const { program } = await program_1.getProgram(context, process.argv);
|
|
25
|
-
const help = program.exitOverride().helpInformation({ error: false });
|
|
26
|
-
expect(help).toContain('example [options] install npm packages');
|
|
27
|
-
});
|
|
28
21
|
it('should run when cache is up to date and --no-cache arg is passed', async () => {
|
|
29
22
|
await testCommand(['example', '--cache', 'none']);
|
|
30
23
|
}, 120000);
|
|
@@ -1,25 +1,22 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const expect_1 = require("../expect");
|
|
4
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
5
|
-
const plan_work_nodes_1 = require("../../planner/utils/plan-work-nodes");
|
|
6
4
|
const get_test_suite_1 = require("../get-test-suite");
|
|
7
|
-
const
|
|
5
|
+
const work_scope_1 = require("../../executer/work-scope");
|
|
8
6
|
describe('reference', () => {
|
|
9
|
-
const suite = get_test_suite_1.getTestSuite('reference', ['build.yaml', 'foo']);
|
|
7
|
+
const suite = (0, get_test_suite_1.getTestSuite)('reference', ['build.yaml', 'foo']);
|
|
10
8
|
afterAll(() => suite.close());
|
|
11
9
|
it('should run included task', async () => {
|
|
12
|
-
const {
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
await expect_1.
|
|
16
|
-
await expect_1.expectLog(result, `
|
|
17
|
-
await expect_1.expectLog(result, `example`, 'hammertime');
|
|
10
|
+
const { cli, environment } = await suite.setup({ taskName: 'example' });
|
|
11
|
+
const result = await cli.exec();
|
|
12
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
13
|
+
await (0, expect_1.expectLog)(result, environment, `foo:bar`, 'foobar');
|
|
14
|
+
await (0, expect_1.expectLog)(result, environment, `example`, 'hammertime');
|
|
18
15
|
});
|
|
19
16
|
it('should list task with references tasks nested', async () => {
|
|
20
|
-
const {
|
|
21
|
-
const
|
|
22
|
-
expect(
|
|
17
|
+
const { cli } = await suite.setup((0, work_scope_1.emptyWorkLabelScope)());
|
|
18
|
+
const workNodes = cli.ls();
|
|
19
|
+
expect(workNodes.map((t) => t.item.name)).toEqual(['example', 'foo:bar', 'foo:sub:sub']);
|
|
23
20
|
});
|
|
24
21
|
});
|
|
25
22
|
//# sourceMappingURL=reference.spec.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const get_test_suite_1 = require("../get-test-suite");
|
|
4
|
+
const expect_1 = require("../expect");
|
|
5
|
+
describe('services', () => {
|
|
6
|
+
const suite = (0, get_test_suite_1.getTestSuite)('services', ['index.js', 'config.json', 'package.json', 'package-lock.json', 'build.yaml']);
|
|
7
|
+
afterAll(() => suite.close());
|
|
8
|
+
it('should run service', async () => {
|
|
9
|
+
const { cli, environment } = await suite.setup({ taskName: 'api' });
|
|
10
|
+
const result = await cli.exec();
|
|
11
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
12
|
+
}, 120000);
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=services.spec.js.map
|
|
@@ -1,49 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const path_1 = require("path");
|
|
4
|
-
const expect_1 = require("../expect");
|
|
5
|
-
const restore_1 = require("../../executer/restore");
|
|
6
|
-
const plan_work_tree_1 = require("../../planner/utils/plan-work-tree");
|
|
7
|
-
const store_1 = require("../../executer/store");
|
|
8
|
-
const clean_1 = require("../../executer/clean");
|
|
9
|
-
const plan_work_nodes_1 = require("../../planner/utils/plan-work-nodes");
|
|
10
4
|
const get_test_suite_1 = require("../get-test-suite");
|
|
11
|
-
const execute_1 = require("../../executer/execute");
|
|
12
5
|
const fs_1 = require("fs");
|
|
13
|
-
const
|
|
6
|
+
const expect_1 = require("../expect");
|
|
14
7
|
describe('store/restore', () => {
|
|
15
|
-
const suite = get_test_suite_1.getTestSuite('store-restore', ['build.yaml', 'package.json']);
|
|
8
|
+
const suite = (0, get_test_suite_1.getTestSuite)('store-restore', ['build.yaml', 'package.json']);
|
|
16
9
|
afterAll(() => suite.close());
|
|
17
|
-
it('should clean created outputs locally', async () => {
|
|
18
|
-
const {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
expect(fs_1.existsSync(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
await
|
|
30
|
-
expect(fs_1.existsSync(
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
10
|
+
it('should clean and restore created outputs locally', async () => {
|
|
11
|
+
const { cli, environment } = await suite.setup({ taskName: 'example' });
|
|
12
|
+
const generatedPath = (0, path_1.join)(environment.cwd, 'node_modules');
|
|
13
|
+
const cacheStoragePath = (0, path_1.join)(environment.cwd, 'storage');
|
|
14
|
+
expect((0, fs_1.existsSync)(generatedPath)).toBeFalsy();
|
|
15
|
+
expect((0, fs_1.existsSync)(cacheStoragePath)).toBeFalsy();
|
|
16
|
+
const result = await cli.exec({});
|
|
17
|
+
await (0, expect_1.expectSuccessfulResult)(result, environment);
|
|
18
|
+
expect((0, fs_1.existsSync)(generatedPath)).toBeTruthy();
|
|
19
|
+
expect((0, fs_1.existsSync)(cacheStoragePath)).toBeFalsy();
|
|
20
|
+
await cli.store(cacheStoragePath);
|
|
21
|
+
expect((0, fs_1.existsSync)(cacheStoragePath)).toBeTruthy();
|
|
22
|
+
await cli.clean();
|
|
23
|
+
expect((0, fs_1.existsSync)(generatedPath)).toBeFalsy();
|
|
24
|
+
await cli.restore(cacheStoragePath);
|
|
25
|
+
expect((0, fs_1.existsSync)(generatedPath)).toBeTruthy();
|
|
26
|
+
const execAfterRestore = await cli.exec();
|
|
27
|
+
await (0, expect_1.expectSuccessfulResult)(execAfterRestore, environment);
|
|
28
|
+
const node = cli.node('example');
|
|
29
|
+
const nodeState = execAfterRestore.state.node[node.id];
|
|
30
|
+
expect(nodeState.type).toBe('completed');
|
|
31
|
+
if (nodeState.type === 'completed') {
|
|
32
|
+
expect(nodeState.cached).toBeTruthy();
|
|
33
|
+
}
|
|
35
34
|
});
|
|
36
|
-
it('should
|
|
37
|
-
const {
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
await
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
35
|
+
it('should clean and restore created outputs in container', async () => {
|
|
36
|
+
const { cli, environment } = await suite.setup({ taskName: 'example:docker' });
|
|
37
|
+
const cacheStoragePath = (0, path_1.join)(environment.cwd, 'storage');
|
|
38
|
+
const firstExecResult = await cli.exec();
|
|
39
|
+
await (0, expect_1.expectSuccessfulResult)(firstExecResult, environment);
|
|
40
|
+
await cli.store(cacheStoragePath);
|
|
41
|
+
await cli.clean();
|
|
42
|
+
await cli.restore(cacheStoragePath);
|
|
43
|
+
const execAfterRestore = await cli.exec();
|
|
44
|
+
await (0, expect_1.expectSuccessfulResult)(execAfterRestore, environment);
|
|
45
|
+
const node = cli.node('example:docker');
|
|
46
|
+
const nodeState = execAfterRestore.state.node[node.id];
|
|
47
|
+
expect(nodeState.type).toBe('completed');
|
|
48
|
+
if (nodeState.type === 'completed') {
|
|
49
|
+
expect(nodeState.cached).toBeTruthy();
|
|
50
|
+
}
|
|
47
51
|
});
|
|
48
52
|
});
|
|
49
53
|
//# sourceMappingURL=store.spec.js.map
|