@catapultjs/deploy 0.9.0 → 0.11.0
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/README.md +9 -1
- package/build/commands/list_revisions.js +12 -25
- package/build/commands/list_revisions.js.map +1 -1
- package/build/commands/status.d.ts +1 -0
- package/build/commands/status.js +36 -78
- package/build/commands/status.js.map +1 -1
- package/build/commands/version.js +3 -3
- package/build/commands/version.js.map +1 -1
- package/build/index.d.ts +3 -0
- package/build/index.js +3 -0
- package/build/index.js.map +1 -1
- package/build/recipes/astro.js +9 -13
- package/build/recipes/astro.js.map +1 -1
- package/build/recipes/astro_static.d.ts +1 -0
- package/build/recipes/astro_static.js +11 -0
- package/build/recipes/astro_static.js.map +1 -0
- package/build/recipes/deploy/update_code.js +5 -4
- package/build/recipes/deploy/update_code.js.map +1 -1
- package/build/recipes/nestjs.d.ts +1 -0
- package/build/recipes/nestjs.js +5 -0
- package/build/recipes/nestjs.js.map +1 -0
- package/build/recipes/nextjs.d.ts +1 -0
- package/build/recipes/nextjs.js +20 -0
- package/build/recipes/nextjs.js.map +1 -0
- package/build/recipes/nextjs_static.d.ts +1 -0
- package/build/recipes/nextjs_static.js +8 -0
- package/build/recipes/nextjs_static.js.map +1 -0
- package/build/recipes/nuxt_static.d.ts +1 -0
- package/build/recipes/nuxt_static.js +8 -0
- package/build/recipes/nuxt_static.js.map +1 -0
- package/build/recipes/pm2.js +15 -14
- package/build/recipes/pm2.js.map +1 -1
- package/build/recipes/tanstack.d.ts +1 -0
- package/build/recipes/tanstack.js +5 -0
- package/build/recipes/tanstack.js.map +1 -0
- package/build/src/api.d.ts +60 -0
- package/build/src/api.js +159 -0
- package/build/src/api.js.map +1 -0
- package/build/src/deployer.d.ts +7 -1
- package/build/src/deployer.js +19 -1
- package/build/src/deployer.js.map +1 -1
- package/build/src/status.d.ts +18 -0
- package/build/src/status.js +59 -0
- package/build/src/status.js.map +1 -0
- package/build/src/task/store.d.ts +4 -1
- package/build/src/task/store.js +8 -2
- package/build/src/task/store.js.map +1 -1
- package/build/src/task.d.ts +4 -1
- package/build/src/task.js +2 -2
- package/build/src/task.js.map +1 -1
- package/package.json +16 -7
- package/skills/catapultjs/SKILL.md +41 -0
- package/skills/catapultjs/references/api.md +70 -0
- package/skills/catapultjs/references/cli.md +160 -0
- package/skills/catapultjs/references/config.md +194 -0
- package/skills/catapultjs/references/github-actions.md +99 -0
- package/skills/catapultjs/references/recipe.md +115 -0
- package/skills/catapultjs/references/recipes.md +596 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import type { Config, TaskName } from './types.ts';
|
|
3
|
+
import { type HostStatus } from './status.ts';
|
|
4
|
+
export interface HostSelector {
|
|
5
|
+
hosts?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface RollbackOptions extends HostSelector {
|
|
8
|
+
release?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface TaskEvent {
|
|
11
|
+
host: string;
|
|
12
|
+
task: string;
|
|
13
|
+
}
|
|
14
|
+
export interface TaskErrorEvent extends TaskEvent {
|
|
15
|
+
error: Error;
|
|
16
|
+
}
|
|
17
|
+
export interface HostDoneEvent {
|
|
18
|
+
host: string;
|
|
19
|
+
release: string;
|
|
20
|
+
}
|
|
21
|
+
export interface HostReleases {
|
|
22
|
+
name: string;
|
|
23
|
+
current: string | null;
|
|
24
|
+
releases: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface HostRevisions {
|
|
27
|
+
name: string;
|
|
28
|
+
revisions: Record<string, unknown>[];
|
|
29
|
+
}
|
|
30
|
+
export interface TaskInfo {
|
|
31
|
+
name: string;
|
|
32
|
+
description: string;
|
|
33
|
+
}
|
|
34
|
+
export interface TaskOutput {
|
|
35
|
+
host: string;
|
|
36
|
+
output: string;
|
|
37
|
+
}
|
|
38
|
+
export interface TaskList {
|
|
39
|
+
pipeline: TaskInfo[];
|
|
40
|
+
extra: TaskInfo[];
|
|
41
|
+
}
|
|
42
|
+
export declare class Catapult extends EventEmitter {
|
|
43
|
+
#private;
|
|
44
|
+
constructor(config: Config);
|
|
45
|
+
on(event: 'task:start', listener: (event: TaskEvent) => void): this;
|
|
46
|
+
on(event: 'task:done', listener: (event: TaskEvent) => void): this;
|
|
47
|
+
on(event: 'task:error', listener: (event: TaskErrorEvent) => void): this;
|
|
48
|
+
on(event: 'host:done', listener: (event: HostDoneEvent) => void): this;
|
|
49
|
+
setup(options?: HostSelector): Promise<void>;
|
|
50
|
+
deploy(options?: HostSelector): Promise<void>;
|
|
51
|
+
task(name: TaskName, options?: HostSelector): Promise<TaskOutput[]>;
|
|
52
|
+
rollback(options?: RollbackOptions): Promise<void>;
|
|
53
|
+
status(options?: HostSelector): Promise<HostStatus[]>;
|
|
54
|
+
listReleases(options?: HostSelector): Promise<HostReleases[]>;
|
|
55
|
+
listRevisions(options?: HostSelector & {
|
|
56
|
+
limit?: number;
|
|
57
|
+
}): Promise<HostRevisions[]>;
|
|
58
|
+
listTasks(): Promise<TaskList>;
|
|
59
|
+
pipeline(): Promise<string[]>;
|
|
60
|
+
}
|
package/build/src/api.js
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { EventEmitter } from 'node:events';
|
|
2
|
+
import { MemoryRenderer } from '@poppinss/cliui';
|
|
3
|
+
import { Context } from "./context.js";
|
|
4
|
+
import { defineConfig } from "./define_config.js";
|
|
5
|
+
import { hasTask, getTasks, getTaskDescription, runTask } from "./task.js";
|
|
6
|
+
import { getPipeline } from "./pipeline.js";
|
|
7
|
+
import { deployHost, rollbackHost, initializeHost, isHostSetup, getCurrentRelease, getReleaseNames, getRevisions, } from "./deployer.js";
|
|
8
|
+
import { collectHostStatus } from "./status.js";
|
|
9
|
+
import { CatapultLogger } from "./logger.js";
|
|
10
|
+
export class Catapult extends EventEmitter {
|
|
11
|
+
#initialize;
|
|
12
|
+
constructor(config) {
|
|
13
|
+
super();
|
|
14
|
+
this.#initialize = defineConfig(config);
|
|
15
|
+
}
|
|
16
|
+
on(event, listener) {
|
|
17
|
+
return super.on(event, listener);
|
|
18
|
+
}
|
|
19
|
+
async #context() {
|
|
20
|
+
await this.#initialize();
|
|
21
|
+
return Context.get();
|
|
22
|
+
}
|
|
23
|
+
#resolveHosts(ctx, names) {
|
|
24
|
+
if (!names || names.length === 0)
|
|
25
|
+
return ctx.config.hosts;
|
|
26
|
+
return names.map((name) => {
|
|
27
|
+
const host = ctx.config.hosts.find((h) => h.name === name);
|
|
28
|
+
if (!host)
|
|
29
|
+
throw new Error(`Unknown host: ${name}`);
|
|
30
|
+
return host;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
async setup(options = {}) {
|
|
34
|
+
const ctx = await this.#context();
|
|
35
|
+
for (const host of this.#resolveHosts(ctx, options.hosts)) {
|
|
36
|
+
await initializeHost(ctx, host);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async deploy(options = {}) {
|
|
40
|
+
const ctx = await this.#context();
|
|
41
|
+
const hosts = this.#resolveHosts(ctx, options.hosts);
|
|
42
|
+
const observer = {
|
|
43
|
+
taskStart: (host, task) => this.emit('task:start', { host: host.name, task }),
|
|
44
|
+
taskDone: (host, task) => this.emit('task:done', { host: host.name, task }),
|
|
45
|
+
taskError: (host, task, error) => this.emit('task:error', { host: host.name, task, error }),
|
|
46
|
+
};
|
|
47
|
+
if (ctx.hooks.beforeDeploy)
|
|
48
|
+
await ctx.hooks.beforeDeploy({ hosts });
|
|
49
|
+
try {
|
|
50
|
+
for (const host of hosts) {
|
|
51
|
+
if (!(await isHostSetup(ctx, host))) {
|
|
52
|
+
throw new Error(`[${host.name}] Catapult is not initialized on this server. Run setup() first.`);
|
|
53
|
+
}
|
|
54
|
+
await deployHost(ctx, host, observer);
|
|
55
|
+
this.emit('host:done', { host: host.name, release: ctx.release });
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (ctx.hooks.afterFailure) {
|
|
60
|
+
await ctx.hooks.afterFailure({ hosts, error: error });
|
|
61
|
+
}
|
|
62
|
+
throw error;
|
|
63
|
+
}
|
|
64
|
+
if (ctx.hooks.afterDeploy)
|
|
65
|
+
await ctx.hooks.afterDeploy({ hosts });
|
|
66
|
+
}
|
|
67
|
+
async task(name, options = {}) {
|
|
68
|
+
const ctx = await this.#context();
|
|
69
|
+
if (!hasTask(name)) {
|
|
70
|
+
throw new Error(`Unknown task: ${name}. Available: ${getTasks().join(', ')}`);
|
|
71
|
+
}
|
|
72
|
+
const results = [];
|
|
73
|
+
for (const host of this.#resolveHosts(ctx, options.hosts)) {
|
|
74
|
+
if (!(await isHostSetup(ctx, host))) {
|
|
75
|
+
throw new Error(`[${host.name}] Catapult is not initialized on this server. Run setup() first.`);
|
|
76
|
+
}
|
|
77
|
+
const currentRelease = await getCurrentRelease(ctx, host);
|
|
78
|
+
if (!currentRelease) {
|
|
79
|
+
throw new Error(`[${host.name}] no current release found, run deploy() first`);
|
|
80
|
+
}
|
|
81
|
+
const renderer = new MemoryRenderer();
|
|
82
|
+
const taskLogger = new CatapultLogger();
|
|
83
|
+
taskLogger.useRenderer(renderer);
|
|
84
|
+
this.emit('task:start', { host: host.name, task: name });
|
|
85
|
+
try {
|
|
86
|
+
await runTask(name, { ...ctx, release: currentRelease }, host, { logger: taskLogger });
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
this.emit('task:error', { host: host.name, task: name, error });
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
this.emit('task:done', { host: host.name, task: name });
|
|
93
|
+
results.push({
|
|
94
|
+
host: host.name,
|
|
95
|
+
output: renderer
|
|
96
|
+
.getLogs()
|
|
97
|
+
.map((log) => log.message)
|
|
98
|
+
.join('\n'),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
async rollback(options = {}) {
|
|
104
|
+
const ctx = await this.#context();
|
|
105
|
+
for (const host of this.#resolveHosts(ctx, options.hosts)) {
|
|
106
|
+
await rollbackHost(ctx, host, options.release);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async status(options = {}) {
|
|
110
|
+
const ctx = await this.#context();
|
|
111
|
+
const hosts = this.#resolveHosts(ctx, options.hosts);
|
|
112
|
+
const hookLogger = new CatapultLogger();
|
|
113
|
+
hookLogger.useRenderer(new MemoryRenderer());
|
|
114
|
+
const report = [];
|
|
115
|
+
for (const host of hosts) {
|
|
116
|
+
report.push(await collectHostStatus(ctx, host, hookLogger));
|
|
117
|
+
}
|
|
118
|
+
return report;
|
|
119
|
+
}
|
|
120
|
+
async listReleases(options = {}) {
|
|
121
|
+
const ctx = await this.#context();
|
|
122
|
+
const report = [];
|
|
123
|
+
for (const host of this.#resolveHosts(ctx, options.hosts)) {
|
|
124
|
+
report.push({
|
|
125
|
+
name: host.name,
|
|
126
|
+
current: (await getCurrentRelease(ctx, host)) ?? null,
|
|
127
|
+
releases: await getReleaseNames(ctx, host),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return report;
|
|
131
|
+
}
|
|
132
|
+
async listRevisions(options = {}) {
|
|
133
|
+
const ctx = await this.#context();
|
|
134
|
+
const report = [];
|
|
135
|
+
for (const host of this.#resolveHosts(ctx, options.hosts)) {
|
|
136
|
+
report.push({
|
|
137
|
+
name: host.name,
|
|
138
|
+
revisions: await getRevisions(ctx, host, options.limit),
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return report;
|
|
142
|
+
}
|
|
143
|
+
async listTasks() {
|
|
144
|
+
await this.#context();
|
|
145
|
+
const pipeline = getPipeline();
|
|
146
|
+
const describe = (name) => ({ name, description: getTaskDescription(name) });
|
|
147
|
+
return {
|
|
148
|
+
pipeline: pipeline.map(describe),
|
|
149
|
+
extra: getTasks()
|
|
150
|
+
.filter((t) => !pipeline.includes(t))
|
|
151
|
+
.map(describe),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
async pipeline() {
|
|
155
|
+
await this.#context();
|
|
156
|
+
return getPipeline();
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/api.ts"],"names":[],"mappings":"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"}
|
package/build/src/deployer.d.ts
CHANGED
|
@@ -4,5 +4,11 @@ export declare function initializeHost(ctx: DeployContext, host: Host): Promise<
|
|
|
4
4
|
export declare function isHostSetup(ctx: DeployContext, host: Host): Promise<boolean>;
|
|
5
5
|
export declare function getCurrentRelease(ctx: DeployContext, host: Host): Promise<string | null>;
|
|
6
6
|
export declare function getReleaseNames(ctx: DeployContext, host: Host): Promise<string[]>;
|
|
7
|
+
export declare function getRevisions(ctx: DeployContext, host: Host, limit?: number): Promise<Record<string, unknown>[]>;
|
|
7
8
|
export declare function rollbackHost(ctx: DeployContext, host: Host, target?: string): Promise<void>;
|
|
8
|
-
export
|
|
9
|
+
export interface DeployObserver {
|
|
10
|
+
taskStart?: (host: Host, task: string) => void;
|
|
11
|
+
taskDone?: (host: Host, task: string) => void;
|
|
12
|
+
taskError?: (host: Host, task: string, error: Error) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function deployHost(ctx: DeployContext, host: Host, observer?: DeployObserver): Promise<void>;
|
package/build/src/deployer.js
CHANGED
|
@@ -82,6 +82,19 @@ export async function getReleaseNames(ctx, host) {
|
|
|
82
82
|
.map((line) => line.trim().replace(/\/$/, ''))
|
|
83
83
|
.filter(Boolean);
|
|
84
84
|
}
|
|
85
|
+
export async function getRevisions(ctx, host, limit = 10) {
|
|
86
|
+
const paths = getPaths(host.deployPath, ctx.release);
|
|
87
|
+
const logFile = `${paths.cataConfig}/revisions.log`;
|
|
88
|
+
const { stdout } = await ssh(host, `set +e\n[ -f ${q(logFile)} ] && tail -${limit} ${q(logFile)} || true`);
|
|
89
|
+
const revisions = [];
|
|
90
|
+
for (const line of stdout.trim().split('\n').filter(Boolean).reverse()) {
|
|
91
|
+
try {
|
|
92
|
+
revisions.push(JSON.parse(line));
|
|
93
|
+
}
|
|
94
|
+
catch { }
|
|
95
|
+
}
|
|
96
|
+
return revisions;
|
|
97
|
+
}
|
|
85
98
|
async function getPreviousReleaseName(ctx, host) {
|
|
86
99
|
const currentRelease = await getCurrentRelease(ctx, host);
|
|
87
100
|
const releases = await getReleaseNames(ctx, host);
|
|
@@ -106,17 +119,21 @@ export async function rollbackHost(ctx, host, target) {
|
|
|
106
119
|
await runTask('deploy:healthcheck', ctx, host);
|
|
107
120
|
}
|
|
108
121
|
}
|
|
109
|
-
export async function deployHost(ctx, host) {
|
|
122
|
+
export async function deployHost(ctx, host, observer) {
|
|
110
123
|
let locked = false;
|
|
111
124
|
let published = false;
|
|
125
|
+
let currentTask = '';
|
|
112
126
|
const deployStart = Date.now();
|
|
113
127
|
await runHook(ctx, 'beforeHostDeploy', { host });
|
|
114
128
|
try {
|
|
115
129
|
const verbose = ctx.config.verbose ?? 0;
|
|
116
130
|
for (const taskName of getPipeline()) {
|
|
131
|
+
currentTask = taskName;
|
|
117
132
|
if (verbose >= Verbose.NORMAL)
|
|
118
133
|
logger.task(elapsed(Date.now() - deployStart), host.name, taskName);
|
|
134
|
+
observer?.taskStart?.(host, taskName);
|
|
119
135
|
await runTask(taskName, ctx, host);
|
|
136
|
+
observer?.taskDone?.(host, taskName);
|
|
120
137
|
if (taskName === 'deploy:lock')
|
|
121
138
|
locked = true;
|
|
122
139
|
if (taskName === 'deploy:publish')
|
|
@@ -125,6 +142,7 @@ export async function deployHost(ctx, host) {
|
|
|
125
142
|
logger.ok(host.name, `deploy OK -> ${ctx.release}`, elapsed(Date.now() - deployStart));
|
|
126
143
|
}
|
|
127
144
|
catch (error) {
|
|
145
|
+
observer?.taskError?.(host, currentTask, error);
|
|
128
146
|
logger.fail(host.name, `deploy failed: ${error.message}`);
|
|
129
147
|
if (published) {
|
|
130
148
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../src/deployer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../src/deployer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Host, DeployContext } from './types.ts';
|
|
2
|
+
import type { CatapultLogger } from './logger.ts';
|
|
3
|
+
export interface HostStatus {
|
|
4
|
+
name: string;
|
|
5
|
+
release?: string | null;
|
|
6
|
+
health?: 'ok' | 'fail';
|
|
7
|
+
node?: string | null;
|
|
8
|
+
packageManager?: {
|
|
9
|
+
name: string;
|
|
10
|
+
version: string | null;
|
|
11
|
+
};
|
|
12
|
+
revision?: Record<string, unknown>;
|
|
13
|
+
lock?: string | null;
|
|
14
|
+
error?: string;
|
|
15
|
+
[key: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export declare const HOST_STATUS_FIELDS: Set<string>;
|
|
18
|
+
export declare function collectHostStatus(ctx: DeployContext, host: Host, hookLogger: CatapultLogger): Promise<HostStatus>;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { getCurrentRelease } from "./deployer.js";
|
|
2
|
+
import { bin } from "./task.js";
|
|
3
|
+
import { getPipeline } from "./pipeline.js";
|
|
4
|
+
import { hooks } from "./pipeline/hooks.js";
|
|
5
|
+
import { q, getPaths, ssh, detectPackageManager } from "./utils.js";
|
|
6
|
+
export const HOST_STATUS_FIELDS = new Set([
|
|
7
|
+
'name',
|
|
8
|
+
'release',
|
|
9
|
+
'health',
|
|
10
|
+
'node',
|
|
11
|
+
'packageManager',
|
|
12
|
+
'revision',
|
|
13
|
+
'lock',
|
|
14
|
+
'error',
|
|
15
|
+
]);
|
|
16
|
+
export async function collectHostStatus(ctx, host, hookLogger) {
|
|
17
|
+
const paths = getPaths(host.deployPath, ctx.release);
|
|
18
|
+
const pm = ctx.config.packageManager ?? (await detectPackageManager());
|
|
19
|
+
const status = { name: host.name };
|
|
20
|
+
try {
|
|
21
|
+
status.release = (await getCurrentRelease(ctx, host)) ?? null;
|
|
22
|
+
if (getPipeline().includes('deploy:healthcheck')) {
|
|
23
|
+
try {
|
|
24
|
+
await ssh(host, `set -e\n${bin('curl')} --fail --silent --show-error --max-time 5 ${q(host.healthcheck?.url)} >/dev/null`);
|
|
25
|
+
status.health = 'ok';
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
status.health = 'fail';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const { stdout: versionsStdout } = await ssh(host, `set +e\ncd ${q(paths.current)}\necho "NODE:$(${bin('node')} --version 2>/dev/null || true)"\necho "PM:$(${bin(pm)} --version 2>/dev/null || true)"`);
|
|
32
|
+
const lines = versionsStdout.trim().split('\n');
|
|
33
|
+
status.node = lines.find((l) => l.startsWith('NODE:'))?.slice(5) || null;
|
|
34
|
+
status.packageManager = {
|
|
35
|
+
name: pm,
|
|
36
|
+
version: lines.find((l) => l.startsWith('PM:'))?.slice(3) || null,
|
|
37
|
+
};
|
|
38
|
+
for (const hook of hooks.getStatus()) {
|
|
39
|
+
const data = await hook(ctx, host, hookLogger);
|
|
40
|
+
if (data)
|
|
41
|
+
Object.assign(status, data);
|
|
42
|
+
}
|
|
43
|
+
const { stdout: revStdout } = await ssh(host, `set +e\n[ -f ${q(paths.cataConfig + '/revisions.log')} ] && tail -1 ${q(paths.cataConfig + '/revisions.log')} || true`);
|
|
44
|
+
const rev = revStdout.trim();
|
|
45
|
+
if (rev) {
|
|
46
|
+
try {
|
|
47
|
+
status.revision = JSON.parse(rev);
|
|
48
|
+
}
|
|
49
|
+
catch { }
|
|
50
|
+
}
|
|
51
|
+
const { stdout: lockStdout } = await ssh(host, `set +e\n[ -f ${q(paths.lock)} ] && cat ${q(paths.lock)} || true`);
|
|
52
|
+
status.lock = lockStdout.trim() || null;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
status.error = error.message;
|
|
56
|
+
}
|
|
57
|
+
return status;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { Host, DeployContext, TaskName } from '../types.ts';
|
|
2
2
|
import type { TaskFn, TaskRunner } from './runner.ts';
|
|
3
|
+
import { type CatapultLogger } from '../logger.ts';
|
|
3
4
|
export declare class TaskStore {
|
|
4
5
|
#private;
|
|
5
6
|
constructor(runner: TaskRunner);
|
|
@@ -8,5 +9,7 @@ export declare class TaskStore {
|
|
|
8
9
|
has(name: TaskName): boolean;
|
|
9
10
|
list(): string[];
|
|
10
11
|
getDescription(name: TaskName): string;
|
|
11
|
-
run(name: TaskName, deployCtx: DeployContext, host: Host
|
|
12
|
+
run(name: TaskName, deployCtx: DeployContext, host: Host, options?: {
|
|
13
|
+
logger?: CatapultLogger;
|
|
14
|
+
}): Promise<void>;
|
|
12
15
|
}
|
package/build/src/task/store.js
CHANGED
|
@@ -27,12 +27,18 @@ export class TaskStore {
|
|
|
27
27
|
getDescription(name) {
|
|
28
28
|
return this.#descriptions.get(name) ?? '';
|
|
29
29
|
}
|
|
30
|
-
async run(name, deployCtx, host) {
|
|
30
|
+
async run(name, deployCtx, host, options = {}) {
|
|
31
31
|
const fn = this.#registry.get(name);
|
|
32
32
|
if (!fn)
|
|
33
33
|
throw new Error(`Task not found: "${name}"`);
|
|
34
34
|
const paths = getPaths(host.deployPath, deployCtx.release);
|
|
35
|
-
const ctx = {
|
|
35
|
+
const ctx = {
|
|
36
|
+
host,
|
|
37
|
+
paths,
|
|
38
|
+
config: deployCtx.config,
|
|
39
|
+
release: deployCtx.release,
|
|
40
|
+
logger: options.logger ?? logger,
|
|
41
|
+
};
|
|
36
42
|
this.#runner.set(ctx);
|
|
37
43
|
try {
|
|
38
44
|
const result = fn(ctx);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/task/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/task/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAuB,MAAM,cAAc,CAAA;AAE1D,MAAM,OAAO,SAAS;IACpB,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IACrC,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAA;IACzC,mBAAmB,GAAkB,IAAI,CAAA;IACzC,OAAO,CAAY;IAEnB,YAAY,MAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,QAAQ,CAAC,WAAmB;QAC1B,IAAI,CAAC,mBAAmB,GAAG,WAAW,CAAA;IACxC,CAAC;IAED,QAAQ,CAAC,IAAc,EAAE,EAAU;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAC5B,IAAI,IAAI,CAAC,mBAAmB,KAAK,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAA;YACtD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAA;QACjC,CAAC;IACH,CAAC;IAED,GAAG,CAAC,IAAc;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAA;IACnC,CAAC;IAED,cAAc,CAAC,IAAc;QAC3B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,GAAG,CACP,IAAc,EACd,SAAwB,EACxB,IAAU,EACV,UAAuC,EAAE;QAEzC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,GAAG,CAAC,CAAA;QAErD,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;QAC1D,MAAM,GAAG,GAAG;YACV,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM;SACjC,CAAA;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAErB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,EAAE,CAAC,GAAG,CAAC,CAAA;YACtB,IAAI,MAAM,YAAY,OAAO;gBAAE,MAAM,MAAM,CAAA;YAC3C,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QAC5B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC;IACH,CAAC;CACF"}
|
package/build/src/task.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Host, DeployContext, TaskName } from './types.ts';
|
|
2
|
+
import type { CatapultLogger } from './logger.ts';
|
|
2
3
|
import { type TaskFn } from './task/runner.ts';
|
|
3
4
|
import type { Verbose } from './enums.ts';
|
|
4
5
|
export type { TaskContext } from './task/runner.ts';
|
|
@@ -7,7 +8,9 @@ export declare function task(name: TaskName, fn: TaskFn): void;
|
|
|
7
8
|
export declare function hasTask(name: TaskName): boolean;
|
|
8
9
|
export declare function getTasks(): string[];
|
|
9
10
|
export declare function getTaskDescription(name: TaskName): string;
|
|
10
|
-
export declare function runTask(name: TaskName, deployCtx: DeployContext, host: Host
|
|
11
|
+
export declare function runTask(name: TaskName, deployCtx: DeployContext, host: Host, options?: {
|
|
12
|
+
logger?: CatapultLogger;
|
|
13
|
+
}): Promise<void>;
|
|
11
14
|
export declare function cd(path: string): void;
|
|
12
15
|
export declare function run(command: string): void;
|
|
13
16
|
export declare function bin(name: string): string;
|
package/build/src/task.js
CHANGED
|
@@ -18,8 +18,8 @@ export function getTasks() {
|
|
|
18
18
|
export function getTaskDescription(name) {
|
|
19
19
|
return store.getDescription(name);
|
|
20
20
|
}
|
|
21
|
-
export async function runTask(name, deployCtx, host) {
|
|
22
|
-
return store.run(name, deployCtx, host);
|
|
21
|
+
export async function runTask(name, deployCtx, host, options = {}) {
|
|
22
|
+
return store.run(name, deployCtx, host, options);
|
|
23
23
|
}
|
|
24
24
|
export function cd(path) {
|
|
25
25
|
runner.push(`cd ${q(runner.resolve(path))}`);
|
package/build/src/task.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/task.ts"],"names":[],"mappings":"AAEA,OAAO,EAAe,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAI9B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;AAC/B,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;AAEnC,MAAM,UAAU,IAAI,CAAC,WAAmB;IACtC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;AAC7B,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAc,EAAE,EAAU;IAC7C,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,IAAc;IACpC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACxB,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,KAAK,CAAC,IAAI,EAAE,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,IAAc;IAC/C,OAAO,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAc,EACd,SAAwB,EACxB,IAAU,EACV,UAAuC,EAAE;IAEzC,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;AAClD,CAAC;AAMD,MAAM,UAAU,EAAE,CAAC,IAAY;IAC7B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAA;AAC9C,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,OAAe;IACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;AACtC,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAY;IAC9B,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACzB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,UAA4B,EAAE;IACnE,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AACvC,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,SAAiB,EAAE,UAAkB;IAC1D,OAAO,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;AAC7C,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,UAAkB,EAAE,SAAiB;IAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;AAC/C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@catapultjs/deploy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"bin": {
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
},
|
|
15
15
|
"files": [
|
|
16
16
|
"build",
|
|
17
|
+
"skills",
|
|
17
18
|
"!build/bin/test.js",
|
|
18
19
|
"!build/bin/test.d.ts",
|
|
19
20
|
"!build/bin/test.js.map",
|
|
@@ -41,6 +42,10 @@
|
|
|
41
42
|
"deployment",
|
|
42
43
|
"ssh",
|
|
43
44
|
"nodejs",
|
|
45
|
+
"capistrano",
|
|
46
|
+
"deployer",
|
|
47
|
+
"release",
|
|
48
|
+
"rollback",
|
|
44
49
|
"adonisjs",
|
|
45
50
|
"pm2",
|
|
46
51
|
"rsync",
|
|
@@ -64,21 +69,25 @@
|
|
|
64
69
|
"types": "./build/src/utils.d.ts",
|
|
65
70
|
"import": "./build/src/utils.js"
|
|
66
71
|
},
|
|
72
|
+
"./api": {
|
|
73
|
+
"types": "./build/src/api.d.ts",
|
|
74
|
+
"import": "./build/src/api.js"
|
|
75
|
+
},
|
|
67
76
|
"./recipes/*": {
|
|
68
77
|
"types": "./build/recipes/*.d.ts",
|
|
69
78
|
"import": "./build/recipes/*.js"
|
|
70
79
|
}
|
|
71
80
|
},
|
|
72
81
|
"devDependencies": {
|
|
73
|
-
"@adonisjs/eslint-config": "^3.
|
|
74
|
-
"@adonisjs/prettier-config": "^1.
|
|
82
|
+
"@adonisjs/eslint-config": "^3.1.0",
|
|
83
|
+
"@adonisjs/prettier-config": "^1.5.0",
|
|
75
84
|
"@adonisjs/tsconfig": "^2.0.0",
|
|
76
85
|
"@japa/assert": "^4.2.0",
|
|
77
86
|
"@japa/runner": "^5.3.0",
|
|
78
|
-
"@types/node": "^25.
|
|
79
|
-
"eslint": "^10.
|
|
80
|
-
"prettier": "^3.8.
|
|
81
|
-
"typescript": "^6.0.
|
|
87
|
+
"@types/node": "^25.9.3",
|
|
88
|
+
"eslint": "^10.4.1",
|
|
89
|
+
"prettier": "^3.8.4",
|
|
90
|
+
"typescript": "^6.0.3",
|
|
82
91
|
"vitepress": "^2.0.0-alpha.17"
|
|
83
92
|
},
|
|
84
93
|
"dependencies": {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: catapultjs
|
|
3
|
+
description: Work with Catapult (@catapultjs/deploy), the SSH deployment tool for Node.js. Use when creating or updating a deploy.ts config, writing recipes or deployment tasks, customizing the deploy pipeline, or scripting deployments with the programmatic API (Catapult class).
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Catapult (@catapultjs/deploy)
|
|
7
|
+
|
|
8
|
+
Capistrano-style SSH deployment for Node.js: versioned releases under `releases/`, an atomic `current` symlink, shared directories, a composable task pipeline, automatic rollback. The CLI is `cata`. Docs: https://catapultjs.com
|
|
9
|
+
|
|
10
|
+
## Critical rule
|
|
11
|
+
|
|
12
|
+
`deploy:update_code` uploads `source_path` by SCP by default. Import `recipes/git` or `recipes/rsync` only when you want to replace that delivery behavior. Do not combine delivery providers such as `git` and `rsync` unless the user explicitly defines the pipeline.
|
|
13
|
+
|
|
14
|
+
## References
|
|
15
|
+
|
|
16
|
+
Read the file matching the task before writing code:
|
|
17
|
+
|
|
18
|
+
| Task | Read |
|
|
19
|
+
| --- | --- |
|
|
20
|
+
| Create or update `deploy.ts`: hosts, recipe selection, healthchecks, lifecycle hooks, pipeline tuning, `setPipeline()` | [references/config.md](references/config.md) |
|
|
21
|
+
| Write or modify a recipe or deployment task: task DSL, `onSetup`/`onStatus` hooks, store options, `TaskRegistry` | [references/recipe.md](references/recipe.md) |
|
|
22
|
+
| Use an official recipe (git, rsync, nextjs, nuxt, astro, tanstack, nestjs, adonisjs, vitepress, directus, pm2, redis): tasks added, store keys, monorepo patterns | [references/recipes.md](references/recipes.md) |
|
|
23
|
+
| Script deployments from Node.js (scripts, CI, bots, dashboards) with the `Catapult` class | [references/api.md](references/api.md) |
|
|
24
|
+
| Set up a GitHub Actions workflow with `catapultjs/deploy-action`: inputs, SSH secrets, env vars | [references/github-actions.md](references/github-actions.md) |
|
|
25
|
+
| Use the `cata` CLI: deploy, rollback, task, status, run, ssh, list commands and their options | [references/cli.md](references/cli.md) |
|
|
26
|
+
|
|
27
|
+
When a change spans several areas (e.g. a config plus a custom recipe), read every matching reference.
|
|
28
|
+
|
|
29
|
+
## Interactive config workflow
|
|
30
|
+
|
|
31
|
+
When the user asks to create, initialize, or configure a Catapult deployment and the required facts are not already present in the repo or prompt, ask focused questions before writing `deploy.ts`.
|
|
32
|
+
|
|
33
|
+
Do not invent production values. At minimum, determine:
|
|
34
|
+
|
|
35
|
+
- app stack/recipe (`nextjs`, `nextjs_static`, `nuxt`, `astro`, `nestjs`, `tanstack`, `adonisjs`, etc.)
|
|
36
|
+
- code delivery mode (default SCP via `source_path`, `git`, `rsync`, local-build/static recipe, or custom)
|
|
37
|
+
- host name, SSH target, deploy path, and branch if using `git`
|
|
38
|
+
- process manager (`pm2` or none) and whether an `ecosystem.config.cjs` should be created
|
|
39
|
+
- `.env`/shared paths and optional healthcheck URL
|
|
40
|
+
|
|
41
|
+
Prefer one compact question group over a long interview. If the project files already answer some items, state the inferred values and ask only for the missing or ambiguous ones. After the user answers, generate the config and include the setup/deploy commands.
|