@go-to-k/cdkd 0.115.1 → 0.115.2
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.
|
@@ -15,12 +15,11 @@ import { GetParameterCommand, SSMClient } from "@aws-sdk/client-ssm";
|
|
|
15
15
|
import { GetCloudFrontOriginAccessIdentityCommand } from "@aws-sdk/client-cloudfront";
|
|
16
16
|
import { createReadStream, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
17
17
|
import { basename, join, resolve } from "node:path";
|
|
18
|
-
import {
|
|
18
|
+
import { spawn } from "node:child_process";
|
|
19
19
|
import { homedir, tmpdir } from "node:os";
|
|
20
20
|
import { GetHostedZoneCommand, ListHostedZonesByNameCommand, Route53Client } from "@aws-sdk/client-route-53";
|
|
21
21
|
import { DescribeListenersCommand, DescribeLoadBalancersCommand, ElasticLoadBalancingV2Client } from "@aws-sdk/client-elastic-load-balancing-v2";
|
|
22
22
|
import { KMSClient, ListAliasesCommand } from "@aws-sdk/client-kms";
|
|
23
|
-
import { promisify } from "node:util";
|
|
24
23
|
import { DescribeImagesCommand as DescribeImagesCommand$1, ECRClient, GetAuthorizationTokenCommand } from "@aws-sdk/client-ecr";
|
|
25
24
|
import { hostname } from "os";
|
|
26
25
|
import graphlib from "graphlib";
|
|
@@ -2796,82 +2795,202 @@ var FileAssetPublisher = class {
|
|
|
2796
2795
|
}
|
|
2797
2796
|
};
|
|
2798
2797
|
|
|
2798
|
+
//#endregion
|
|
2799
|
+
//#region src/utils/docker-cmd.ts
|
|
2800
|
+
/**
|
|
2801
|
+
* Shared helpers for invoking the docker-compatible CLI binary across cdkd.
|
|
2802
|
+
*
|
|
2803
|
+
* Two parity decisions with `aws-cdk-cli`'s `cdk-assets-lib`:
|
|
2804
|
+
* 1. `CDK_DOCKER` env var swaps the binary so podman / finch users can
|
|
2805
|
+
* run cdkd without code changes (`CDK_DOCKER=podman cdkd deploy`).
|
|
2806
|
+
* 2. `runDockerStreaming` uses streaming spawn rather than `execFile`'s
|
|
2807
|
+
* buffered `maxBuffer` ceiling. BuildKit's progress output can run to
|
|
2808
|
+
* tens of MB on multi-stage builds with `# syntax=docker/dockerfile:1`
|
|
2809
|
+
* frontend downloads + heredoc / `RUN --mount=...` features; the 50 MB
|
|
2810
|
+
* `execFile` ceiling cdkd used to set silently killed those builds
|
|
2811
|
+
* with `ERR_CHILD_PROCESS_STDIO_MAXBUFFER`.
|
|
2812
|
+
*
|
|
2813
|
+
* Output handling: stdout/stderr are collected in memory unconditionally so
|
|
2814
|
+
* `runDockerStreaming` can return them to the caller for error wrapping.
|
|
2815
|
+
* When the logger is at debug level (i.e. the user passed `--verbose`),
|
|
2816
|
+
* the chunks are ALSO mirrored to `process.stdout` / `process.stderr` so
|
|
2817
|
+
* the user sees live build progress.
|
|
2818
|
+
*/
|
|
2819
|
+
/**
|
|
2820
|
+
* Return the docker-compatible CLI binary to invoke. Matches CDK CLI:
|
|
2821
|
+
* `CDK_DOCKER` env var overrides the default `docker` so users on
|
|
2822
|
+
* podman / finch / nerdctl can swap without changing cdkd code.
|
|
2823
|
+
*/
|
|
2824
|
+
function getDockerCmd() {
|
|
2825
|
+
const override = process.env["CDK_DOCKER"];
|
|
2826
|
+
return override && override.length > 0 ? override : "docker";
|
|
2827
|
+
}
|
|
2828
|
+
/**
|
|
2829
|
+
* Spawn a docker-compatible CLI binary (resolved via `getDockerCmd`) with
|
|
2830
|
+
* streaming I/O. Collects stdout/stderr in memory and resolves with both
|
|
2831
|
+
* on exit code 0; rejects with a `SpawnError` carrying both streams on any
|
|
2832
|
+
* non-zero exit so the caller can wrap with its own error class without
|
|
2833
|
+
* losing the upstream output.
|
|
2834
|
+
*
|
|
2835
|
+
* No `maxBuffer` ceiling: BuildKit progress output frequently exceeds the
|
|
2836
|
+
* `child_process.execFile` default of 1 MB (cdkd previously bumped to 50 MB
|
|
2837
|
+
* but BuildKit + frontend pulls can still exceed that on first-time builds).
|
|
2838
|
+
*/
|
|
2839
|
+
async function runDockerStreaming(args, options = {}) {
|
|
2840
|
+
return spawnStreaming(getDockerCmd(), args, options);
|
|
2841
|
+
}
|
|
2842
|
+
/**
|
|
2843
|
+
* Generic streaming spawn — used by `runDockerStreaming` AND by the
|
|
2844
|
+
* `executable` source mode in `docker-build.ts` (which runs an arbitrary
|
|
2845
|
+
* user-supplied build command, not docker).
|
|
2846
|
+
*/
|
|
2847
|
+
async function spawnStreaming(cmd, args, options = {}) {
|
|
2848
|
+
const streamLive = options.streamLive ?? getLogger().getLevel() === "debug";
|
|
2849
|
+
const env = options.env ? mergeEnv(options.env) : void 0;
|
|
2850
|
+
return new Promise((resolve, reject) => {
|
|
2851
|
+
const child = spawn(cmd, args, {
|
|
2852
|
+
cwd: options.cwd,
|
|
2853
|
+
env,
|
|
2854
|
+
stdio: [
|
|
2855
|
+
options.input ? "pipe" : "ignore",
|
|
2856
|
+
"pipe",
|
|
2857
|
+
"pipe"
|
|
2858
|
+
]
|
|
2859
|
+
});
|
|
2860
|
+
const stdoutChunks = [];
|
|
2861
|
+
const stderrChunks = [];
|
|
2862
|
+
child.stdout.on("data", (chunk) => {
|
|
2863
|
+
stdoutChunks.push(chunk);
|
|
2864
|
+
if (streamLive) process.stdout.write(chunk);
|
|
2865
|
+
});
|
|
2866
|
+
child.stderr.on("data", (chunk) => {
|
|
2867
|
+
stderrChunks.push(chunk);
|
|
2868
|
+
if (streamLive) process.stderr.write(chunk);
|
|
2869
|
+
});
|
|
2870
|
+
child.once("error", (err) => {
|
|
2871
|
+
if (err.code === "ENOENT") {
|
|
2872
|
+
const usingOverride = process.env["CDK_DOCKER"] === cmd && cmd !== "docker";
|
|
2873
|
+
reject(/* @__PURE__ */ new Error(usingOverride ? `Failed to find and execute '${cmd}' (resolved via CDK_DOCKER). Install '${cmd}' or unset CDK_DOCKER to fall back to 'docker'.` : `Failed to find and execute '${cmd}'. Install Docker (or set the 'CDK_DOCKER' environment variable to a compatible binary such as podman / finch).`));
|
|
2874
|
+
} else reject(err);
|
|
2875
|
+
});
|
|
2876
|
+
child.once("close", (code) => {
|
|
2877
|
+
const stdout = Buffer.concat(stdoutChunks).toString("utf-8");
|
|
2878
|
+
const stderr = Buffer.concat(stderrChunks).toString("utf-8");
|
|
2879
|
+
if (code === 0) resolve({
|
|
2880
|
+
stdout,
|
|
2881
|
+
stderr
|
|
2882
|
+
});
|
|
2883
|
+
else {
|
|
2884
|
+
const message = stderr.trim() || stdout.trim() || `${cmd} ${args[0] ?? ""} exited with code ${code}`;
|
|
2885
|
+
const err = new Error(message);
|
|
2886
|
+
err.stderr = stderr;
|
|
2887
|
+
err.stdout = stdout;
|
|
2888
|
+
err.exitCode = code;
|
|
2889
|
+
reject(err);
|
|
2890
|
+
}
|
|
2891
|
+
});
|
|
2892
|
+
if (options.input !== void 0) {
|
|
2893
|
+
child.stdin.on("error", () => {});
|
|
2894
|
+
child.stdin.write(options.input);
|
|
2895
|
+
child.stdin.end();
|
|
2896
|
+
}
|
|
2897
|
+
});
|
|
2898
|
+
}
|
|
2899
|
+
function mergeEnv(overrides) {
|
|
2900
|
+
const merged = { ...process.env };
|
|
2901
|
+
for (const [k, v] of Object.entries(overrides)) if (v === void 0) delete merged[k];
|
|
2902
|
+
else merged[k] = v;
|
|
2903
|
+
return merged;
|
|
2904
|
+
}
|
|
2905
|
+
|
|
2799
2906
|
//#endregion
|
|
2800
2907
|
//#region src/assets/docker-build.ts
|
|
2801
|
-
|
|
2802
|
-
|
|
2803
|
-
*
|
|
2804
|
-
* `
|
|
2805
|
-
*
|
|
2806
|
-
*
|
|
2807
|
-
*
|
|
2808
|
-
*
|
|
2809
|
-
*
|
|
2810
|
-
*
|
|
2811
|
-
* -
|
|
2812
|
-
*
|
|
2813
|
-
*
|
|
2814
|
-
*
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
|
|
2818
|
-
* error-handling chain on each side keeps working unchanged.
|
|
2819
|
-
*
|
|
2820
|
-
* `platform` is new in PR 5: container Lambdas declare `Architectures:
|
|
2821
|
-
* [x86_64]` (default) or `[arm64]`, and the local-invoke caller MUST pass the
|
|
2822
|
-
* matching `linux/amd64` / `linux/arm64` so the built image can run on the
|
|
2823
|
-
* developer's host (which may have the opposite arch). The publisher caller
|
|
2824
|
-
* defaults to `undefined` for backward compatibility — passing through is
|
|
2825
|
-
* the no-op, the user's local docker default arch picks up.
|
|
2826
|
-
*/
|
|
2827
|
-
/**
|
|
2828
|
-
* Build a Docker image from a CDK asset's source description.
|
|
2829
|
-
*
|
|
2830
|
-
* @param asset The `DockerImageAsset` entry from the cdk asset
|
|
2831
|
-
* manifest (carries `directory`, `dockerFile`, build args,
|
|
2832
|
-
* target, outputs).
|
|
2833
|
-
* @param cdkOutDir Absolute path to the CDK output directory (`cdk.out`).
|
|
2834
|
-
* Used to resolve `asset.source.directory` to a real
|
|
2835
|
-
* build context on disk.
|
|
2836
|
-
* @param tag Local image tag to apply (`-t`). The caller chooses a
|
|
2837
|
-
* deterministic tag so subsequent runs hit Docker's
|
|
2838
|
-
* layer cache (publisher uses `cdkd-asset-<hash>`;
|
|
2839
|
-
* local-invoke uses `cdkd-local-invoke-<hash>`).
|
|
2840
|
-
* @param platform Optional `--platform` value (e.g. `linux/amd64`,
|
|
2841
|
-
* `linux/arm64`). When `undefined` the flag is omitted
|
|
2842
|
-
* and Docker uses its default platform.
|
|
2843
|
-
* @param wrapError Function the caller provides to wrap the underlying
|
|
2844
|
-
* `docker build` failure in a typed error specific to
|
|
2845
|
-
* its call site.
|
|
2846
|
-
* @throws Whatever `wrapError` returns when `docker build` exits non-zero.
|
|
2847
|
-
*/
|
|
2848
|
-
async function buildDockerImage(asset, cdkOutDir, tag, options) {
|
|
2908
|
+
/**
|
|
2909
|
+
* Build a Docker image from a CDK asset source. Returns the local image
|
|
2910
|
+
* tag the caller should use for `docker tag` / `docker push` (publisher)
|
|
2911
|
+
* or `docker run` (local-invoke).
|
|
2912
|
+
*
|
|
2913
|
+
* Two source modes (mirrors CDK CLI):
|
|
2914
|
+
* - `executable`: run the user-supplied command, capture stdout, return
|
|
2915
|
+
* it as the local tag. The script is responsible for building AND
|
|
2916
|
+
* tagging; cdkd just reads the tag from stdout. Used for Bazel /
|
|
2917
|
+
* custom build pipelines that produce images outside `docker build`.
|
|
2918
|
+
* - `directory`: standard `docker build <dir>` with the full BuildKit
|
|
2919
|
+
* flag set described above. Caller must pass `options.tag`.
|
|
2920
|
+
*
|
|
2921
|
+
* `executable` takes precedence when both fields are set (matches CDK CLI).
|
|
2922
|
+
*/
|
|
2923
|
+
async function buildDockerImage(asset, cdkOutDir, options) {
|
|
2924
|
+
const source = asset.source;
|
|
2849
2925
|
const logger = getLogger().child("docker-build");
|
|
2926
|
+
if (source.executable && source.executable.length > 0) {
|
|
2927
|
+
const [cmd, ...args] = source.executable;
|
|
2928
|
+
if (!cmd) throw options.wrapError("asset source.executable[] is empty");
|
|
2929
|
+
const cwd = source.directory ? `${cdkOutDir}/${source.directory}` : cdkOutDir;
|
|
2930
|
+
logger.debug(`Building Docker image via executable: ${source.executable.join(" ")} (cwd=${cwd})`);
|
|
2931
|
+
let result;
|
|
2932
|
+
try {
|
|
2933
|
+
result = await spawnStreaming(cmd, args, { cwd });
|
|
2934
|
+
} catch (err) {
|
|
2935
|
+
const e = err;
|
|
2936
|
+
throw options.wrapError(e.stderr || e.message || String(err));
|
|
2937
|
+
}
|
|
2938
|
+
const tag = result.stdout.trim();
|
|
2939
|
+
if (!tag) throw options.wrapError(`docker build executable produced no output (expected the local image tag on stdout): ${cmd} ${args.join(" ")}`);
|
|
2940
|
+
return tag;
|
|
2941
|
+
}
|
|
2942
|
+
if (!source.directory) throw options.wrapError(`DockerImageAssetSource must set either 'directory' or 'executable' (got: ${JSON.stringify(source)})`);
|
|
2943
|
+
if (!options.tag) throw options.wrapError("buildDockerImage(directory mode) requires options.tag");
|
|
2944
|
+
const buildArgs = buildDockerBuildCommand(source, options.tag, options.platform);
|
|
2945
|
+
const contextDir = `${cdkOutDir}/${source.directory}`;
|
|
2946
|
+
buildArgs.push(".");
|
|
2947
|
+
logger.debug(`${getDockerCmd()} ${buildArgs.join(" ")} (cwd=${contextDir})`);
|
|
2948
|
+
try {
|
|
2949
|
+
await runDockerStreaming(buildArgs, {
|
|
2950
|
+
cwd: contextDir,
|
|
2951
|
+
env: { BUILDX_NO_DEFAULT_ATTESTATIONS: "1" }
|
|
2952
|
+
});
|
|
2953
|
+
} catch (err) {
|
|
2954
|
+
const e = err;
|
|
2955
|
+
throw options.wrapError(e.stderr || e.message || String(err));
|
|
2956
|
+
}
|
|
2957
|
+
return options.tag;
|
|
2958
|
+
}
|
|
2959
|
+
/**
|
|
2960
|
+
* Construct the `docker build` argv (without the trailing context directory).
|
|
2961
|
+
*
|
|
2962
|
+
* Exported for unit-test inspection — keeps the flag-ordering assertions
|
|
2963
|
+
* independent of the spawn machinery.
|
|
2964
|
+
*/
|
|
2965
|
+
function buildDockerBuildCommand(source, tag, platformOverride) {
|
|
2850
2966
|
const args = [
|
|
2851
2967
|
"build",
|
|
2852
2968
|
"-t",
|
|
2853
2969
|
tag
|
|
2854
2970
|
];
|
|
2855
|
-
if (
|
|
2856
|
-
if (
|
|
2857
|
-
if (
|
|
2858
|
-
if (
|
|
2859
|
-
if (
|
|
2860
|
-
|
|
2861
|
-
args.push(
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
2867
|
-
|
|
2868
|
-
|
|
2869
|
-
|
|
2971
|
+
if (source.dockerBuildArgs) for (const [k, v] of Object.entries(source.dockerBuildArgs)) args.push("--build-arg", `${k}=${v}`);
|
|
2972
|
+
if (source.dockerBuildContexts) for (const [k, v] of Object.entries(source.dockerBuildContexts)) args.push("--build-context", `${k}=${v}`);
|
|
2973
|
+
if (source.dockerBuildSecrets) for (const [k, v] of Object.entries(source.dockerBuildSecrets)) args.push("--secret", `id=${k},${v}`);
|
|
2974
|
+
if (source.dockerBuildSsh) args.push("--ssh", source.dockerBuildSsh);
|
|
2975
|
+
if (source.dockerBuildTarget) args.push("--target", source.dockerBuildTarget);
|
|
2976
|
+
if (source.dockerFile) args.push("-f", source.dockerFile);
|
|
2977
|
+
if (source.networkMode) args.push("--network", source.networkMode);
|
|
2978
|
+
const platform = platformOverride ?? source.platform;
|
|
2979
|
+
if (platform) args.push("--platform", platform);
|
|
2980
|
+
if (source.dockerOutputs) for (const output of source.dockerOutputs) args.push(`--output=${output}`);
|
|
2981
|
+
if (source.cacheFrom) for (const c of source.cacheFrom) args.push("--cache-from", cacheOptionToFlag(c));
|
|
2982
|
+
if (source.cacheTo) args.push("--cache-to", cacheOptionToFlag(source.cacheTo));
|
|
2983
|
+
if (source.cacheDisabled) args.push("--no-cache");
|
|
2984
|
+
return args;
|
|
2985
|
+
}
|
|
2986
|
+
function cacheOptionToFlag(option) {
|
|
2987
|
+
let flag = `type=${option.type}`;
|
|
2988
|
+
if (option.params) for (const [k, v] of Object.entries(option.params)) flag += `,${k}=${v}`;
|
|
2989
|
+
return flag;
|
|
2870
2990
|
}
|
|
2871
2991
|
|
|
2872
2992
|
//#endregion
|
|
2873
2993
|
//#region src/assets/docker-asset-publisher.ts
|
|
2874
|
-
const execFileAsync = promisify(execFile);
|
|
2875
2994
|
/**
|
|
2876
2995
|
* Publishes Docker image assets to ECR
|
|
2877
2996
|
*
|
|
@@ -2913,7 +3032,13 @@ var DockerAssetPublisher = class {
|
|
|
2913
3032
|
}
|
|
2914
3033
|
}
|
|
2915
3034
|
/**
|
|
2916
|
-
* Build a Docker image (public, used by WorkGraph asset-build nodes)
|
|
3035
|
+
* Build a Docker image (public, used by WorkGraph asset-build nodes).
|
|
3036
|
+
*
|
|
3037
|
+
* For `directory` source mode the build tags the result as `localTag`
|
|
3038
|
+
* directly via `docker build -t`. For `executable` source mode the
|
|
3039
|
+
* user-supplied script returns its own tag; cdkd re-tags it to `localTag`
|
|
3040
|
+
* via `docker tag` so the downstream `push()` step (which is wired to
|
|
3041
|
+
* `localTag` at graph-construction time) keeps working unchanged.
|
|
2917
3042
|
*/
|
|
2918
3043
|
async build(asset, cdkOutputDir, localTag) {
|
|
2919
3044
|
await this.buildImage(asset, cdkOutputDir, localTag);
|
|
@@ -2961,69 +3086,79 @@ var DockerAssetPublisher = class {
|
|
|
2961
3086
|
/**
|
|
2962
3087
|
* Build Docker image — delegates to the shared `buildDockerImage`
|
|
2963
3088
|
* helper so this code path stays in sync with `cdkd local invoke`'s
|
|
2964
|
-
* container-Lambda build path. `--platform` is
|
|
2965
|
-
*
|
|
2966
|
-
* a
|
|
2967
|
-
*
|
|
3089
|
+
* container-Lambda build path. `--platform` is read from the asset
|
|
3090
|
+
* manifest's `source.platform` (when set); cdkd does not currently
|
|
3091
|
+
* inject a publish-side override.
|
|
3092
|
+
*
|
|
3093
|
+
* `buildDockerImage` returns the actual local tag. For `directory`
|
|
3094
|
+
* source mode that's always `tag`. For `executable` source mode the
|
|
3095
|
+
* user's script returns its own tag; we re-tag via `docker tag` so the
|
|
3096
|
+
* downstream push step finds the image under the deterministic
|
|
3097
|
+
* `cdkd-asset-<hash>` name it expects.
|
|
2968
3098
|
*/
|
|
2969
3099
|
async buildImage(asset, cdkOutputDir, tag) {
|
|
2970
|
-
await buildDockerImage(asset, cdkOutputDir,
|
|
3100
|
+
const actualTag = await buildDockerImage(asset, cdkOutputDir, {
|
|
3101
|
+
tag,
|
|
3102
|
+
wrapError: (stderr) => new AssetError(`Docker build failed: ${stderr}`)
|
|
3103
|
+
});
|
|
3104
|
+
if (actualTag !== tag) {
|
|
3105
|
+
this.logger.debug(`Re-tagging executable-built image '${actualTag}' → '${tag}'`);
|
|
3106
|
+
try {
|
|
3107
|
+
await this.tagImage(actualTag, tag);
|
|
3108
|
+
} catch (err) {
|
|
3109
|
+
throw new AssetError(`Docker tag failed re-tagging '${actualTag}' → '${tag}': ${err.message ?? String(err)}`);
|
|
3110
|
+
}
|
|
3111
|
+
}
|
|
2971
3112
|
}
|
|
2972
3113
|
/**
|
|
2973
|
-
* Authenticate with ECR
|
|
3114
|
+
* Authenticate with ECR via `docker login --password-stdin`.
|
|
2974
3115
|
*/
|
|
2975
3116
|
async ecrLogin(client, accountId, region) {
|
|
2976
3117
|
const authData = (await client.send(new GetAuthorizationTokenCommand({}))).authorizationData?.[0];
|
|
2977
3118
|
if (!authData?.authorizationToken) throw new AssetError("Failed to get ECR authorization token");
|
|
2978
3119
|
const [username, password] = Buffer.from(authData.authorizationToken, "base64").toString().split(":");
|
|
3120
|
+
if (!username || password === void 0) throw new AssetError("ECR authorization token has unexpected shape (missing username/password)");
|
|
2979
3121
|
const endpoint = authData.proxyEndpoint || `https://${accountId}.dkr.ecr.${region}.amazonaws.com`;
|
|
2980
|
-
|
|
2981
|
-
|
|
3122
|
+
try {
|
|
3123
|
+
await runDockerStreaming([
|
|
2982
3124
|
"login",
|
|
2983
3125
|
"--username",
|
|
2984
3126
|
username,
|
|
2985
3127
|
"--password-stdin",
|
|
2986
3128
|
endpoint
|
|
2987
|
-
], {
|
|
2988
|
-
|
|
2989
|
-
|
|
2990
|
-
|
|
2991
|
-
|
|
2992
|
-
let stderr = "";
|
|
2993
|
-
proc.stderr?.on("data", (data) => {
|
|
2994
|
-
stderr += data.toString();
|
|
2995
|
-
});
|
|
2996
|
-
proc.on("close", (code) => {
|
|
2997
|
-
if (code === 0) resolve();
|
|
2998
|
-
else reject(new AssetError(`ECR login failed: ${stderr.trim()}`));
|
|
2999
|
-
});
|
|
3000
|
-
proc.on("error", (err) => {
|
|
3001
|
-
reject(new AssetError(`ECR login failed: ${err.message}`));
|
|
3002
|
-
});
|
|
3003
|
-
proc.stdin?.write(password);
|
|
3004
|
-
proc.stdin?.end();
|
|
3005
|
-
});
|
|
3129
|
+
], { input: password });
|
|
3130
|
+
} catch (err) {
|
|
3131
|
+
const e = err;
|
|
3132
|
+
throw new AssetError(`ECR login failed: ${e.stderr?.trim() || e.message || String(err)}`);
|
|
3133
|
+
}
|
|
3006
3134
|
}
|
|
3007
3135
|
/**
|
|
3008
3136
|
* Tag Docker image
|
|
3009
3137
|
*/
|
|
3010
3138
|
async tagImage(source, target) {
|
|
3011
|
-
|
|
3012
|
-
|
|
3013
|
-
|
|
3014
|
-
|
|
3015
|
-
|
|
3139
|
+
try {
|
|
3140
|
+
await runDockerStreaming([
|
|
3141
|
+
"tag",
|
|
3142
|
+
source,
|
|
3143
|
+
target
|
|
3144
|
+
]);
|
|
3145
|
+
} catch (err) {
|
|
3146
|
+
const e = err;
|
|
3147
|
+
throw new AssetError(`Docker tag failed: ${e.stderr?.trim() || e.message || String(err)}`);
|
|
3148
|
+
}
|
|
3016
3149
|
}
|
|
3017
3150
|
/**
|
|
3018
|
-
* Push Docker image
|
|
3151
|
+
* Push Docker image. Streams progress to stdout/stderr (via
|
|
3152
|
+
* `runDockerStreaming`) when the logger is at debug level, otherwise
|
|
3153
|
+
* captures silently and surfaces stderr on non-zero exit.
|
|
3019
3154
|
*/
|
|
3020
3155
|
async pushImage(uri) {
|
|
3021
3156
|
this.logger.debug(`Pushing: ${uri}`);
|
|
3022
3157
|
try {
|
|
3023
|
-
await
|
|
3024
|
-
} catch (
|
|
3025
|
-
const
|
|
3026
|
-
throw new AssetError(`Docker push failed: ${
|
|
3158
|
+
await runDockerStreaming(["push", uri]);
|
|
3159
|
+
} catch (err) {
|
|
3160
|
+
const e = err;
|
|
3161
|
+
throw new AssetError(`Docker push failed: ${e.stderr?.trim() || e.message || String(err)}`);
|
|
3027
3162
|
}
|
|
3028
3163
|
}
|
|
3029
3164
|
/**
|
|
@@ -9605,5 +9740,5 @@ var DeployEngine = class {
|
|
|
9605
9740
|
};
|
|
9606
9741
|
|
|
9607
9742
|
//#endregion
|
|
9608
|
-
export {
|
|
9609
|
-
//# sourceMappingURL=deploy-engine-
|
|
9743
|
+
export { StackTerminationProtectionError as $, getDefaultStateBucketName as A, resolveBucketRegion as B, AssetPublisher as C, getDockerCmd as D, buildDockerImage as E, resolveStateBucketWithDefault as F, LocalInvokeBuildError as G, CdkdError as H, resolveStateBucketWithDefaultAndSource as I, ProvisioningError as J, LockError as K, warnDeprecatedNoPrefixCliFlag as L, resolveApp as M, resolveCaptureObservedState as N, runDockerStreaming as O, resolveSkipPrefix as P, StackHasActiveImportsError as Q, AssemblyReader as R, shouldRetainResource as S, WorkGraph as T, ConfigError as U, AssetError as V, DependencyError as W, ResourceUpdateNotSupportedError as X, ResourceTimeoutError as Y, RouteDiscoveryError as Z, DiffCalculator as _, withRetry as a, withErrorHandling as at, LockManager as b, collectInlinePolicyNamesManagedBySiblings as c, setLogger as ct, normalizeAwsTagsToCfn as d, PATTERN_B_NAME_PROPERTIES as dt, StateError as et, resolveExplicitPhysicalId as f, PATTERN_B_RESOURCE_TYPES as ft, IntrinsicFunctionResolver as g, withStackName as gt, assertRegionMatch as h, withSkipPrefix as ht, withResourceDeadline as i, normalizeAwsError as it, getLegacyStateBucketName as j, Synthesizer as k, CDK_PATH_TAG as l, runStackBuffered as lt, CloudControlProvider as m, generateResourceNameWithFallback as mt, DEFAULT_RESOURCE_WARN_AFTER_MS as n, formatError as nt, IMPLICIT_DELETE_DEPENDENCIES as o, ConsoleLogger as ot, ProviderRegistry as p, generateResourceName as pt, PartialFailureError as q, DeployEngine as r, isCdkdError as rt, IAMRoleProvider as s, getLogger as st, DEFAULT_RESOURCE_TIMEOUT_MS as t, SynthesisError as tt, matchesCdkPath as u, getLiveRenderer as ut, DagBuilder as v, stringifyValue as w, S3StateBackend as x, TemplateParser as y, clearBucketRegionCache as z };
|
|
9744
|
+
//# sourceMappingURL=deploy-engine-AoZgViZN.js.map
|