feat(release): delegate docker target to tsdocker
This commit is contained in:
+46
-23
@@ -107,7 +107,7 @@ export const run = async (argvArg: any) => {
|
||||
npmResults.push(...(await runNpmTarget(smartshellInstance, workflow)));
|
||||
}
|
||||
if (workflow.targets.includes("docker")) {
|
||||
dockerResults.push(...(await runDockerTarget(smartshellInstance, workflow, newVersion)));
|
||||
dockerResults.push(...(await runDockerTarget(smartshellInstance, workflow)));
|
||||
}
|
||||
|
||||
printReleaseSummary(newVersion, gitResults, npmResults, dockerResults);
|
||||
@@ -262,31 +262,43 @@ async function runNpmTarget(
|
||||
async function runDockerTarget(
|
||||
smartshellInstance: plugins.smartshell.Smartshell,
|
||||
workflow: IResolvedReleaseWorkflow,
|
||||
newVersion: string,
|
||||
): Promise<ITargetResult[]> {
|
||||
if (!workflow.dockerEnabled) {
|
||||
return [{ target: "docker", status: "skipped", message: "disabled" }];
|
||||
}
|
||||
if (workflow.dockerImages.length === 0) {
|
||||
return [{ target: "docker", status: "failed", message: "no images configured" }];
|
||||
}
|
||||
|
||||
const results: ITargetResult[] = [];
|
||||
for (const imageTemplate of workflow.dockerImages) {
|
||||
const image = imageTemplate.replaceAll("{{version}}", newVersion);
|
||||
const buildResult = await smartshellInstance.exec(`docker build -t ${shellQuote(image)} .`);
|
||||
if (buildResult.exitCode !== 0) {
|
||||
results.push({ target: image, status: "failed", message: "docker build failed" });
|
||||
continue;
|
||||
}
|
||||
const pushResult = await smartshellInstance.exec(`docker push ${shellQuote(image)}`);
|
||||
results.push({
|
||||
target: image,
|
||||
status: pushResult.exitCode === 0 ? "success" : "failed",
|
||||
message: pushResult.exitCode === 0 ? undefined : "docker push failed",
|
||||
});
|
||||
const command = buildTsdockerPushCommand(workflow);
|
||||
const result = await smartshellInstance.exec(command);
|
||||
const output = `${result.stdout || ""}\n${(result as any).stderr || ""}\n${(result as any).combinedOutput || ""}`;
|
||||
return [{
|
||||
target: workflow.dockerPatterns.length > 0
|
||||
? `tsdocker:${workflow.dockerPatterns.join(",")}`
|
||||
: "tsdocker",
|
||||
status: result.exitCode === 0 ? "success" : "failed",
|
||||
message: result.exitCode === 0 ? undefined : firstMeaningfulLine(output),
|
||||
}];
|
||||
}
|
||||
|
||||
function buildTsdockerPushCommand(workflow: IResolvedReleaseWorkflow): string {
|
||||
const commandParts = ["tsdocker", "push"];
|
||||
if (workflow.dockerNoBuild) {
|
||||
commandParts.push("--no-build");
|
||||
}
|
||||
return results;
|
||||
if (workflow.dockerCached) {
|
||||
commandParts.push("--cached");
|
||||
}
|
||||
if (workflow.dockerParallel === true) {
|
||||
commandParts.push("--parallel");
|
||||
} else if (typeof workflow.dockerParallel === "number" && Number.isFinite(workflow.dockerParallel) && workflow.dockerParallel > 0) {
|
||||
commandParts.push(`--parallel=${Math.floor(workflow.dockerParallel)}`);
|
||||
}
|
||||
if (workflow.dockerContext) {
|
||||
commandParts.push(`--context=${shellQuote(workflow.dockerContext)}`);
|
||||
}
|
||||
for (const pattern of workflow.dockerPatterns) {
|
||||
commandParts.push(shellQuote(pattern));
|
||||
}
|
||||
return commandParts.join(" ");
|
||||
}
|
||||
|
||||
function isAlreadyPublishedOutput(output: string): boolean {
|
||||
@@ -315,11 +327,22 @@ function printReleasePlan(workflow: IResolvedReleaseWorkflow): void {
|
||||
console.log(`npm registries: ${workflow.npmRegistries.length > 0 ? workflow.npmRegistries.join(", ") : "none"}`);
|
||||
}
|
||||
if (workflow.targets.includes("docker")) {
|
||||
console.log(`docker images: ${workflow.dockerImages.length > 0 ? workflow.dockerImages.join(", ") : "none"}`);
|
||||
console.log(`docker engine: ${workflow.dockerEngine}`);
|
||||
console.log(`docker patterns: ${workflow.dockerPatterns.length > 0 ? workflow.dockerPatterns.join(", ") : "all Dockerfiles"}`);
|
||||
console.log(`docker options: ${formatDockerOptions(workflow)}`);
|
||||
}
|
||||
console.log("");
|
||||
}
|
||||
|
||||
function formatDockerOptions(workflow: IResolvedReleaseWorkflow): string {
|
||||
const options: string[] = [];
|
||||
if (workflow.dockerCached) options.push("cached");
|
||||
if (workflow.dockerParallel) options.push(`parallel=${workflow.dockerParallel === true ? "true" : workflow.dockerParallel}`);
|
||||
if (workflow.dockerNoBuild) options.push("no-build");
|
||||
if (workflow.dockerContext) options.push(`context=${workflow.dockerContext}`);
|
||||
return options.length > 0 ? options.join(", ") : "default";
|
||||
}
|
||||
|
||||
function printReleaseSummary(
|
||||
newVersion: string,
|
||||
gitResults: ITargetResult[],
|
||||
@@ -365,7 +388,7 @@ export function showHelp(mode?: ICliMode): void {
|
||||
{ flag: "-p, --push", description: "Enable the git release target" },
|
||||
{ flag: "--target <names>", description: "Release only selected targets: git,npm,docker" },
|
||||
{ flag: "--npm", description: "Enable the npm release target" },
|
||||
{ flag: "--docker", description: "Enable the Docker release target" },
|
||||
{ flag: "--docker", description: "Enable the tsdocker release target" },
|
||||
{ flag: "--no-publish", description: "Run release core and git target only" },
|
||||
{ flag: "--plan", description: "Show resolved workflow without mutating files" },
|
||||
],
|
||||
@@ -385,7 +408,7 @@ export function showHelp(mode?: ICliMode): void {
|
||||
console.log(" -p, --push Enable the git release target");
|
||||
console.log(" --target <names> Release only selected targets: git,npm,docker");
|
||||
console.log(" --npm Enable the npm release target");
|
||||
console.log(" --docker Enable the Docker release target");
|
||||
console.log(" --docker Enable the tsdocker release target");
|
||||
console.log(" --no-publish Run release core and git target only");
|
||||
console.log(" --major|--minor|--patch Override inferred semver level");
|
||||
console.log(" --plan Show resolved workflow without mutating files");
|
||||
|
||||
Reference in New Issue
Block a user