@jahia/jahia-cli 0.2.0 → 0.3.1
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/dist/commands/init.js +4 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/jahia/provision.d.ts +37 -2
- package/dist/commands/jahia/provision.d.ts.map +1 -1
- package/dist/commands/jahia/provision.js +241 -53
- package/dist/commands/jahia/provision.js.map +1 -1
- package/dist/commands/tests/artifacts.d.ts +25 -0
- package/dist/commands/tests/artifacts.d.ts.map +1 -0
- package/dist/commands/tests/artifacts.js +112 -0
- package/dist/commands/tests/artifacts.js.map +1 -0
- package/dist/commands/tests/build.d.ts +30 -0
- package/dist/commands/tests/build.d.ts.map +1 -0
- package/dist/commands/tests/build.js +90 -0
- package/dist/commands/tests/build.js.map +1 -0
- package/dist/commands/tests/run.d.ts +28 -0
- package/dist/commands/tests/run.d.ts.map +1 -0
- package/dist/commands/tests/run.js +166 -0
- package/dist/commands/tests/run.js.map +1 -0
- package/dist/commands/workflow/init.d.ts.map +1 -1
- package/dist/commands/workflow/init.js +15 -14
- package/dist/commands/workflow/init.js.map +1 -1
- package/dist/commands/workflow/run.d.ts +3 -1
- package/dist/commands/workflow/run.d.ts.map +1 -1
- package/dist/commands/workflow/run.js +62 -14
- package/dist/commands/workflow/run.js.map +1 -1
- package/dist/lib/artifacts/collect-all.d.ts +17 -0
- package/dist/lib/artifacts/collect-all.d.ts.map +1 -0
- package/dist/lib/artifacts/collect-all.js +107 -0
- package/dist/lib/artifacts/collect-all.js.map +1 -0
- package/dist/lib/artifacts/copy-container-artifacts.d.ts +13 -0
- package/dist/lib/artifacts/copy-container-artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts/copy-container-artifacts.js +48 -0
- package/dist/lib/artifacts/copy-container-artifacts.js.map +1 -0
- package/dist/lib/artifacts/fetch-container-logs.d.ts +17 -0
- package/dist/lib/artifacts/fetch-container-logs.d.ts.map +1 -0
- package/dist/lib/artifacts/fetch-container-logs.js +36 -0
- package/dist/lib/artifacts/fetch-container-logs.js.map +1 -0
- package/dist/lib/artifacts/index.d.ts +6 -0
- package/dist/lib/artifacts/index.d.ts.map +1 -0
- package/dist/lib/artifacts/index.js +5 -0
- package/dist/lib/artifacts/index.js.map +1 -0
- package/dist/lib/artifacts/query-vlogs.d.ts +14 -0
- package/dist/lib/artifacts/query-vlogs.d.ts.map +1 -0
- package/dist/lib/artifacts/query-vlogs.js +33 -0
- package/dist/lib/artifacts/query-vlogs.js.map +1 -0
- package/dist/lib/artifacts/types.d.ts +28 -0
- package/dist/lib/artifacts/types.d.ts.map +1 -0
- package/dist/lib/artifacts/types.js +2 -0
- package/dist/lib/artifacts/types.js.map +1 -0
- package/dist/lib/components/cypress.d.ts +16 -0
- package/dist/lib/components/cypress.d.ts.map +1 -0
- package/dist/lib/components/cypress.js +35 -0
- package/dist/lib/components/cypress.js.map +1 -0
- package/dist/lib/components/index.d.ts.map +1 -1
- package/dist/lib/components/index.js +3 -0
- package/dist/lib/components/index.js.map +1 -1
- package/dist/lib/components/jahia.d.ts.map +1 -1
- package/dist/lib/components/jahia.js +1 -0
- package/dist/lib/components/jahia.js.map +1 -1
- package/dist/lib/components/smtp-server.d.ts.map +1 -1
- package/dist/lib/components/smtp-server.js +1 -0
- package/dist/lib/components/smtp-server.js.map +1 -1
- package/dist/lib/components/types.d.ts +12 -0
- package/dist/lib/components/types.d.ts.map +1 -1
- package/dist/lib/config/config-to-yaml-with-comments.d.ts.map +1 -1
- package/dist/lib/config/config-to-yaml-with-comments.js +28 -3
- package/dist/lib/config/config-to-yaml-with-comments.js.map +1 -1
- package/dist/lib/config/config-to-yaml.d.ts.map +1 -1
- package/dist/lib/config/config-to-yaml.js +13 -1
- package/dist/lib/config/config-to-yaml.js.map +1 -1
- package/dist/lib/config/parser.d.ts +17 -4
- package/dist/lib/config/parser.d.ts.map +1 -1
- package/dist/lib/config/parser.js +101 -12
- package/dist/lib/config/parser.js.map +1 -1
- package/dist/lib/config/types.d.ts +57 -3
- package/dist/lib/config/types.d.ts.map +1 -1
- package/dist/lib/providers/docker/container.d.ts +2 -0
- package/dist/lib/providers/docker/container.d.ts.map +1 -1
- package/dist/lib/providers/docker/container.js +5 -1
- package/dist/lib/providers/docker/container.js.map +1 -1
- package/dist/lib/provisioning/filter-files.d.ts +7 -0
- package/dist/lib/provisioning/filter-files.d.ts.map +1 -0
- package/dist/lib/provisioning/filter-files.js +14 -0
- package/dist/lib/provisioning/filter-files.js.map +1 -0
- package/dist/lib/provisioning/submit-file-action.d.ts +29 -0
- package/dist/lib/provisioning/submit-file-action.d.ts.map +1 -0
- package/dist/lib/provisioning/submit-file-action.js +75 -0
- package/dist/lib/provisioning/submit-file-action.js.map +1 -0
- package/dist/lib/provisioning/types.d.ts +11 -0
- package/dist/lib/provisioning/types.d.ts.map +1 -1
- package/dist/lib/tests/build-image.d.ts +33 -0
- package/dist/lib/tests/build-image.d.ts.map +1 -0
- package/dist/lib/tests/build-image.js +59 -0
- package/dist/lib/tests/build-image.js.map +1 -0
- package/dist/lib/workflow/build-sample-workflow.d.ts +5 -4
- package/dist/lib/workflow/build-sample-workflow.d.ts.map +1 -1
- package/dist/lib/workflow/build-sample-workflow.js +35 -31
- package/dist/lib/workflow/build-sample-workflow.js.map +1 -1
- package/dist/lib/workflow/executor.d.ts +3 -1
- package/dist/lib/workflow/executor.d.ts.map +1 -1
- package/dist/lib/workflow/executor.js +29 -0
- package/dist/lib/workflow/executor.js.map +1 -1
- package/dist/lib/workflow/format-workflow-sources.d.ts +17 -0
- package/dist/lib/workflow/format-workflow-sources.d.ts.map +1 -0
- package/dist/lib/workflow/format-workflow-sources.js +85 -0
- package/dist/lib/workflow/format-workflow-sources.js.map +1 -0
- package/dist/lib/workflow/load-global-workflows.d.ts +24 -0
- package/dist/lib/workflow/load-global-workflows.d.ts.map +1 -0
- package/dist/lib/workflow/load-global-workflows.js +49 -0
- package/dist/lib/workflow/load-global-workflows.js.map +1 -0
- package/dist/lib/workflow/merge-workflow-into-config.d.ts +4 -4
- package/dist/lib/workflow/merge-workflow-into-config.d.ts.map +1 -1
- package/dist/lib/workflow/merge-workflow-into-config.js +4 -4
- package/dist/lib/workflow/merge-workflow-into-config.js.map +1 -1
- package/dist/lib/workflow/merge-workflow-sources.d.ts +27 -0
- package/dist/lib/workflow/merge-workflow-sources.d.ts.map +1 -0
- package/dist/lib/workflow/merge-workflow-sources.js +55 -0
- package/dist/lib/workflow/merge-workflow-sources.js.map +1 -0
- package/dist/lib/workflow/resolve-workflow.d.ts +20 -0
- package/dist/lib/workflow/resolve-workflow.d.ts.map +1 -0
- package/dist/lib/workflow/resolve-workflow.js +38 -0
- package/dist/lib/workflow/resolve-workflow.js.map +1 -0
- package/dist/lib/workflow/resolve-workflows-file-path.d.ts +13 -0
- package/dist/lib/workflow/resolve-workflows-file-path.d.ts.map +1 -0
- package/dist/lib/workflow/resolve-workflows-file-path.js +22 -0
- package/dist/lib/workflow/resolve-workflows-file-path.js.map +1 -0
- package/oclif.manifest.json +318 -108
- package/package.json +4 -2
|
@@ -1,7 +1,12 @@
|
|
|
1
|
-
import { resolve } from 'node:path';
|
|
1
|
+
import { dirname, resolve } from 'node:path';
|
|
2
2
|
import { Command, Flags } from '@oclif/core';
|
|
3
3
|
import { loadConfigFile } from '../../lib/config/parser.js';
|
|
4
4
|
import { executeWorkflow } from '../../lib/workflow/executor.js';
|
|
5
|
+
import { buildWorkflowSourcesJson, formatAvailableWorkflows, formatWorkflowSources, } from '../../lib/workflow/format-workflow-sources.js';
|
|
6
|
+
import { loadGlobalWorkflows } from '../../lib/workflow/load-global-workflows.js';
|
|
7
|
+
import { mergeWorkflowSources } from '../../lib/workflow/merge-workflow-sources.js';
|
|
8
|
+
import { resolveDefaultWorkflow, resolveWorkflowByName } from '../../lib/workflow/resolve-workflow.js';
|
|
9
|
+
import { resolveWorkflowsFilePath } from '../../lib/workflow/resolve-workflows-file-path.js';
|
|
5
10
|
/**
|
|
6
11
|
* Formats a duration in milliseconds to a human-readable string.
|
|
7
12
|
*/
|
|
@@ -20,8 +25,10 @@ export const formatDuration = (ms) => {
|
|
|
20
25
|
/**
|
|
21
26
|
* Builds a formatted summary of workflow execution for human-readable output.
|
|
22
27
|
*/
|
|
23
|
-
export const buildWorkflowSummary = (steps, success, totalDurationMs) => {
|
|
24
|
-
const header = success
|
|
28
|
+
export const buildWorkflowSummary = (workflowName, steps, success, totalDurationMs) => {
|
|
29
|
+
const header = success
|
|
30
|
+
? `✓ Workflow "${workflowName}" completed successfully`
|
|
31
|
+
: `✗ Workflow "${workflowName}" failed`;
|
|
25
32
|
const stepLines = steps.map((step) => ` ${step.success ? '✓' : '✗'} ${step.name} (${formatDuration(step.durationMs)})${step.error !== undefined ? `\n Error: ${step.error}` : ''}`);
|
|
26
33
|
return [
|
|
27
34
|
header,
|
|
@@ -33,11 +40,17 @@ export const buildWorkflowSummary = (steps, success, totalDurationMs) => {
|
|
|
33
40
|
].join('\n');
|
|
34
41
|
};
|
|
35
42
|
export default class WorkflowRun extends Command {
|
|
36
|
-
static description = 'Execute a workflow defined in a configuration file. ' +
|
|
43
|
+
static description = 'Execute a named workflow defined in a configuration file. ' +
|
|
44
|
+
'Supports loading shared workflows from a global workflows file ' +
|
|
45
|
+
'(via --workflows-file flag or workflowsFile config key). ' +
|
|
46
|
+
'Local workflows override global ones with the same name. ' +
|
|
37
47
|
'Runs steps sequentially — shell commands via execa, ' +
|
|
38
|
-
'jahia-cli commands via subprocess. Stops on first failure.'
|
|
48
|
+
'jahia-cli commands via subprocess. Stops on first failure. ' +
|
|
49
|
+
'Use --name to select a workflow, or omit to run the default.';
|
|
39
50
|
static examples = [
|
|
40
51
|
'<%= config.bin %> workflow run --config jahia-cli.config.yml',
|
|
52
|
+
'<%= config.bin %> workflow run --config jahia-cli.config.yml --name setup',
|
|
53
|
+
'<%= config.bin %> workflow run --config jahia-cli.config.yml --workflows-file shared.yml',
|
|
41
54
|
'<%= config.bin %> workflow run --config ./my-config.yml --json',
|
|
42
55
|
];
|
|
43
56
|
static flags = {
|
|
@@ -46,6 +59,16 @@ export default class WorkflowRun extends Command {
|
|
|
46
59
|
description: 'Path to the YAML configuration file',
|
|
47
60
|
required: true,
|
|
48
61
|
}),
|
|
62
|
+
name: Flags.string({
|
|
63
|
+
char: 'n',
|
|
64
|
+
description: 'Name of the workflow to run (runs default workflow if omitted)',
|
|
65
|
+
}),
|
|
66
|
+
'workflows-file': Flags.string({
|
|
67
|
+
char: 'w',
|
|
68
|
+
description: 'Path to a global workflows YAML file. ' +
|
|
69
|
+
'Merged with local config workflows (local takes precedence). ' +
|
|
70
|
+
'Resolved relative to CWD. Overrides the workflowsFile config key.',
|
|
71
|
+
}),
|
|
49
72
|
json: Flags.boolean({
|
|
50
73
|
description: 'Output result as structured JSON (for AI agents and scripting)',
|
|
51
74
|
default: false,
|
|
@@ -58,15 +81,37 @@ export default class WorkflowRun extends Command {
|
|
|
58
81
|
async run() {
|
|
59
82
|
const { flags } = await this.parse(WorkflowRun);
|
|
60
83
|
const configPath = resolve(flags.config);
|
|
84
|
+
const configDir = dirname(configPath);
|
|
61
85
|
const config = await loadConfigFile(configPath);
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
86
|
+
// Resolve global workflows file path (flag > config key > none)
|
|
87
|
+
const globalFilePath = resolveWorkflowsFilePath(configDir, config.workflowsFile, flags['workflows-file']);
|
|
88
|
+
// Load global workflows if configured
|
|
89
|
+
const globalResult = globalFilePath !== undefined
|
|
90
|
+
? await loadGlobalWorkflows(globalFilePath)
|
|
91
|
+
: undefined;
|
|
92
|
+
// Merge global + local (local wins)
|
|
93
|
+
const mergedResult = mergeWorkflowSources(globalResult?.workflows, config.workflows);
|
|
94
|
+
const effectiveWorkflows = mergedResult?.workflows;
|
|
95
|
+
if (effectiveWorkflows === undefined || Object.keys(effectiveWorkflows).length === 0) {
|
|
96
|
+
this.error('No workflows found in local config or global workflows file.\n\n' +
|
|
97
|
+
' Run "jahia-cli workflow init" to generate sample workflows,\n' +
|
|
98
|
+
' or specify a global workflows file with --workflows-file.');
|
|
65
99
|
return;
|
|
66
100
|
}
|
|
67
|
-
|
|
101
|
+
// mergedResult is guaranteed defined when effectiveWorkflows is defined
|
|
102
|
+
const merged = mergedResult ?? { workflows: effectiveWorkflows, sources: {} };
|
|
103
|
+
// Resolve which workflow to run
|
|
104
|
+
const { name: workflowName, workflow } = flags.name !== undefined
|
|
105
|
+
? { name: flags.name, workflow: resolveWorkflowByName(effectiveWorkflows, flags.name) }
|
|
106
|
+
: resolveDefaultWorkflow(effectiveWorkflows);
|
|
107
|
+
const { steps } = workflow;
|
|
108
|
+
// Log verbose source/selection info
|
|
68
109
|
if (!flags.json) {
|
|
69
|
-
this.log(
|
|
110
|
+
this.log(formatWorkflowSources(configPath, config.workflows !== undefined ? Object.keys(config.workflows).length : 0, globalResult));
|
|
111
|
+
this.log('');
|
|
112
|
+
this.log(formatAvailableWorkflows(merged, workflowName));
|
|
113
|
+
this.log('');
|
|
114
|
+
this.log(`▶ Running workflow "${workflowName}" (${String(steps.length)} steps)\n`);
|
|
70
115
|
}
|
|
71
116
|
const cliEntryPoint = resolve(this.config.root, 'bin', 'run.js');
|
|
72
117
|
const result = await executeWorkflow({
|
|
@@ -75,19 +120,22 @@ export default class WorkflowRun extends Command {
|
|
|
75
120
|
statePath: flags.state,
|
|
76
121
|
cwd: process.cwd(),
|
|
77
122
|
cliEntryPoint,
|
|
123
|
+
workflows: effectiveWorkflows,
|
|
124
|
+
callStack: [workflowName],
|
|
78
125
|
onStepStart: flags.json
|
|
79
126
|
? undefined
|
|
80
|
-
: (
|
|
81
|
-
this.log(` [${String(index + 1)}/${String(steps.length)}] ${
|
|
127
|
+
: (stepName, index) => {
|
|
128
|
+
this.log(` [${String(index + 1)}/${String(steps.length)}] ${stepName}...`);
|
|
82
129
|
},
|
|
83
130
|
onStepComplete: undefined,
|
|
84
131
|
});
|
|
85
132
|
if (flags.json) {
|
|
86
|
-
|
|
133
|
+
const sourcesJson = buildWorkflowSourcesJson(configPath, config.workflows, globalResult, merged, workflowName);
|
|
134
|
+
this.log(JSON.stringify({ ...sourcesJson, ...result, workflowName }, undefined, 2));
|
|
87
135
|
}
|
|
88
136
|
else {
|
|
89
137
|
this.log('');
|
|
90
|
-
this.log(buildWorkflowSummary(result.steps, result.success, result.totalDurationMs));
|
|
138
|
+
this.log(buildWorkflowSummary(workflowName, result.steps, result.success, result.totalDurationMs));
|
|
91
139
|
}
|
|
92
140
|
if (!result.success) {
|
|
93
141
|
this.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/workflow/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/workflow/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PersistedEnvironment } from '../state/types.js';
|
|
2
|
+
import type { CollectionResult } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the VictoriaLogs base URL from a persisted environment.
|
|
5
|
+
* Returns undefined if VictoriaLogs is not present or its port can't be determined.
|
|
6
|
+
*/
|
|
7
|
+
export declare const resolveVlogsUrl: (env: PersistedEnvironment) => string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Collects all artifacts (logs + file copies) for every component in an environment.
|
|
10
|
+
* Errors are isolated per-component — one failure does not block the others.
|
|
11
|
+
*/
|
|
12
|
+
export declare const collectAllArtifacts: (params: {
|
|
13
|
+
readonly env: PersistedEnvironment;
|
|
14
|
+
readonly outputDir: string;
|
|
15
|
+
readonly onProgress?: ((message: string) => void) | undefined;
|
|
16
|
+
}) => Promise<CollectionResult>;
|
|
17
|
+
//# sourceMappingURL=collect-all.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-all.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/collect-all.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI9D,OAAO,KAAK,EAAsB,gBAAgB,EAA6B,MAAM,YAAY,CAAC;AAElG;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,oBAAoB,KAAG,MAAM,GAAG,SAUpE,CAAC;AAkCF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAU,QAAQ;IAChD,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/D,KAAG,OAAO,CAAC,gBAAgB,CA0E3B,CAAC"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { resolveConfigComponents } from '../config/parser.js';
|
|
4
|
+
import { copyContainerArtifacts } from './copy-container-artifacts.js';
|
|
5
|
+
import { fetchContainerLogs } from './fetch-container-logs.js';
|
|
6
|
+
/**
|
|
7
|
+
* Resolves the VictoriaLogs base URL from a persisted environment.
|
|
8
|
+
* Returns undefined if VictoriaLogs is not present or its port can't be determined.
|
|
9
|
+
*/
|
|
10
|
+
export const resolveVlogsUrl = (env) => {
|
|
11
|
+
const vlComponent = env.components.find((c) => c.name === 'victorialogs');
|
|
12
|
+
if (vlComponent === undefined) {
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
// VictoriaLogs HTTP API listens on port 9428
|
|
16
|
+
const resolved = env.config.components.find((c) => c.name === 'victorialogs');
|
|
17
|
+
const portOverride = resolved?.overrides?.ports?.find((p) => p.container === 9428);
|
|
18
|
+
const hostPort = portOverride?.host ?? 9428;
|
|
19
|
+
return `http://localhost:${String(hostPort)}`;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Collects logs for a single container, returning log metadata.
|
|
23
|
+
*/
|
|
24
|
+
const collectLogsForComponent = async (params) => {
|
|
25
|
+
const logFileName = `${params.componentName}.log`;
|
|
26
|
+
const logFilePath = join(params.outputDir, logFileName);
|
|
27
|
+
try {
|
|
28
|
+
const logResult = await fetchContainerLogs({
|
|
29
|
+
containerId: params.containerId,
|
|
30
|
+
componentName: params.componentName,
|
|
31
|
+
envName: params.envName,
|
|
32
|
+
vlogsBaseUrl: params.vlogsBaseUrl,
|
|
33
|
+
});
|
|
34
|
+
await writeFile(logFilePath, logResult.content, 'utf-8');
|
|
35
|
+
return { logFile: logFileName, logSource: logResult.source, logError: undefined };
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
39
|
+
return { logFile: undefined, logSource: undefined, logError: message };
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Collects all artifacts (logs + file copies) for every component in an environment.
|
|
44
|
+
* Errors are isolated per-component — one failure does not block the others.
|
|
45
|
+
*/
|
|
46
|
+
export const collectAllArtifacts = async (params) => {
|
|
47
|
+
const { env, outputDir, onProgress } = params;
|
|
48
|
+
if (env.provider !== 'docker') {
|
|
49
|
+
throw new Error(`Artifact collection is only supported for Docker environments (got "${env.provider}").`);
|
|
50
|
+
}
|
|
51
|
+
await mkdir(outputDir, { recursive: true });
|
|
52
|
+
const vlogsUrl = resolveVlogsUrl(env);
|
|
53
|
+
// Re-resolve components from config to get effectiveArtifacts
|
|
54
|
+
const resolvedComponents = resolveConfigComponents(env.config);
|
|
55
|
+
// Map persisted components by name for container ID lookup
|
|
56
|
+
const containerIdByName = new Map(env.components.map((c) => [c.name, c.containerId]));
|
|
57
|
+
const componentResults = await resolvedComponents.reduce(async (chainPromise, resolved) => {
|
|
58
|
+
const chain = await chainPromise;
|
|
59
|
+
const componentName = resolved.definition.name;
|
|
60
|
+
const containerId = containerIdByName.get(componentName);
|
|
61
|
+
if (containerId === undefined) {
|
|
62
|
+
return [...chain, {
|
|
63
|
+
componentName,
|
|
64
|
+
containerId: 'unknown',
|
|
65
|
+
logFile: undefined,
|
|
66
|
+
logSource: undefined,
|
|
67
|
+
logError: `No container ID found in state for "${componentName}"`,
|
|
68
|
+
artifacts: [],
|
|
69
|
+
}];
|
|
70
|
+
}
|
|
71
|
+
// Collect logs
|
|
72
|
+
onProgress?.(`Collecting logs for ${componentName}...`);
|
|
73
|
+
const logResult = await collectLogsForComponent({
|
|
74
|
+
containerId,
|
|
75
|
+
componentName,
|
|
76
|
+
envName: env.name,
|
|
77
|
+
vlogsBaseUrl: vlogsUrl,
|
|
78
|
+
outputDir,
|
|
79
|
+
});
|
|
80
|
+
// Copy artifacts
|
|
81
|
+
const artifactResults = resolved.effectiveArtifacts.length > 0
|
|
82
|
+
? await (() => {
|
|
83
|
+
onProgress?.(`Copying artifacts for ${componentName}...`);
|
|
84
|
+
return copyContainerArtifacts({
|
|
85
|
+
containerId,
|
|
86
|
+
componentName,
|
|
87
|
+
artifactPaths: resolved.effectiveArtifacts,
|
|
88
|
+
outputDir,
|
|
89
|
+
});
|
|
90
|
+
})()
|
|
91
|
+
: [];
|
|
92
|
+
return [...chain, {
|
|
93
|
+
componentName,
|
|
94
|
+
containerId,
|
|
95
|
+
logFile: logResult.logFile,
|
|
96
|
+
logSource: logResult.logSource,
|
|
97
|
+
logError: logResult.logError,
|
|
98
|
+
artifacts: artifactResults,
|
|
99
|
+
}];
|
|
100
|
+
}, Promise.resolve([]));
|
|
101
|
+
return {
|
|
102
|
+
envName: env.name,
|
|
103
|
+
outputDir,
|
|
104
|
+
components: componentResults,
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=collect-all.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect-all.js","sourceRoot":"","sources":["../../../src/lib/artifacts/collect-all.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ArtifactCopyResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Copies artifact paths from a container using `docker cp`.
|
|
4
|
+
* Each artifact path is copied to a per-component subdirectory.
|
|
5
|
+
* Errors are captured per-path — one failure does not block others.
|
|
6
|
+
*/
|
|
7
|
+
export declare const copyContainerArtifacts: (params: {
|
|
8
|
+
readonly containerId: string;
|
|
9
|
+
readonly componentName: string;
|
|
10
|
+
readonly artifactPaths: readonly string[];
|
|
11
|
+
readonly outputDir: string;
|
|
12
|
+
}) => Promise<readonly ArtifactCopyResult[]>;
|
|
13
|
+
//# sourceMappingURL=copy-container-artifacts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-container-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/copy-container-artifacts.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAU,QAAQ;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,KAAG,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAyCxC,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { mkdir } from 'node:fs/promises';
|
|
3
|
+
import { basename, join } from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
/**
|
|
7
|
+
* Copies artifact paths from a container using `docker cp`.
|
|
8
|
+
* Each artifact path is copied to a per-component subdirectory.
|
|
9
|
+
* Errors are captured per-path — one failure does not block others.
|
|
10
|
+
*/
|
|
11
|
+
export const copyContainerArtifacts = async (params) => {
|
|
12
|
+
if (params.artifactPaths.length === 0) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
const componentDir = join(params.outputDir, params.componentName);
|
|
16
|
+
await mkdir(componentDir, { recursive: true });
|
|
17
|
+
const results = await params.artifactPaths.reduce(async (chainPromise, artifactPath) => {
|
|
18
|
+
const chain = await chainPromise;
|
|
19
|
+
const destName = basename(artifactPath);
|
|
20
|
+
const destPath = join(componentDir, destName);
|
|
21
|
+
try {
|
|
22
|
+
// First try copying as directory contents (trailing '/.' avoids double-nesting).
|
|
23
|
+
// If the path is a file, this will fail, so we fall back to a plain copy.
|
|
24
|
+
try {
|
|
25
|
+
await mkdir(destPath, { recursive: true });
|
|
26
|
+
await execFileAsync('docker', [
|
|
27
|
+
'cp',
|
|
28
|
+
`${params.containerId}:${artifactPath}/.`,
|
|
29
|
+
destPath,
|
|
30
|
+
]);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
await execFileAsync('docker', [
|
|
34
|
+
'cp',
|
|
35
|
+
`${params.containerId}:${artifactPath}`,
|
|
36
|
+
destPath,
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
return [...chain, { path: artifactPath, success: true }];
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
43
|
+
return [...chain, { path: artifactPath, success: false, error: message }];
|
|
44
|
+
}
|
|
45
|
+
}, Promise.resolve([]));
|
|
46
|
+
return results;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=copy-container-artifacts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"copy-container-artifacts.js","sourceRoot":"","sources":["../../../src/lib/artifacts/copy-container-artifacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,EAAE,MAK5C,EAA0C,EAAE;IAC3C,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAClE,MAAM,KAAK,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,MAAM,CAC/C,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC;QACjC,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAE9C,IAAI,CAAC;YACH,iFAAiF;YACjF,0EAA0E;YAC1E,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3C,MAAM,aAAa,CAAC,QAAQ,EAAE;oBAC5B,IAAI;oBACJ,GAAG,MAAM,CAAC,WAAW,IAAI,YAAY,IAAI;oBACzC,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,aAAa,CAAC,QAAQ,EAAE;oBAC5B,IAAI;oBACJ,GAAG,MAAM,CAAC,WAAW,IAAI,YAAY,EAAE;oBACvC,QAAQ;iBACT,CAAC,CAAC;YACL,CAAC;YACD,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,KAAK,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAC5E,CAAC;IACH,CAAC,EACD,OAAO,CAAC,OAAO,CAAC,EAAmC,CAAC,CACrD,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collects logs for a container, trying VictoriaLogs first with `docker logs` fallback.
|
|
3
|
+
*
|
|
4
|
+
* Note: containers started with the syslog log driver will NOT have local Docker logs,
|
|
5
|
+
* so the `docker logs` fallback only works for infrastructure containers (e.g. VictoriaLogs
|
|
6
|
+
* itself) that use the default json-file driver.
|
|
7
|
+
*/
|
|
8
|
+
export declare const fetchContainerLogs: (params: {
|
|
9
|
+
readonly containerId: string;
|
|
10
|
+
readonly componentName: string;
|
|
11
|
+
readonly envName: string;
|
|
12
|
+
readonly vlogsBaseUrl: string | undefined;
|
|
13
|
+
}) => Promise<{
|
|
14
|
+
readonly content: string;
|
|
15
|
+
readonly source: "victorialogs" | "docker";
|
|
16
|
+
}>;
|
|
17
|
+
//# sourceMappingURL=fetch-container-logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-container-logs.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/fetch-container-logs.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,GAAU,QAAQ;IAC/C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C,KAAG,OAAO,CAAC;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,QAAQ,CAAA;CAAE,CAuBnF,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
import { queryVictoriaLogs } from './query-vlogs.js';
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
/**
|
|
6
|
+
* Collects logs for a container, trying VictoriaLogs first with `docker logs` fallback.
|
|
7
|
+
*
|
|
8
|
+
* Note: containers started with the syslog log driver will NOT have local Docker logs,
|
|
9
|
+
* so the `docker logs` fallback only works for infrastructure containers (e.g. VictoriaLogs
|
|
10
|
+
* itself) that use the default json-file driver.
|
|
11
|
+
*/
|
|
12
|
+
export const fetchContainerLogs = async (params) => {
|
|
13
|
+
// Try VictoriaLogs first
|
|
14
|
+
if (params.vlogsBaseUrl !== undefined) {
|
|
15
|
+
try {
|
|
16
|
+
const content = await queryVictoriaLogs({
|
|
17
|
+
vlogsBaseUrl: params.vlogsBaseUrl,
|
|
18
|
+
envName: params.envName,
|
|
19
|
+
componentName: params.componentName,
|
|
20
|
+
});
|
|
21
|
+
return { content, source: 'victorialogs' };
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// VictoriaLogs unavailable — try docker logs fallback
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Fallback to docker logs (works for containers with default log driver)
|
|
28
|
+
const { stdout, stderr } = await execFileAsync('docker', [
|
|
29
|
+
'logs',
|
|
30
|
+
'--tail',
|
|
31
|
+
'10000',
|
|
32
|
+
params.containerId,
|
|
33
|
+
]);
|
|
34
|
+
return { content: stdout + stderr, source: 'docker' };
|
|
35
|
+
};
|
|
36
|
+
//# sourceMappingURL=fetch-container-logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-container-logs.js","sourceRoot":"","sources":["../../../src/lib/artifacts/fetch-container-logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,MAKxC,EAAqF,EAAE;IACtF,yBAAyB;IACzB,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC;gBACtC,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,aAAa,EAAE,MAAM,CAAC,aAAa;aACpC,CAAC,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;IACH,CAAC;IAED,yEAAyE;IACzE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE;QACvD,MAAM;QACN,QAAQ;QACR,OAAO;QACP,MAAM,CAAC,WAAW;KACnB,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACxD,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { collectAllArtifacts, resolveVlogsUrl } from './collect-all.js';
|
|
2
|
+
export { copyContainerArtifacts } from './copy-container-artifacts.js';
|
|
3
|
+
export { fetchContainerLogs } from './fetch-container-logs.js';
|
|
4
|
+
export { queryVictoriaLogs } from './query-vlogs.js';
|
|
5
|
+
export type { ArtifactCopyResult, CollectionResult, ComponentCollectionResult } from './types.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { collectAllArtifacts, resolveVlogsUrl } from './collect-all.js';
|
|
2
|
+
export { copyContainerArtifacts } from './copy-container-artifacts.js';
|
|
3
|
+
export { fetchContainerLogs } from './fetch-container-logs.js';
|
|
4
|
+
export { queryVictoriaLogs } from './query-vlogs.js';
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/artifacts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Queries VictoriaLogs for container logs using the syslog tag.
|
|
3
|
+
*
|
|
4
|
+
* The Docker syslog driver sets the tag to `jahia-cli-{envName}-{{.Name}}`
|
|
5
|
+
* where `{{.Name}}` is the Docker container name `jahia-cli-{envName}-{componentName}`.
|
|
6
|
+
* VictoriaLogs stores this in the `app_name` field (rfc5424 APP-NAME).
|
|
7
|
+
*/
|
|
8
|
+
export declare const queryVictoriaLogs: (params: {
|
|
9
|
+
readonly vlogsBaseUrl: string;
|
|
10
|
+
readonly envName: string;
|
|
11
|
+
readonly componentName: string;
|
|
12
|
+
readonly limit?: number | undefined;
|
|
13
|
+
}) => Promise<string>;
|
|
14
|
+
//# sourceMappingURL=query-vlogs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-vlogs.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/query-vlogs.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,eAAO,MAAM,iBAAiB,GAAU,QAAQ;IAC9C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC,KAAG,OAAO,CAAC,MAAM,CAwBjB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { promisify } from 'node:util';
|
|
3
|
+
const execFileAsync = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* Queries VictoriaLogs for container logs using the syslog tag.
|
|
6
|
+
*
|
|
7
|
+
* The Docker syslog driver sets the tag to `jahia-cli-{envName}-{{.Name}}`
|
|
8
|
+
* where `{{.Name}}` is the Docker container name `jahia-cli-{envName}-{componentName}`.
|
|
9
|
+
* VictoriaLogs stores this in the `app_name` field (rfc5424 APP-NAME).
|
|
10
|
+
*/
|
|
11
|
+
export const queryVictoriaLogs = async (params) => {
|
|
12
|
+
const containerDockerName = `jahia-cli-${params.envName}-${params.componentName}`;
|
|
13
|
+
const syslogTag = `jahia-cli-${params.envName}-${containerDockerName}`;
|
|
14
|
+
const limit = params.limit ?? 10000;
|
|
15
|
+
const query = `app_name:${syslogTag}`;
|
|
16
|
+
const url = `${params.vlogsBaseUrl}/select/logsql/query?query=${encodeURIComponent(query)}&limit=${String(limit)}`;
|
|
17
|
+
const { stdout } = await execFileAsync('curl', ['-sf', url], {
|
|
18
|
+
maxBuffer: 50 * 1024 * 1024,
|
|
19
|
+
});
|
|
20
|
+
// Extract just the _msg field from each JSON line for readable log output
|
|
21
|
+
const lines = stdout.trim().split('\n').filter((line) => line.length > 0);
|
|
22
|
+
const messages = lines.map((line) => {
|
|
23
|
+
try {
|
|
24
|
+
const parsed = JSON.parse(line);
|
|
25
|
+
return typeof parsed['_msg'] === 'string' ? parsed['_msg'] : line;
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return line;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
return messages.join('\n');
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=query-vlogs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-vlogs.js","sourceRoot":"","sources":["../../../src/lib/artifacts/query-vlogs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,EAAE,MAKvC,EAAmB,EAAE;IACpB,MAAM,mBAAmB,GAAG,aAAa,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;IAClF,MAAM,SAAS,GAAG,aAAa,MAAM,CAAC,OAAO,IAAI,mBAAmB,EAAE,CAAC;IACvE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;IAEpC,MAAM,KAAK,GAAG,YAAY,SAAS,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,8BAA8B,kBAAkB,CAAC,KAAK,CAAC,UAAU,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IAEnH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;QAC3D,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;KAC5B,CAAC,CAAC;IAEH,0EAA0E;IAC1E,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC1E,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;YAC3D,OAAO,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpE,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result of copying a single artifact path from a container.
|
|
3
|
+
*/
|
|
4
|
+
export interface ArtifactCopyResult {
|
|
5
|
+
readonly path: string;
|
|
6
|
+
readonly success: boolean;
|
|
7
|
+
readonly error?: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Outcome of collecting all artifacts for a single component.
|
|
11
|
+
*/
|
|
12
|
+
export interface ComponentCollectionResult {
|
|
13
|
+
readonly componentName: string;
|
|
14
|
+
readonly containerId: string;
|
|
15
|
+
readonly logFile: string | undefined;
|
|
16
|
+
readonly logSource: 'victorialogs' | 'docker' | undefined;
|
|
17
|
+
readonly logError?: string | undefined;
|
|
18
|
+
readonly artifacts: readonly ArtifactCopyResult[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Overall result of collecting artifacts for the entire environment.
|
|
22
|
+
*/
|
|
23
|
+
export interface CollectionResult {
|
|
24
|
+
readonly envName: string;
|
|
25
|
+
readonly outputDir: string;
|
|
26
|
+
readonly components: readonly ComponentCollectionResult[];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACrC;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,SAAS,EAAE,SAAS,kBAAkB,EAAE,CAAC;CACnD;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC3D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/artifacts/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ComponentDefinition } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Cypress test runner component.
|
|
4
|
+
*
|
|
5
|
+
* This component runs Cypress end-to-end tests against a Jahia environment.
|
|
6
|
+
* Unlike long-lived services, the test container runs to completion then exits.
|
|
7
|
+
* The container is NOT auto-removed — it's kept for post-run debugging/inspection.
|
|
8
|
+
*
|
|
9
|
+
* The image is typically built locally via `tests build` and not pulled from a registry.
|
|
10
|
+
* Override `image` in config to use a custom test image.
|
|
11
|
+
*
|
|
12
|
+
* Environment variables use in-network Docker aliases (e.g. `http://jahia:8080`)
|
|
13
|
+
* since the test container shares the environment's Docker network.
|
|
14
|
+
*/
|
|
15
|
+
export declare const cypress: ComponentDefinition;
|
|
16
|
+
//# sourceMappingURL=cypress.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypress.d.ts","sourceRoot":"","sources":["../../../src/lib/components/cypress.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,OAAO,EAAE,mBAoBrB,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cypress test runner component.
|
|
3
|
+
*
|
|
4
|
+
* This component runs Cypress end-to-end tests against a Jahia environment.
|
|
5
|
+
* Unlike long-lived services, the test container runs to completion then exits.
|
|
6
|
+
* The container is NOT auto-removed — it's kept for post-run debugging/inspection.
|
|
7
|
+
*
|
|
8
|
+
* The image is typically built locally via `tests build` and not pulled from a registry.
|
|
9
|
+
* Override `image` in config to use a custom test image.
|
|
10
|
+
*
|
|
11
|
+
* Environment variables use in-network Docker aliases (e.g. `http://jahia:8080`)
|
|
12
|
+
* since the test container shares the environment's Docker network.
|
|
13
|
+
*/
|
|
14
|
+
export const cypress = {
|
|
15
|
+
name: 'cypress',
|
|
16
|
+
description: 'Cypress end-to-end test runner',
|
|
17
|
+
image: 'jahia-tests',
|
|
18
|
+
defaultTag: 'latest',
|
|
19
|
+
ports: [],
|
|
20
|
+
env: {
|
|
21
|
+
JAHIA_URL: 'http://jahia:8080',
|
|
22
|
+
SUPER_USER_PASSWORD: '${SUPER_USER_PASSWORD:-root1234}',
|
|
23
|
+
NEXUS_USERNAME: '${NEXUS_USERNAME:-}',
|
|
24
|
+
NEXUS_PASSWORD: '${NEXUS_PASSWORD:-}',
|
|
25
|
+
MANIFEST: '${MANIFEST:-}',
|
|
26
|
+
},
|
|
27
|
+
volumes: [],
|
|
28
|
+
dependsOn: ['jahia'],
|
|
29
|
+
networkAliases: ['cypress'],
|
|
30
|
+
category: 'application',
|
|
31
|
+
isTransparent: false,
|
|
32
|
+
multiInstance: false,
|
|
33
|
+
providerSupport: ['docker'],
|
|
34
|
+
};
|
|
35
|
+
//# sourceMappingURL=cypress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypress.js","sourceRoot":"","sources":["../../../src/lib/components/cypress.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,OAAO,GAAwB;IAC1C,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,gCAAgC;IAC7C,KAAK,EAAE,aAAa;IACpB,UAAU,EAAE,QAAQ;IACpB,KAAK,EAAE,EAAE;IACT,GAAG,EAAE;QACH,SAAS,EAAE,mBAAmB;QAC9B,mBAAmB,EAAE,kCAAkC;QACvD,cAAc,EAAE,qBAAqB;QACrC,cAAc,EAAE,qBAAqB;QACrC,QAAQ,EAAE,eAAe;KAC1B;IACD,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,CAAC,OAAO,CAAC;IACpB,cAAc,EAAE,CAAC,SAAS,CAAC;IAC3B,QAAQ,EAAE,aAAa;IACvB,aAAa,EAAE,KAAK;IACpB,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,CAAC,QAAQ,CAAC;CAC5B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAOhH;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAK5E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAO,SAAS,MAAM,EAAqC,CAAC;AAE3F;;GAEG;AACH,eAAO,MAAM,cAAc,QAAO,SAAS,mBAAmB,EAC3B,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,4BAA4B,QAAO,SAAS,mBAAmB,EACT,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,yBAAyB,QAAO,SAAS,mBAAmB,EACP,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,wBAAwB,GAAI,UAAU,iBAAiB,KAAG,SAAS,mBAAmB,EACzB,CAAC;AAE3E;;;GAGG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,mBAAmB,GAAG,SACxC,CAAC;AAE3B;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAC9B,KAAK,MAAM,KACV;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAgB5D,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,GAC3B,YAAY,mBAAmB,EAC/B,YAAW,kBAAuB,KACjC,iBAgBF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,YAAY,SAAS,iBAAiB,EAAE,KACvC,SAAS,iBAAiB,EAsB5B,CAAC;AAEF,YAAY,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC"}
|