@abgov/nx-oc 13.0.0-beta.3 → 13.0.0-beta.4
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/package.json +1 -1
- package/src/executors/sandbox/sandbox.js +35 -1
- package/src/executors/sandbox/sandbox.js.map +1 -1
- package/src/executors/sandbox/sandbox.spec.ts +38 -1
- package/src/executors/sandbox/schema.d.ts +1 -0
- package/src/executors/sandbox/schema.json +5 -0
- package/src/generators/sandbox/files/SANDBOX.md__tmpl__ +9 -1
package/package.json
CHANGED
|
@@ -47,6 +47,17 @@ function run(label, cmd, cwd) {
|
|
|
47
47
|
devkit_1.logger.info(` $ ${cmd}`);
|
|
48
48
|
(0, child_process_1.execSync)(cmd, { stdio: 'inherit', cwd, shell: '/bin/bash' });
|
|
49
49
|
}
|
|
50
|
+
// Run a command and capture stdout; returns '' on any failure.
|
|
51
|
+
function capture(cmd, cwd) {
|
|
52
|
+
try {
|
|
53
|
+
return (0, child_process_1.execSync)(cmd, { cwd, shell: '/bin/bash', stdio: ['ignore', 'pipe', 'ignore'] })
|
|
54
|
+
.toString()
|
|
55
|
+
.trim();
|
|
56
|
+
}
|
|
57
|
+
catch (_a) {
|
|
58
|
+
return '';
|
|
59
|
+
}
|
|
60
|
+
}
|
|
50
61
|
// oc tag triggers an async imagestream reconcile, so a back-to-back
|
|
51
62
|
// import-image can 409 ("object has been modified"). Retry until it settles.
|
|
52
63
|
function importWithRetry(imageStreamTag, namespace, cwd, retries) {
|
|
@@ -73,7 +84,7 @@ function runExecutor(options, context) {
|
|
|
73
84
|
devkit_1.logger.error('[nx-oc:sandbox] Could not resolve the target project.');
|
|
74
85
|
return { success: false };
|
|
75
86
|
}
|
|
76
|
-
const { sandboxProject, registry, imageTag = 'sandbox', skipBuild = false, skipPush = false, importRetries = 5, } = options;
|
|
87
|
+
const { sandboxProject, registry, imageTag = 'sandbox', skipBuild = false, skipPush = false, deployBackend = false, importRetries = 5, } = options;
|
|
77
88
|
if (!sandboxProject) {
|
|
78
89
|
devkit_1.logger.error('[nx-oc:sandbox] "sandboxProject" is required.');
|
|
79
90
|
return { success: false };
|
|
@@ -148,6 +159,29 @@ function runExecutor(options, context) {
|
|
|
148
159
|
run(`Ensure paired Service ${name}`, `oc get service ${name} -n ${sandboxProject} >/dev/null 2>&1 || ` +
|
|
149
160
|
`oc create service clusterip ${name} --tcp=${port}:${port} -n ${sandboxProject}`, cwd);
|
|
150
161
|
}
|
|
162
|
+
// The Service stub above only stops nginx crashlooping; the backend needs
|
|
163
|
+
// its own pods for /api proxying to work. Deploy it (opt-in) or warn that
|
|
164
|
+
// proxied calls will 502 until it is deployed separately.
|
|
165
|
+
for (const { name } of proxyServices) {
|
|
166
|
+
if (deployBackend) {
|
|
167
|
+
try {
|
|
168
|
+
run(`Deploy paired backend ${name}`, `npx nx run ${name}:sandbox`, cwd);
|
|
169
|
+
}
|
|
170
|
+
catch (_e) {
|
|
171
|
+
throw new Error(`--deployBackend: could not deploy paired backend "${name}". Ensure it has a sandbox target ` +
|
|
172
|
+
`(nx g @abgov/nx-oc:sandbox ${name} --sandboxProject ${sandboxProject}).`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
const endpoints = capture(`oc get endpoints ${name} -n ${sandboxProject} -o jsonpath='{.subsets[*].addresses[*].ip}'`, cwd);
|
|
177
|
+
if (!endpoints) {
|
|
178
|
+
devkit_1.logger.warn(`\n⚠ Paired backend "${name}" has no running pods in ${sandboxProject}. ` +
|
|
179
|
+
`The frontend will deploy, but requests proxied to ${name} will 502 until it is deployed:\n` +
|
|
180
|
+
` nx run ${name}:sandbox\n` +
|
|
181
|
+
` (or re-run this target with --deployBackend to deploy it first).`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
151
185
|
// ---- build locally + push to the registry ----
|
|
152
186
|
if (!skipBuild) {
|
|
153
187
|
run('Build', `npx nx build ${projectName} --configuration production`, cwd);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/executors/sandbox/sandbox.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../../../../../packages/nx-oc/src/executors/sandbox/sandbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ExecutorContext } from '@nx/devkit';
|
|
1
|
+
import { ExecutorContext, logger } from '@nx/devkit';
|
|
2
2
|
import runExecutor from './sandbox';
|
|
3
3
|
import { SandboxExecutorSchema } from './schema';
|
|
4
4
|
|
|
@@ -183,4 +183,41 @@ describe('sandbox executor', () => {
|
|
|
183
183
|
await runExecutor(baseOptions, context());
|
|
184
184
|
expect(commands().some((c) => c.includes('oc get service'))).toBe(false);
|
|
185
185
|
});
|
|
186
|
+
|
|
187
|
+
it('warns when a paired backend has no running pods', async () => {
|
|
188
|
+
const warn = jest.spyOn(logger, 'warn').mockImplementation(() => undefined);
|
|
189
|
+
// default mock returns '' for `oc get endpoints` → no endpoints
|
|
190
|
+
await runExecutor(
|
|
191
|
+
{ ...baseOptions, appType: 'frontend' },
|
|
192
|
+
context(['adsp:proxy-service:test-service:3333'])
|
|
193
|
+
);
|
|
194
|
+
expect(warn).toHaveBeenCalledWith(expect.stringContaining('test-service'));
|
|
195
|
+
// warn only — does not deploy the backend
|
|
196
|
+
expect(commands().some((c) => c.includes('nx run test-service:sandbox'))).toBe(false);
|
|
197
|
+
warn.mockRestore();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it('does not warn when the paired backend has endpoints', async () => {
|
|
201
|
+
const warn = jest.spyOn(logger, 'warn').mockImplementation(() => undefined);
|
|
202
|
+
execSync.mockImplementation((cmd: string) =>
|
|
203
|
+
Buffer.from(cmd.includes('oc get endpoints test-service') ? '10.1.2.3' : '')
|
|
204
|
+
);
|
|
205
|
+
await runExecutor(
|
|
206
|
+
{ ...baseOptions, appType: 'frontend' },
|
|
207
|
+
context(['adsp:proxy-service:test-service:3333'])
|
|
208
|
+
);
|
|
209
|
+
expect(warn).not.toHaveBeenCalled();
|
|
210
|
+
warn.mockRestore();
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('deployBackend deploys each paired backend first (no warning)', async () => {
|
|
214
|
+
const warn = jest.spyOn(logger, 'warn').mockImplementation(() => undefined);
|
|
215
|
+
await runExecutor(
|
|
216
|
+
{ ...baseOptions, appType: 'frontend', deployBackend: true },
|
|
217
|
+
context(['adsp:proxy-service:test-service:3333'])
|
|
218
|
+
);
|
|
219
|
+
expect(commands().some((c) => c.includes('npx nx run test-service:sandbox'))).toBe(true);
|
|
220
|
+
expect(warn).not.toHaveBeenCalled();
|
|
221
|
+
warn.mockRestore();
|
|
222
|
+
});
|
|
186
223
|
});
|
|
@@ -40,6 +40,11 @@
|
|
|
40
40
|
"default": false,
|
|
41
41
|
"description": "Skip the registry login + push and reuse the already-pushed image (resume from the import step)."
|
|
42
42
|
},
|
|
43
|
+
"deployBackend": {
|
|
44
|
+
"type": "boolean",
|
|
45
|
+
"default": false,
|
|
46
|
+
"description": "For a frontend: deploy each paired backend (its own sandbox target) first, so proxied /api calls work. Off by default; without it, a missing backend is warned about, not deployed."
|
|
47
|
+
},
|
|
43
48
|
"importRetries": {
|
|
44
49
|
"type": "number",
|
|
45
50
|
"default": 5,
|
|
@@ -25,7 +25,15 @@ nx run <%= projectName %>:sandbox --skipBuild # reuse the built image
|
|
|
25
25
|
nx run <%= projectName %>:sandbox --skipBuild --skipPush # reuse the pushed image; re-import + roll out only
|
|
26
26
|
nx run <%= projectName %>:sandbox --imageTag=<tag> # push/import under a different tag
|
|
27
27
|
nx run <%= projectName %>:sandbox --importRetries=8 # more import retries on a slow cluster
|
|
28
|
-
|
|
28
|
+
<% if (appType === 'frontend') { %>nx run <%= projectName %>:sandbox --deployBackend # deploy each paired backend (its own sandbox) first
|
|
29
|
+
<% } %>```
|
|
30
|
+
<% if (appType === 'frontend') { %>
|
|
31
|
+
This frontend proxies `/api` to its paired backend Service. The target always
|
|
32
|
+
ensures that Service exists (so nginx doesn't crashloop), but by default it does
|
|
33
|
+
**not** deploy the backend — if the backend has no running pods it **warns** that
|
|
34
|
+
proxied calls will 502, and names the target to run. Pass `--deployBackend` to
|
|
35
|
+
deploy each paired backend as part of this run instead.
|
|
36
|
+
<% } %>
|
|
29
37
|
|
|
30
38
|
## Preflight failures — cause → fix
|
|
31
39
|
|