@superyachttimes/cli 1.4.0 → 1.5.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/nodejs-api-hosts.d.ts +20 -0
- package/dist/commands/nodejs-api-hosts.d.ts.map +1 -0
- package/dist/commands/nodejs-api-hosts.js +48 -0
- package/dist/commands/nodejs-api-hosts.js.map +1 -0
- package/dist/commands/recreate-nodejs-api.d.ts +4 -3
- package/dist/commands/recreate-nodejs-api.d.ts.map +1 -1
- package/dist/commands/recreate-nodejs-api.js +19 -16
- package/dist/commands/recreate-nodejs-api.js.map +1 -1
- package/dist/commands/rollback-nodejs-api.d.ts +6 -0
- package/dist/commands/rollback-nodejs-api.d.ts.map +1 -0
- package/dist/commands/rollback-nodejs-api.js +62 -0
- package/dist/commands/rollback-nodejs-api.js.map +1 -0
- package/dist/github/packages.d.ts +7 -0
- package/dist/github/packages.d.ts.map +1 -0
- package/dist/github/packages.js +23 -0
- package/dist/github/packages.js.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -1
- package/dist/portainer/api.d.ts.map +1 -1
- package/dist/portainer/api.js +3 -1
- package/dist/portainer/api.js.map +1 -1
- package/dist/portainer/image.d.ts +22 -0
- package/dist/portainer/image.d.ts.map +1 -0
- package/dist/portainer/image.js +42 -0
- package/dist/portainer/image.js.map +1 -0
- package/dist/portainer/recreate.d.ts +2 -0
- package/dist/portainer/recreate.d.ts.map +1 -1
- package/dist/portainer/recreate.js +21 -10
- package/dist/portainer/recreate.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PortainerInstance } from "../config.js";
|
|
2
|
+
export declare const hostLabel: (instance: PortainerInstance) => string;
|
|
3
|
+
export interface HostImage {
|
|
4
|
+
instance: PortainerInstance;
|
|
5
|
+
host: string;
|
|
6
|
+
image: string;
|
|
7
|
+
repo: string;
|
|
8
|
+
tag: string;
|
|
9
|
+
}
|
|
10
|
+
/** The image each api-nodejs container currently runs. */
|
|
11
|
+
export declare function currentImages(instances: PortainerInstance[]): Promise<HostImage[]>;
|
|
12
|
+
/** The single repository all hosts run; throws when they differ. */
|
|
13
|
+
export declare function sharedRepo(hosts: HostImage[]): string;
|
|
14
|
+
/**
|
|
15
|
+
* Pull and recreate every container one host at a time, so the API never
|
|
16
|
+
* loses more than one host. Stops at the first failure (its old container is
|
|
17
|
+
* restored). `image` overrides the image; omit it to re-pull the current one.
|
|
18
|
+
*/
|
|
19
|
+
export declare function rollOut(instances: PortainerInstance[], image?: string): Promise<void>;
|
|
20
|
+
//# sourceMappingURL=nodejs-api-hosts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodejs-api-hosts.d.ts","sourceRoot":"","sources":["../../src/commands/nodejs-api-hosts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAKtD,eAAO,MAAM,SAAS,GAAI,UAAU,iBAAiB,WACE,CAAC;AAExD,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,0DAA0D;AAC1D,wBAAsB,aAAa,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAaxF;AAED,oEAAoE;AACpE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,CAQrD;AAED;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,SAAS,EAAE,iBAAiB,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB3F"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as portainer from "../portainer/api.js";
|
|
2
|
+
import { splitImage } from "../portainer/image.js";
|
|
3
|
+
import { recreateContainer } from "../portainer/recreate.js";
|
|
4
|
+
export const hostLabel = (instance) => new URL(instance.portainerUrl).hostname.split(".")[0];
|
|
5
|
+
/** The image each api-nodejs container currently runs. */
|
|
6
|
+
export async function currentImages(instances) {
|
|
7
|
+
return Promise.all(instances.map(async (instance) => {
|
|
8
|
+
const container = await portainer.getContainer({
|
|
9
|
+
portainerUrl: instance.portainerUrl,
|
|
10
|
+
portainerEndpointId: instance.portainerEndpointId,
|
|
11
|
+
portainerApiKey: instance.portainerApiKey,
|
|
12
|
+
portainerContainerName: instance.portainerContainerName,
|
|
13
|
+
});
|
|
14
|
+
const image = container.Config.Image;
|
|
15
|
+
return { instance, host: hostLabel(instance), image, ...splitImage(image) };
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
/** The single repository all hosts run; throws when they differ. */
|
|
19
|
+
export function sharedRepo(hosts) {
|
|
20
|
+
const repos = new Set(hosts.map((h) => h.repo));
|
|
21
|
+
if (repos.size !== 1) {
|
|
22
|
+
throw new Error(`hosts run different images: ${hosts.map((h) => `${h.host}=${h.image}`).join(", ")}`);
|
|
23
|
+
}
|
|
24
|
+
return [...repos][0];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Pull and recreate every container one host at a time, so the API never
|
|
28
|
+
* loses more than one host. Stops at the first failure (its old container is
|
|
29
|
+
* restored). `image` overrides the image; omit it to re-pull the current one.
|
|
30
|
+
*/
|
|
31
|
+
export async function rollOut(instances, image) {
|
|
32
|
+
const total = instances.length;
|
|
33
|
+
for (const [i, instance] of instances.entries()) {
|
|
34
|
+
const prefix = `[${instance.portainerUrl} (${instance.portainerContainerName})]`;
|
|
35
|
+
const log = (msg) => console.log(`${prefix} ${msg}`);
|
|
36
|
+
log("Starting...");
|
|
37
|
+
try {
|
|
38
|
+
await recreateContainer(instance, { pull: true, image, log });
|
|
39
|
+
}
|
|
40
|
+
catch (err) {
|
|
41
|
+
throw new Error(`${prefix} failed: ${err.message}. ${i}/${total} instance(s) were recreated; the rest were not touched.`);
|
|
42
|
+
}
|
|
43
|
+
log("Done.");
|
|
44
|
+
}
|
|
45
|
+
console.log();
|
|
46
|
+
console.log(`All ${total} instance(s) completed successfully.`);
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=nodejs-api-hosts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodejs-api-hosts.js","sourceRoot":"","sources":["../../src/commands/nodejs-api-hosts.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,QAA2B,EAAE,EAAE,CACvD,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAUxD,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAA8B;IAChE,OAAO,OAAO,CAAC,GAAG,CAChB,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC;YAC7C,YAAY,EAAE,QAAQ,CAAC,YAAY;YACnC,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB;YACjD,eAAe,EAAE,QAAQ,CAAC,eAAe;YACzC,sBAAsB,EAAE,QAAQ,CAAC,sBAAsB;SACxD,CAAC,CAAC;QACH,MAAM,KAAK,GAAW,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7C,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAC9E,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,KAAkB;IAC3C,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CACb,+BAA+B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,SAA8B,EAAE,KAAc;IAC1E,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC;IAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC;QAChD,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,YAAY,KAAK,QAAQ,CAAC,sBAAsB,IAAI,CAAC;QACjF,MAAM,GAAG,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC;QAC7D,GAAG,CAAC,aAAa,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,iBAAiB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAChE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,GAAG,MAAM,YAAa,GAAa,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,yDAAyD,CACpH,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,CAAC;IACf,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,OAAO,KAAK,sCAAsC,CAAC,CAAC;AAClE,CAAC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pull
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* Pull and recreate every api-nodejs container, one host at a time. When any
|
|
3
|
+
* host is pinned to a tag other than `latest` (e.g. after a rollback), ask
|
|
4
|
+
* whether to move all hosts back to `latest`; otherwise the pinned tag is
|
|
5
|
+
* re-pulled as is.
|
|
5
6
|
*/
|
|
6
7
|
export declare function recreateNodejsApi(): Promise<void>;
|
|
7
8
|
//# sourceMappingURL=recreate-nodejs-api.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recreate-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"recreate-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAkBvD"}
|
|
@@ -1,26 +1,29 @@
|
|
|
1
|
+
import { confirm } from "@inquirer/prompts";
|
|
1
2
|
import { loadConfig } from "../config.js";
|
|
2
|
-
import {
|
|
3
|
+
import { currentImages, rollOut, sharedRepo } from "./nodejs-api-hosts.js";
|
|
3
4
|
/**
|
|
4
|
-
* Pull
|
|
5
|
-
*
|
|
6
|
-
*
|
|
5
|
+
* Pull and recreate every api-nodejs container, one host at a time. When any
|
|
6
|
+
* host is pinned to a tag other than `latest` (e.g. after a rollback), ask
|
|
7
|
+
* whether to move all hosts back to `latest`; otherwise the pinned tag is
|
|
8
|
+
* re-pulled as is.
|
|
7
9
|
*/
|
|
8
10
|
export async function recreateNodejsApi() {
|
|
9
11
|
const config = loadConfig();
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
log("
|
|
15
|
-
|
|
16
|
-
|
|
12
|
+
const hosts = await currentImages(config.nodejsApi);
|
|
13
|
+
const pinned = hosts.filter((h) => h.tag !== "latest");
|
|
14
|
+
let image;
|
|
15
|
+
if (pinned.length > 0) {
|
|
16
|
+
console.log("Not on latest:");
|
|
17
|
+
for (const h of pinned)
|
|
18
|
+
console.log(` ${h.host} ${h.tag}`);
|
|
19
|
+
const back = await confirm({ message: "Switch back to latest?", default: true });
|
|
20
|
+
if (back) {
|
|
21
|
+
image = `${sharedRepo(hosts)}:latest`;
|
|
17
22
|
}
|
|
18
|
-
|
|
19
|
-
|
|
23
|
+
else {
|
|
24
|
+
console.log("Keeping the current tag(s); re-pulling them as they are.");
|
|
20
25
|
}
|
|
21
|
-
log("Done.");
|
|
22
26
|
}
|
|
23
|
-
|
|
24
|
-
console.log(`All ${total} instance(s) completed successfully.`);
|
|
27
|
+
await rollOut(config.nodejsApi, image);
|
|
25
28
|
}
|
|
26
29
|
//# sourceMappingURL=recreate-nodejs-api.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recreate-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"recreate-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/recreate-nodejs-api.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAE3E;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC;IAEvD,IAAI,KAAyB,CAAC;IAC9B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAC9B,KAAK,MAAM,CAAC,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,IAAI,IAAI,EAAE,CAAC;YACT,KAAK,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,0DAA0D,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,MAAM,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Put every api-nodejs container on one release tag (e.g. to roll back),
|
|
3
|
+
* chosen from the tags in GHCR or passed as an argument. One host at a time.
|
|
4
|
+
*/
|
|
5
|
+
export declare function rollbackNodejsApi(args?: string[]): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=rollback-nodejs-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback-nodejs-api.d.ts","sourceRoot":"","sources":["../../src/commands/rollback-nodejs-api.ts"],"names":[],"mappings":"AAeA;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE,MAAM,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA6C1E"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { confirm, select } from "@inquirer/prompts";
|
|
2
|
+
import { loadConfig } from "../config.js";
|
|
3
|
+
import { listPackageVersions } from "../github/packages.js";
|
|
4
|
+
import { releaseTags } from "../portainer/image.js";
|
|
5
|
+
import { currentImages, rollOut, sharedRepo } from "./nodejs-api-hosts.js";
|
|
6
|
+
const MENU_SIZE = 15;
|
|
7
|
+
/** `ghcr.io/<org>/<name>` → { org, name }. */
|
|
8
|
+
function ghcrPackage(repo) {
|
|
9
|
+
const match = repo.match(/^ghcr\.io\/([^/]+)\/(.+)$/);
|
|
10
|
+
if (!match)
|
|
11
|
+
throw new Error(`${repo} is not a ghcr.io image; can't list its tags`);
|
|
12
|
+
return { org: match[1], name: match[2] };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Put every api-nodejs container on one release tag (e.g. to roll back),
|
|
16
|
+
* chosen from the tags in GHCR or passed as an argument. One host at a time.
|
|
17
|
+
*/
|
|
18
|
+
export async function rollbackNodejsApi(args = []) {
|
|
19
|
+
const config = loadConfig();
|
|
20
|
+
const hosts = await currentImages(config.nodejsApi);
|
|
21
|
+
const repo = sharedRepo(hosts);
|
|
22
|
+
console.log("Live now:");
|
|
23
|
+
for (const h of hosts)
|
|
24
|
+
console.log(` ${h.host} ${h.tag}`);
|
|
25
|
+
console.log();
|
|
26
|
+
const { org, name } = ghcrPackage(repo);
|
|
27
|
+
const { tags, latest } = releaseTags(await listPackageVersions(org, name));
|
|
28
|
+
if (tags.length === 0)
|
|
29
|
+
throw new Error(`no release tags found for ${org}/${name}`);
|
|
30
|
+
const live = new Set(hosts.map((h) => h.tag));
|
|
31
|
+
let tag = args[0];
|
|
32
|
+
if (tag) {
|
|
33
|
+
if (tag !== "latest" && !tags.includes(tag)) {
|
|
34
|
+
throw new Error(`${tag} is not one of the latest release tags (${tags.slice(0, 5).join(", ")}, …)`);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const label = (t) => {
|
|
39
|
+
const marks = [live.has(t) && "live", t === latest && "latest"].filter(Boolean);
|
|
40
|
+
return marks.length ? `${t} (${marks.join(", ")})` : t;
|
|
41
|
+
};
|
|
42
|
+
tag = await select({
|
|
43
|
+
message: "Roll the API to which release?",
|
|
44
|
+
choices: [
|
|
45
|
+
{ name: `latest${latest ? ` → ${latest}` : ""}${live.has("latest") ? " (live)" : ""}`, value: "latest" },
|
|
46
|
+
...tags.slice(0, MENU_SIZE).map((t) => ({ name: label(t), value: t })),
|
|
47
|
+
],
|
|
48
|
+
pageSize: MENU_SIZE + 1,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
const image = `${repo}:${tag}`;
|
|
52
|
+
const ok = await confirm({
|
|
53
|
+
message: `Roll ${hosts.length} host(s) to ${image}?`,
|
|
54
|
+
default: false,
|
|
55
|
+
});
|
|
56
|
+
if (!ok) {
|
|
57
|
+
console.log("Aborted; nothing changed.");
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
await rollOut(config.nodejsApi, image);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=rollback-nodejs-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rollback-nodejs-api.js","sourceRoot":"","sources":["../../src/commands/rollback-nodejs-api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { PackageVersion } from "../portainer/image.js";
|
|
2
|
+
/**
|
|
3
|
+
* The newest 100 versions of a GHCR container package, via the local `gh`
|
|
4
|
+
* login (needs the read:packages scope). Newest first.
|
|
5
|
+
*/
|
|
6
|
+
export declare function listPackageVersions(org: string, name: string): Promise<PackageVersion[]>;
|
|
7
|
+
//# sourceMappingURL=packages.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.d.ts","sourceRoot":"","sources":["../../src/github/packages.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI5D;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,cAAc,EAAE,CAAC,CAe3B"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
const run = promisify(execFile);
|
|
4
|
+
/**
|
|
5
|
+
* The newest 100 versions of a GHCR container package, via the local `gh`
|
|
6
|
+
* login (needs the read:packages scope). Newest first.
|
|
7
|
+
*/
|
|
8
|
+
export async function listPackageVersions(org, name) {
|
|
9
|
+
const path = `/orgs/${encodeURIComponent(org)}/packages/container/${encodeURIComponent(name)}/versions?per_page=100`;
|
|
10
|
+
try {
|
|
11
|
+
const { stdout } = await run("gh", ["api", path], { maxBuffer: 20 * 1024 * 1024 });
|
|
12
|
+
return JSON.parse(stdout);
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
const e = err;
|
|
16
|
+
if (e.code === "ENOENT") {
|
|
17
|
+
throw new Error("the GitHub CLI (gh) is not installed; install it and run `gh auth login`");
|
|
18
|
+
}
|
|
19
|
+
throw new Error(`could not list tags for ${org}/${name} via gh: ${(e.stderr || e.message).trim()}. ` +
|
|
20
|
+
"Run `gh auth login` (or `gh auth refresh -s read:packages`) and try again.");
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"packages.js","sourceRoot":"","sources":["../../src/github/packages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAEhC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,GAAW,EACX,IAAY;IAEZ,MAAM,IAAI,GAAG,SAAS,kBAAkB,CAAC,GAAG,CAAC,uBAAuB,kBAAkB,CAAC,IAAI,CAAC,wBAAwB,CAAC;IACrH,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC,CAAC;QACnF,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAqB,CAAC;IAChD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAkD,CAAC;QAC7D,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,IAAI,KAAK,CACb,2BAA2B,GAAG,IAAI,IAAI,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI;YAClF,4EAA4E,CAC/E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -7,6 +7,7 @@ import { collapseLastModified } from "./commands/collapse-last-modified.js";
|
|
|
7
7
|
import { createApiKey } from "./commands/create-api-key.js";
|
|
8
8
|
import { nodejsApiEnv } from "./commands/nodejs-api-env.js";
|
|
9
9
|
import { recreateNodejsApi } from "./commands/recreate-nodejs-api.js";
|
|
10
|
+
import { rollbackNodejsApi } from "./commands/rollback-nodejs-api.js";
|
|
10
11
|
import { restartEc2 } from "./commands/restart-ec2.js";
|
|
11
12
|
import { syncEc2IpsToCloudflare } from "./commands/sync-ec2-ips-cloudflare.js";
|
|
12
13
|
import { syncEc2ToRoute53 } from "./commands/sync-ec2-route53.js";
|
|
@@ -22,6 +23,7 @@ function printHelp() {
|
|
|
22
23
|
console.log(" create-api-key Create a new API key");
|
|
23
24
|
console.log(" nodejs-api-env List, set or unset env vars on the Node.js API containers");
|
|
24
25
|
console.log(" recreate-nodejs-api Recreate Node.js API containers via Portainer");
|
|
26
|
+
console.log(" rollback-nodejs-api Roll the Node.js API containers to a chosen release tag");
|
|
25
27
|
console.log(" restart-ec2 Restart (reboot) one or more EC2 servers");
|
|
26
28
|
console.log(" sync-ec2-ips-cloudflare Sync EC2 egress IPs to a Cloudflare WAF rule");
|
|
27
29
|
console.log(" sync-ec2-route53 Sync running EC2 public IPs to Route53 infra records");
|
|
@@ -54,6 +56,9 @@ async function runCommand(cmd, cmdArgs = []) {
|
|
|
54
56
|
case "recreate-nodejs-api":
|
|
55
57
|
await recreateNodejsApi();
|
|
56
58
|
break;
|
|
59
|
+
case "rollback-nodejs-api":
|
|
60
|
+
await rollbackNodejsApi(cmdArgs);
|
|
61
|
+
break;
|
|
57
62
|
case "restart-ec2":
|
|
58
63
|
await restartEc2();
|
|
59
64
|
break;
|
|
@@ -93,6 +98,11 @@ async function showMenu() {
|
|
|
93
98
|
value: "recreate-nodejs-api",
|
|
94
99
|
description: "Recreate Node.js API containers via Portainer",
|
|
95
100
|
},
|
|
101
|
+
{
|
|
102
|
+
name: "rollback-nodejs-api",
|
|
103
|
+
value: "rollback-nodejs-api",
|
|
104
|
+
description: "Roll the Node.js API containers to a chosen release tag",
|
|
105
|
+
},
|
|
96
106
|
{
|
|
97
107
|
name: "Restart EC2 servers",
|
|
98
108
|
value: "restart-ec2",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/portainer/api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/portainer/api.ts"],"names":[],"mappings":"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"}
|
package/dist/portainer/api.js
CHANGED
|
@@ -14,7 +14,9 @@ async function request(url, options) {
|
|
|
14
14
|
headers,
|
|
15
15
|
body: options.body !== undefined ? JSON.stringify(options.body) : undefined,
|
|
16
16
|
});
|
|
17
|
-
|
|
17
|
+
// Docker answers 304 when a start/stop finds the container already in the
|
|
18
|
+
// requested state; that is success, not an error.
|
|
19
|
+
if (!res.ok && res.status !== 304) {
|
|
18
20
|
const text = await res.text().catch(() => "");
|
|
19
21
|
throw new Error(`Portainer API error: ${options.method ?? "GET"} ${url} → ${res.status} ${res.statusText}${text ? `\n${text}` : ""}`);
|
|
20
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/portainer/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,KAAK,UAAU,OAAO,CACpB,GAAW,EACX,OAKC;IAED,MAAM,OAAO,GAA2B;QACtC,WAAW,EAAE,OAAO,CAAC,MAAM;KAC5B,CAAC;IACF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;QACzB,OAAO,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IACpD,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,CAAC,cAAc,CAAC,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,KAAK;QAC/B,OAAO;QACP,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAC5E,CAAC,CAAC;IAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/portainer/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** A Docker image reference split into repository and tag (default "latest"). */
|
|
2
|
+
export declare function splitImage(ref: string): {
|
|
3
|
+
repo: string;
|
|
4
|
+
tag: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function withTag(ref: string, tag: string): string;
|
|
7
|
+
export interface PackageVersion {
|
|
8
|
+
metadata?: {
|
|
9
|
+
container?: {
|
|
10
|
+
tags?: string[];
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Release tags (plain X.Y.Z) from GHCR package versions, newest first, and
|
|
16
|
+
* the release tag that shares an image with "latest", if any.
|
|
17
|
+
*/
|
|
18
|
+
export declare function releaseTags(versions: PackageVersion[]): {
|
|
19
|
+
tags: string[];
|
|
20
|
+
latest: string | undefined;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.d.ts","sourceRoot":"","sources":["../../src/portainer/image.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CASrE;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;SAAE,CAAA;KAAE,CAAC;CAChD;AAaD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG;IACvD,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5B,CAYA"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** A Docker image reference split into repository and tag (default "latest"). */
|
|
2
|
+
export function splitImage(ref) {
|
|
3
|
+
const noDigest = ref.split("@")[0];
|
|
4
|
+
const lastSlash = noDigest.lastIndexOf("/");
|
|
5
|
+
const lastColon = noDigest.lastIndexOf(":");
|
|
6
|
+
// A colon before the last slash belongs to a registry port, not a tag.
|
|
7
|
+
if (lastColon > lastSlash) {
|
|
8
|
+
return { repo: noDigest.slice(0, lastColon), tag: noDigest.slice(lastColon + 1) };
|
|
9
|
+
}
|
|
10
|
+
return { repo: noDigest, tag: "latest" };
|
|
11
|
+
}
|
|
12
|
+
export function withTag(ref, tag) {
|
|
13
|
+
return `${splitImage(ref).repo}:${tag}`;
|
|
14
|
+
}
|
|
15
|
+
const RELEASE = /^\d+\.\d+\.\d+$/;
|
|
16
|
+
function compareDesc(a, b) {
|
|
17
|
+
const pa = a.split(".").map(Number);
|
|
18
|
+
const pb = b.split(".").map(Number);
|
|
19
|
+
for (let i = 0; i < 3; i++) {
|
|
20
|
+
if (pa[i] !== pb[i])
|
|
21
|
+
return pb[i] - pa[i];
|
|
22
|
+
}
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Release tags (plain X.Y.Z) from GHCR package versions, newest first, and
|
|
27
|
+
* the release tag that shares an image with "latest", if any.
|
|
28
|
+
*/
|
|
29
|
+
export function releaseTags(versions) {
|
|
30
|
+
const tags = new Set();
|
|
31
|
+
let latest;
|
|
32
|
+
for (const version of versions) {
|
|
33
|
+
const vtags = version.metadata?.container?.tags ?? [];
|
|
34
|
+
const releases = vtags.filter((t) => RELEASE.test(t));
|
|
35
|
+
releases.forEach((t) => tags.add(t));
|
|
36
|
+
if (vtags.includes("latest") && releases.length > 0) {
|
|
37
|
+
latest = [...releases].sort(compareDesc)[0];
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return { tags: [...tags].sort(compareDesc), latest };
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image.js","sourceRoot":"","sources":["../../src/portainer/image.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC5C,uEAAuE;IACvE,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;QAC1B,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;IACpF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAW,EAAE,GAAW;IAC9C,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC;AAC1C,CAAC;AAMD,MAAM,OAAO,GAAG,iBAAiB,CAAC;AAElC,SAAS,WAAW,CAAC,CAAS,EAAE,CAAS;IACvC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAA0B;IAIpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,MAA0B,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;AACvD,CAAC"}
|
|
@@ -2,6 +2,8 @@ import type { PortainerInstance } from "../config.js";
|
|
|
2
2
|
export interface RecreateOptions {
|
|
3
3
|
/** Pull the container's image tag before recreating (deploys new code). */
|
|
4
4
|
pull: boolean;
|
|
5
|
+
/** Create the new container from this image instead of the current one. */
|
|
6
|
+
image?: string;
|
|
5
7
|
/** Rewrite the Env array; omit to keep it as is. */
|
|
6
8
|
transformEnv?: (env: string[]) => string[];
|
|
7
9
|
log: (msg: string) => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recreate.d.ts","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,OAAO,CAAC;IACd,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AA2BD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"recreate.d.ts","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,IAAI,EAAE,OAAO,CAAC;IACd,2EAA2E;IAC3E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3C,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B;AA2BD;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,IAAI,CAAC,CAuIf"}
|
|
@@ -38,17 +38,22 @@ export async function recreateContainer(instance, options) {
|
|
|
38
38
|
portainerContainerName: name,
|
|
39
39
|
});
|
|
40
40
|
const oldId = container.Id;
|
|
41
|
+
const image = options.image ?? container.Config.Image;
|
|
41
42
|
if (options.pull) {
|
|
42
|
-
log(
|
|
43
|
+
log(`Pull ${image}`);
|
|
43
44
|
await portainer.pullImage({
|
|
44
45
|
...common,
|
|
45
46
|
portainerRegistryAuth,
|
|
46
|
-
image
|
|
47
|
+
image,
|
|
47
48
|
});
|
|
48
49
|
}
|
|
49
50
|
const env = container.Config.Env ?? [];
|
|
50
51
|
const config = {
|
|
51
52
|
...container.Config,
|
|
53
|
+
Image: image,
|
|
54
|
+
// OCI labels (version, revision, created) come from the image; keeping the
|
|
55
|
+
// old container's copies would mask the new image's values.
|
|
56
|
+
Labels: Object.fromEntries(Object.entries((container.Config.Labels ?? {})).filter(([key]) => !key.startsWith("org.opencontainers.image."))),
|
|
52
57
|
Env: options.transformEnv ? options.transformEnv(env) : env,
|
|
53
58
|
HostConfig: container.HostConfig,
|
|
54
59
|
NetworkingConfig: {
|
|
@@ -56,15 +61,19 @@ export async function recreateContainer(instance, options) {
|
|
|
56
61
|
},
|
|
57
62
|
};
|
|
58
63
|
const port = probePort(config);
|
|
59
|
-
|
|
60
|
-
await portainer.stopContainer({ ...common, portainerContainerId: oldId });
|
|
61
|
-
await portainer.renameContainer({
|
|
62
|
-
...common,
|
|
63
|
-
portainerContainerId: oldId,
|
|
64
|
-
name: `${name}-old`,
|
|
65
|
-
});
|
|
64
|
+
let renamed = false;
|
|
66
65
|
let newId;
|
|
67
66
|
try {
|
|
67
|
+
// Inside the try: if the stop or rename fails (or half-succeeds), the old
|
|
68
|
+
// container is started again below rather than left stopped.
|
|
69
|
+
log("Stop and rename the current container");
|
|
70
|
+
await portainer.stopContainer({ ...common, portainerContainerId: oldId });
|
|
71
|
+
await portainer.renameContainer({
|
|
72
|
+
...common,
|
|
73
|
+
portainerContainerId: oldId,
|
|
74
|
+
name: `${name}-old`,
|
|
75
|
+
});
|
|
76
|
+
renamed = true;
|
|
68
77
|
log("Create and start the new container");
|
|
69
78
|
const created = await portainer.createContainer({ ...common, name, config });
|
|
70
79
|
newId = created.Id;
|
|
@@ -112,7 +121,9 @@ export async function recreateContainer(instance, options) {
|
|
|
112
121
|
.renameContainer({ ...common, portainerContainerId: newId, name: `${name}-failed` })
|
|
113
122
|
.catch(() => { });
|
|
114
123
|
}
|
|
115
|
-
|
|
124
|
+
if (renamed) {
|
|
125
|
+
await portainer.renameContainer({ ...common, portainerContainerId: oldId, name });
|
|
126
|
+
}
|
|
116
127
|
await portainer.startContainer({ ...common, portainerContainerId: oldId });
|
|
117
128
|
log(`Old container restored${newId ? `; the failed one is kept as ${name}-failed` : ""}`);
|
|
118
129
|
throw err;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recreate.js","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,SAAS,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,iBAAiB,GAAG,KAAK,CAAC;AAChC,MAAM,cAAc,GAAG,EAAE,CAAC,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"recreate.js","sourceRoot":"","sources":["../../src/portainer/recreate.ts"],"names":[],"mappings":"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"}
|