@catapultjs/deploy 0.0.1 → 0.0.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.
Files changed (94) hide show
  1. package/build/bin/test.d.ts +1 -0
  2. package/build/bin/test.js +9 -0
  3. package/build/bin/test.js.map +1 -0
  4. package/build/commands/deploy.d.ts +1 -0
  5. package/build/commands/deploy.js +5 -4
  6. package/build/commands/deploy.js.map +1 -1
  7. package/build/commands/init.js +3 -2
  8. package/build/commands/init.js.map +1 -1
  9. package/build/commands/list_pipeline.js +1 -1
  10. package/build/commands/list_pipeline.js.map +1 -1
  11. package/build/commands/list_releases.js +3 -3
  12. package/build/commands/list_releases.js.map +1 -1
  13. package/build/commands/list_tasks.js +2 -1
  14. package/build/commands/list_tasks.js.map +1 -1
  15. package/build/commands/rollback.js +3 -3
  16. package/build/commands/rollback.js.map +1 -1
  17. package/build/commands/run_task.js +3 -3
  18. package/build/commands/run_task.js.map +1 -1
  19. package/build/commands/setup.js +5 -5
  20. package/build/commands/setup.js.map +1 -1
  21. package/build/commands/ssh.d.ts +1 -1
  22. package/build/commands/ssh.js +2 -2
  23. package/build/commands/ssh.js.map +1 -1
  24. package/build/commands/status.js +12 -9
  25. package/build/commands/status.js.map +1 -1
  26. package/build/index.d.ts +3 -2
  27. package/build/index.js +3 -2
  28. package/build/index.js.map +1 -1
  29. package/build/recipes/git.js +5 -8
  30. package/build/recipes/git.js.map +1 -1
  31. package/build/recipes/pm2.js +9 -15
  32. package/build/recipes/pm2.js.map +1 -1
  33. package/build/recipes/rsync.js +3 -4
  34. package/build/recipes/rsync.js.map +1 -1
  35. package/build/src/base_command.d.ts +1 -1
  36. package/build/src/base_command.js +2 -2
  37. package/build/src/base_command.js.map +1 -1
  38. package/build/src/context.d.ts +6 -0
  39. package/build/src/context.js +12 -0
  40. package/build/src/context.js.map +1 -0
  41. package/build/src/defaults.d.ts +14 -0
  42. package/build/src/defaults.js +82 -0
  43. package/build/src/defaults.js.map +1 -0
  44. package/build/src/define_config.d.ts +1 -0
  45. package/build/src/define_config.js +8 -2
  46. package/build/src/define_config.js.map +1 -1
  47. package/build/src/deployer.d.ts +5 -0
  48. package/build/src/{host.js → deployer.js} +8 -100
  49. package/build/src/deployer.js.map +1 -0
  50. package/build/src/package_manager.d.ts +3 -0
  51. package/build/src/package_manager.js +22 -0
  52. package/build/src/package_manager.js.map +1 -0
  53. package/build/src/pipeline/hooks.d.ts +10 -0
  54. package/build/src/pipeline/hooks.js +18 -0
  55. package/build/src/pipeline/hooks.js.map +1 -0
  56. package/build/src/pipeline/store.d.ts +9 -0
  57. package/build/src/pipeline/store.js +38 -0
  58. package/build/src/pipeline/store.js.map +1 -0
  59. package/build/src/pipeline.d.ts +10 -0
  60. package/build/src/pipeline.js +25 -0
  61. package/build/src/pipeline.js.map +1 -0
  62. package/build/src/store.d.ts +2 -0
  63. package/build/src/store.js +8 -0
  64. package/build/src/store.js.map +1 -0
  65. package/build/src/task/runner.d.ts +18 -0
  66. package/build/src/task/runner.js +50 -0
  67. package/build/src/task/runner.js.map +1 -0
  68. package/build/src/task/store.d.ts +10 -0
  69. package/build/src/task/store.js +35 -0
  70. package/build/src/task/store.js.map +1 -0
  71. package/build/src/task.d.ts +6 -28
  72. package/build/src/task.js +17 -136
  73. package/build/src/task.js.map +1 -1
  74. package/build/src/utils.d.ts +3 -1
  75. package/build/src/utils.js +28 -4
  76. package/build/src/utils.js.map +1 -1
  77. package/build/tests/package_manager.spec.d.ts +1 -0
  78. package/build/tests/package_manager.spec.js +43 -0
  79. package/build/tests/package_manager.spec.js.map +1 -0
  80. package/build/tests/pipeline.spec.d.ts +1 -0
  81. package/build/tests/pipeline.spec.js +69 -0
  82. package/build/tests/pipeline.spec.js.map +1 -0
  83. package/build/tests/store.spec.d.ts +1 -0
  84. package/build/tests/store.spec.js +40 -0
  85. package/build/tests/store.spec.js.map +1 -0
  86. package/build/tests/task.spec.d.ts +1 -0
  87. package/build/tests/task.spec.js +97 -0
  88. package/build/tests/task.spec.js.map +1 -0
  89. package/package.json +12 -5
  90. package/build/src/ctx.d.ts +0 -3
  91. package/build/src/ctx.js +0 -10
  92. package/build/src/ctx.js.map +0 -1
  93. package/build/src/host.d.ts +0 -20
  94. package/build/src/host.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { q, ssh, blue, sleep } from "./utils.js";
2
+ import { task, run } from "./task.js";
3
+ import { get } from "./store.js";
4
+ task('deploy:lock', async ({ host, deployCtx, paths }) => {
5
+ try {
6
+ await ssh(host, `
7
+ set -e
8
+ if [ -f ${q(paths.lock)} ]; then
9
+ echo "Deploy lock already present: ${paths.lock}" >&2
10
+ exit 1
11
+ fi
12
+ echo ${q(deployCtx.release)} > ${q(paths.lock)}
13
+ `, { quiet: true });
14
+ }
15
+ catch (error) {
16
+ throw new Error(error.stderr?.trim() || error.message);
17
+ }
18
+ });
19
+ task('deploy:unlock', async ({ host, paths }) => {
20
+ await ssh(host, `
21
+ set +e
22
+ rm -f ${q(paths.lock)}
23
+ true
24
+ `);
25
+ });
26
+ task('deploy:release', () => {
27
+ run('mkdir -p {{release_path}}');
28
+ });
29
+ task('deploy:update_code', async () => { });
30
+ task('deploy:shared', () => {
31
+ const dirs = get('shared_dirs', []);
32
+ const files = get('shared_files', []);
33
+ for (const dir of dirs) {
34
+ run(`rm -rf {{release_path}}/${dir}`);
35
+ run(`ln -sfn {{shared_path}}/${dir} {{release_path}}/${dir}`);
36
+ }
37
+ for (const file of files) {
38
+ run(`rm -f {{release_path}}/${file}`);
39
+ run(`ln -sfn {{shared_path}}/${file} {{release_path}}/${file}`);
40
+ }
41
+ });
42
+ task('deploy:publish', () => {
43
+ run('ln -sfn {{release_path}} {{current_path}}');
44
+ });
45
+ task('deploy:log_revision', async () => { });
46
+ task('deploy:healthcheck', async ({ deployCtx, host }) => {
47
+ console.log(`==> ${blue(`[${host.name}]`)} healthcheck ${host.healthcheckUrl}`);
48
+ if (deployCtx.config.healthcheckRetries) {
49
+ for (let i = 1; i <= deployCtx.config.healthcheckRetries; i += 1) {
50
+ try {
51
+ await ssh(host, `
52
+ set -e
53
+ curl --fail --silent --show-error --max-time 5 ${q(host.healthcheckUrl)} >/dev/null
54
+ `);
55
+ console.log(`==> ${blue(`[${host.name}]`)} healthcheck OK (${i}/${deployCtx.config.healthcheckRetries})`);
56
+ return;
57
+ }
58
+ catch {
59
+ console.log(`==> ${blue(`[${host.name}]`)} healthcheck failed (${i}/${deployCtx.config.healthcheckRetries})`);
60
+ if (i < deployCtx.config.healthcheckRetries) {
61
+ await sleep(deployCtx.config.healthcheckDelayMs || 3_000);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ throw new Error(`[${host.name}] healthcheck failed: ${host.healthcheckUrl}`);
67
+ });
68
+ task('deploy:cleanup', async ({ deployCtx, host, paths }) => {
69
+ await ssh(host, `
70
+ set -e
71
+ [ -d ${q(paths.releases)} ] || exit 0
72
+ cd ${q(paths.releases)}
73
+
74
+ count=$(ls -1dt */ 2>/dev/null | wc -l | tr -d ' ')
75
+ if [ "$count" -le ${deployCtx.config.keepReleases} ]; then
76
+ exit 0
77
+ fi
78
+
79
+ ls -1dt */ | tail -n +$(( ${deployCtx.config.keepReleases} + 1 )) | xargs -r rm -rf
80
+ `);
81
+ });
82
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/defaults.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,3 @@
1
1
  import type { Config } from './types.ts';
2
+ import './defaults.ts';
2
3
  export declare function defineConfig(config: Config): Promise<void>;
@@ -1,6 +1,12 @@
1
- import { setCtx } from "./ctx.js";
1
+ import { Context } from "./context.js";
2
+ import { remove, getPipeline } from "./pipeline.js";
3
+ import "./defaults.js";
2
4
  export async function defineConfig(config) {
3
5
  const release = new Date().toISOString().replace(/[:.]/g, '-');
4
- setCtx({ config, release, hooks: config.hooks ?? {} });
6
+ Context.set({ config, release, hooks: config.hooks ?? {} });
7
+ const hasHealthcheck = config.hosts.some((h) => h.healthcheckUrl);
8
+ if (!hasHealthcheck && getPipeline().includes('deploy:healthcheck')) {
9
+ remove('deploy:healthcheck');
10
+ }
5
11
  }
6
12
  //# sourceMappingURL=define_config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC9D,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAA;AACxD,CAAC"}
1
+ {"version":3,"file":"define_config.js","sourceRoot":"","sources":["../../src/define_config.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACnD,OAAO,eAAe,CAAA;AAEtB,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,MAAc;IAC/C,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,CAAA;IAE3D,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAA;IACjE,IAAI,CAAC,cAAc,IAAI,WAAW,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACpE,MAAM,CAAC,oBAAoB,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { Host, DeployContext } from './types.ts';
2
+ export declare function setupHost(ctx: DeployContext, host: Host): Promise<void>;
3
+ export declare function getCurrentRelease(ctx: DeployContext, host: Host): Promise<string | null>;
4
+ export declare function rollbackHost(ctx: DeployContext, host: Host): Promise<void>;
5
+ export declare function deployHost(ctx: DeployContext, host: Host): Promise<void>;
@@ -1,75 +1,13 @@
1
- import { q, getPaths, ssh, sleep } from "./utils.js";
2
- import { task, run, getContext, runTask, getPipeline, get, blue, gray } from "./task.js";
3
- export async function runHook(ctx, name, context = {}) {
1
+ import { q, getPaths, ssh, blue, gray, elapsed } from "./utils.js";
2
+ import { runTask } from "./task.js";
3
+ import { get } from "./store.js";
4
+ import { getPipeline } from "./pipeline.js";
5
+ async function runHook(ctx, name, context = {}) {
4
6
  if (!ctx.hooks[name])
5
7
  return;
6
8
  console.log(`==> hook: ${name}`);
7
9
  await ctx.hooks[name](context);
8
10
  }
9
- task('deploy:lock', async () => {
10
- const { host, deployCtx, paths } = getContext();
11
- try {
12
- await ssh(host, `
13
- set -e
14
- if [ -f ${q(paths.lock)} ]; then
15
- echo "Deploy lock already present: ${paths.lock}" >&2
16
- exit 1
17
- fi
18
- echo ${q(deployCtx.release)} > ${q(paths.lock)}
19
- `, { quiet: true });
20
- }
21
- catch (error) {
22
- throw new Error(error.stderr?.trim() || error.message);
23
- }
24
- });
25
- task('deploy:unlock', async () => {
26
- const { host, paths } = getContext();
27
- await ssh(host, `
28
- set +e
29
- rm -f ${q(paths.lock)}
30
- true
31
- `);
32
- });
33
- task('deploy:release', () => {
34
- run('mkdir -p {{release_path}}');
35
- });
36
- task('deploy:update_code', async () => { });
37
- task('deploy:shared', () => {
38
- const dirs = get('shared_dirs', []);
39
- const files = get('shared_files', []);
40
- for (const dir of dirs) {
41
- run(`rm -rf {{release_path}}/${dir}`);
42
- run(`ln -sfn {{shared_path}}/${dir} {{release_path}}/${dir}`);
43
- }
44
- for (const file of files) {
45
- run(`rm -f {{release_path}}/${file}`);
46
- run(`ln -sfn {{shared_path}}/${file} {{release_path}}/${file}`);
47
- }
48
- });
49
- task('deploy:publish', () => {
50
- run('ln -sfn {{release_path}} {{current_path}}');
51
- });
52
- task('deploy:log_revision', async () => { });
53
- task('deploy:healthcheck', async () => {
54
- const { deployCtx, host } = getContext();
55
- await healthcheckOrThrow(deployCtx, host);
56
- });
57
- task('deploy:cleanup', async () => {
58
- const { deployCtx, host } = getContext();
59
- const paths = getPaths(host.deployPath, deployCtx.release);
60
- await ssh(host, `
61
- set -e
62
- [ -d ${q(paths.releases)} ] || exit 0
63
- cd ${q(paths.releases)}
64
-
65
- count=$(ls -1dt */ 2>/dev/null | wc -l | tr -d ' ')
66
- if [ "$count" -le ${deployCtx.config.keepReleases} ]; then
67
- exit 0
68
- fi
69
-
70
- ls -1dt */ | tail -n +$(( ${deployCtx.config.keepReleases} + 1 )) | xargs -r rm -rf
71
- `);
72
- });
73
11
  export async function setupHost(ctx, host) {
74
12
  const paths = getPaths(host.deployPath, ctx.release);
75
13
  console.log(`==> ${blue(`[${host.name}]`)} setup directories`);
@@ -88,28 +26,6 @@ export async function setupHost(ctx, host) {
88
26
  ${mkfiles}
89
27
  `);
90
28
  }
91
- async function healthcheckOrThrow(ctx, host) {
92
- console.log(`==> ${blue(`[${host.name}]`)} healthcheck ${host.healthcheckUrl}`);
93
- if (ctx.config.healthcheckRetries) {
94
- for (let i = 1; i <= ctx.config.healthcheckRetries; i += 1) {
95
- try {
96
- await ssh(host, `
97
- set -e
98
- curl --fail --silent --show-error --max-time 5 ${q(host.healthcheckUrl)} >/dev/null
99
- `);
100
- console.log(`==> ${blue(`[${host.name}]`)} healthcheck OK (${i}/${ctx.config.healthcheckRetries})`);
101
- return;
102
- }
103
- catch {
104
- console.log(`==> ${blue(`[${host.name}]`)} healthcheck failed (${i}/${ctx.config.healthcheckRetries})`);
105
- if (i < ctx.config.healthcheckRetries) {
106
- await sleep(ctx.config.healthcheckDelayMs || 3_000);
107
- }
108
- }
109
- }
110
- }
111
- throw new Error(`[${host.name}] healthcheck failed: ${host.healthcheckUrl}`);
112
- }
113
29
  export async function getCurrentRelease(ctx, host) {
114
30
  const paths = getPaths(host.deployPath, ctx.release);
115
31
  try {
@@ -125,7 +41,7 @@ export async function getCurrentRelease(ctx, host) {
125
41
  return null;
126
42
  }
127
43
  }
128
- export async function getPreviousReleaseName(ctx, host) {
44
+ async function getPreviousReleaseName(ctx, host) {
129
45
  const paths = getPaths(host.deployPath, ctx.release);
130
46
  const currentRelease = await getCurrentRelease(ctx, host);
131
47
  let stdout = '';
@@ -161,17 +77,9 @@ export async function rollbackHost(ctx, host) {
161
77
  await runTask('pm2:start', ctx, host);
162
78
  }
163
79
  if (getPipeline().includes('deploy:healthcheck')) {
164
- await healthcheckOrThrow(ctx, host);
80
+ await runTask('deploy:healthcheck', ctx, host);
165
81
  }
166
82
  }
167
- function elapsed(ms) {
168
- const total = Math.round(ms / 1000);
169
- const m = Math.floor(total / 60)
170
- .toString()
171
- .padStart(2, '0');
172
- const s = (total % 60).toString().padStart(2, '0');
173
- return `${m}:${s}`;
174
- }
175
83
  export async function deployHost(ctx, host) {
176
84
  let published = false;
177
85
  const deployStart = Date.now();
@@ -203,4 +111,4 @@ export async function deployHost(ctx, host) {
203
111
  await runHook(ctx, 'afterHostDeploy', { host });
204
112
  }
205
113
  }
206
- //# sourceMappingURL=host.js.map
114
+ //# sourceMappingURL=deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../src/deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function pm(): string;
2
+ export declare function pmInstall(): string;
3
+ export declare function pmInstallProd(): string;
@@ -0,0 +1,22 @@
1
+ import { bin } from "./task.js";
2
+ import { get } from "./store.js";
3
+ export function pm() {
4
+ return bin(get('package_manager', 'npm'));
5
+ }
6
+ export function pmInstall() {
7
+ const manager = get('package_manager', 'npm');
8
+ if (manager === 'pnpm')
9
+ return `${pm()} install --frozen-lockfile`;
10
+ if (manager === 'yarn')
11
+ return `${pm()} install --frozen-lockfile`;
12
+ return `${pm()} ci`;
13
+ }
14
+ export function pmInstallProd() {
15
+ const manager = get('package_manager', 'npm');
16
+ if (manager === 'pnpm')
17
+ return `${pm()} install --prod`;
18
+ if (manager === 'yarn')
19
+ return `${pm()} install --production`;
20
+ return `${pm()} install --omit=dev`;
21
+ }
22
+ //# sourceMappingURL=package_manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package_manager.js","sourceRoot":"","sources":["../../src/package_manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAA;AAC/B,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAGhC,MAAM,UAAU,EAAE;IAChB,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAA;AAC3C,CAAC;AAGD,MAAM,UAAU,SAAS;IACvB,MAAM,OAAO,GAAW,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IACrD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,GAAG,EAAE,EAAE,4BAA4B,CAAA;IAClE,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,GAAG,EAAE,EAAE,4BAA4B,CAAA;IAClE,OAAO,GAAG,EAAE,EAAE,KAAK,CAAA;AACrB,CAAC;AAGD,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAW,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAA;IACrD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,GAAG,EAAE,EAAE,iBAAiB,CAAA;IACvD,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,GAAG,EAAE,EAAE,uBAAuB,CAAA;IAC7D,OAAO,GAAG,EAAE,EAAE,qBAAqB,CAAA;AACrC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Host, DeployContext } from '../types.ts';
2
+ export type LifecycleHook = (ctx: DeployContext, host: Host) => Promise<void> | void;
3
+ export declare class PipelineHookStore {
4
+ #private;
5
+ addSetup(fn: LifecycleHook): void;
6
+ getSetup(): LifecycleHook[];
7
+ addStatus(fn: LifecycleHook): void;
8
+ getStatus(): LifecycleHook[];
9
+ }
10
+ export declare const hooks: PipelineHookStore;
@@ -0,0 +1,18 @@
1
+ export class PipelineHookStore {
2
+ #setupHooks = [];
3
+ #statusHooks = [];
4
+ addSetup(fn) {
5
+ this.#setupHooks.push(fn);
6
+ }
7
+ getSetup() {
8
+ return [...this.#setupHooks];
9
+ }
10
+ addStatus(fn) {
11
+ this.#statusHooks.push(fn);
12
+ }
13
+ getStatus() {
14
+ return [...this.#statusHooks];
15
+ }
16
+ }
17
+ export const hooks = new PipelineHookStore();
18
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/pipeline/hooks.ts"],"names":[],"mappings":"AAIA,MAAM,OAAO,iBAAiB;IAC5B,WAAW,GAAoB,EAAE,CAAA;IACjC,YAAY,GAAoB,EAAE,CAAA;IAElC,QAAQ,CAAC,EAAiB;QACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3B,CAAC;IAED,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAA;IAC9B,CAAC;IAED,SAAS,CAAC,EAAiB;QACzB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,SAAS;QACP,OAAO,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;IAC/B,CAAC;CACF;AAED,MAAM,CAAC,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { TaskName } from '../types.ts';
2
+ export declare class PipelineStore {
3
+ #private;
4
+ get(): string[];
5
+ set(tasks: TaskName[]): void;
6
+ before(existing: TaskName, newTask: TaskName): void;
7
+ after(existing: TaskName, newTask: TaskName): void;
8
+ remove(name: TaskName): void;
9
+ }
@@ -0,0 +1,38 @@
1
+ export class PipelineStore {
2
+ #pipeline = [
3
+ 'deploy:lock',
4
+ 'deploy:release',
5
+ 'deploy:update_code',
6
+ 'deploy:shared',
7
+ 'deploy:publish',
8
+ 'deploy:log_revision',
9
+ 'deploy:healthcheck',
10
+ 'deploy:unlock',
11
+ 'deploy:cleanup',
12
+ ];
13
+ get() {
14
+ return [...this.#pipeline];
15
+ }
16
+ set(tasks) {
17
+ this.#pipeline = [...tasks];
18
+ }
19
+ before(existing, newTask) {
20
+ const idx = this.#pipeline.indexOf(existing);
21
+ if (idx === -1)
22
+ throw new Error(`Task "${existing}" not found in pipeline`);
23
+ this.#pipeline.splice(idx, 0, newTask);
24
+ }
25
+ after(existing, newTask) {
26
+ const idx = this.#pipeline.indexOf(existing);
27
+ if (idx === -1)
28
+ throw new Error(`Task "${existing}" not found in pipeline`);
29
+ this.#pipeline.splice(idx + 1, 0, newTask);
30
+ }
31
+ remove(name) {
32
+ const idx = this.#pipeline.indexOf(name);
33
+ if (idx === -1)
34
+ throw new Error(`Task "${name}" not found in pipeline`);
35
+ this.#pipeline.splice(idx, 1);
36
+ }
37
+ }
38
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/pipeline/store.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACxB,SAAS,GAAa;QACpB,aAAa;QACb,gBAAgB;QAChB,oBAAoB;QACpB,eAAe;QACf,gBAAgB;QAChB,qBAAqB;QACrB,oBAAoB;QACpB,eAAe;QACf,gBAAgB;KACjB,CAAA;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAA;IAC5B,CAAC;IAED,GAAG,CAAC,KAAiB;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;IAC7B,CAAC;IAED,MAAM,CAAC,QAAkB,EAAE,OAAiB;QAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,yBAAyB,CAAC,CAAA;QAC3E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;IACxC,CAAC;IAED,KAAK,CAAC,QAAkB,EAAE,OAAiB;QACzC,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC5C,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,QAAQ,yBAAyB,CAAC,CAAA;QAC3E,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;IAC5C,CAAC;IAED,MAAM,CAAC,IAAc;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;QACxC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,yBAAyB,CAAC,CAAA;QACvE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;IAC/B,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { TaskName } from './types.ts';
2
+ import { type LifecycleHook } from './pipeline/hooks.ts';
3
+ export type { LifecycleHook } from './pipeline/hooks.ts';
4
+ export declare function getPipeline(): string[];
5
+ export declare function setPipeline(tasks: TaskName[]): void;
6
+ export declare function before(existing: TaskName, newTask: TaskName): void;
7
+ export declare function after(existing: TaskName, newTask: TaskName): void;
8
+ export declare function remove(name: TaskName): void;
9
+ export declare function onSetup(fn: LifecycleHook): void;
10
+ export declare function onStatus(fn: LifecycleHook): void;
@@ -0,0 +1,25 @@
1
+ import { PipelineStore } from "./pipeline/store.js";
2
+ import { hooks } from "./pipeline/hooks.js";
3
+ const pipeline = new PipelineStore();
4
+ export function getPipeline() {
5
+ return pipeline.get();
6
+ }
7
+ export function setPipeline(tasks) {
8
+ pipeline.set(tasks);
9
+ }
10
+ export function before(existing, newTask) {
11
+ pipeline.before(existing, newTask);
12
+ }
13
+ export function after(existing, newTask) {
14
+ pipeline.after(existing, newTask);
15
+ }
16
+ export function remove(name) {
17
+ pipeline.remove(name);
18
+ }
19
+ export function onSetup(fn) {
20
+ hooks.addSetup(fn);
21
+ }
22
+ export function onStatus(fn) {
23
+ hooks.addStatus(fn);
24
+ }
25
+ //# sourceMappingURL=pipeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/pipeline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,KAAK,EAAsB,MAAM,qBAAqB,CAAA;AAI/D,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAA;AAGpC,MAAM,UAAU,WAAW;IACzB,OAAO,QAAQ,CAAC,GAAG,EAAE,CAAA;AACvB,CAAC;AAGD,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;AACrB,CAAC;AAGD,MAAM,UAAU,MAAM,CAAC,QAAkB,EAAE,OAAiB;IAC1D,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;AACpC,CAAC;AAGD,MAAM,UAAU,KAAK,CAAC,QAAkB,EAAE,OAAiB;IACzD,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;AACnC,CAAC;AAGD,MAAM,UAAU,MAAM,CAAC,IAAc;IACnC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;AACvB,CAAC;AAGD,MAAM,UAAU,OAAO,CAAC,EAAiB;IACvC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;AACpB,CAAC;AAGD,MAAM,UAAU,QAAQ,CAAC,EAAiB;IACxC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;AACrB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function set(key: string, value: unknown): void;
2
+ export declare function get<T>(key: string, defaultValue?: T): T;
@@ -0,0 +1,8 @@
1
+ const store = new Map();
2
+ export function set(key, value) {
3
+ store.set(key, value);
4
+ }
5
+ export function get(key, defaultValue) {
6
+ return (store.has(key) ? store.get(key) : defaultValue);
7
+ }
8
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/store.ts"],"names":[],"mappings":"AAAA,MAAM,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAA;AAExC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAE,KAAc;IAC7C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;AACvB,CAAC;AAED,MAAM,UAAU,GAAG,CAAI,GAAW,EAAE,YAAgB;IAClD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAM,CAAA;AAC9D,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { Host, DeployContext, Paths } from '../types.ts';
2
+ export interface TaskContext {
3
+ host: Host;
4
+ paths: Paths;
5
+ deployCtx: DeployContext;
6
+ }
7
+ export type TaskFn = (ctx: TaskContext) => void | Promise<void>;
8
+ export declare class TaskRunner {
9
+ #private;
10
+ get(): TaskContext | null;
11
+ set(ctx: TaskContext): void;
12
+ clear(): void;
13
+ push(command: string): void;
14
+ bin(name: string): string;
15
+ isVerbose(): boolean;
16
+ resolve(str: string): string;
17
+ flush(): Promise<void>;
18
+ }
@@ -0,0 +1,50 @@
1
+ import { ssh, yellow } from "../utils.js";
2
+ export class TaskRunner {
3
+ #ctx = null;
4
+ #commands = [];
5
+ get() {
6
+ return this.#ctx;
7
+ }
8
+ set(ctx) {
9
+ this.#ctx = ctx;
10
+ this.#commands = [];
11
+ }
12
+ clear() {
13
+ this.#ctx = null;
14
+ this.#commands = [];
15
+ }
16
+ push(command) {
17
+ if (!this.#ctx)
18
+ throw new Error('cd() or run() must be called inside a task');
19
+ this.#commands.push(command);
20
+ }
21
+ bin(name) {
22
+ return this.#ctx?.host.bin?.[name] ?? name;
23
+ }
24
+ isVerbose() {
25
+ return this.#ctx?.deployCtx.config.verbose ?? false;
26
+ }
27
+ resolve(str) {
28
+ if (!this.#ctx)
29
+ return str;
30
+ const p = this.#ctx.paths;
31
+ return str
32
+ .replace(/\{\{release_path\}\}/g, p.release)
33
+ .replace(/\{\{current_path\}\}/g, p.current)
34
+ .replace(/\{\{shared_path\}\}/g, p.shared)
35
+ .replace(/\{\{releases_path\}\}/g, p.releases)
36
+ .replace(/\{\{base_path\}\}/g, p.base)
37
+ .replace(/\{\{release\}\}/g, this.#ctx.deployCtx.release);
38
+ }
39
+ async flush() {
40
+ if (!this.#ctx || this.#commands.length === 0)
41
+ return;
42
+ const cmds = this.#commands.splice(0);
43
+ if (this.#ctx.deployCtx.config.verbose) {
44
+ for (const cmd of cmds)
45
+ console.log(yellow(` $ ${cmd}`));
46
+ }
47
+ await ssh(this.#ctx.host, ['set -e', ...cmds].join('\n'));
48
+ }
49
+ }
50
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../src/task/runner.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAUzC,MAAM,OAAO,UAAU;IACrB,IAAI,GAAuB,IAAI,CAAA;IAC/B,SAAS,GAAa,EAAE,CAAA;IAExB,GAAG;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,GAAG,CAAC,GAAgB;QAClB,IAAI,CAAC,IAAI,GAAG,GAAG,CAAA;QACf,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IACrB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;IACrB,CAAC;IAED,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;QAC7E,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC9B,CAAC;IAED,GAAG,CAAC,IAAY;QACd,OAAO,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;IAC5C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,IAAI,KAAK,CAAA;IACrD,CAAC;IAED,OAAO,CAAC,GAAW;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,GAAG,CAAA;QAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAA;QACzB,OAAO,GAAG;aACP,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC;aAC3C,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC,OAAO,CAAC;aAC3C,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAAC,MAAM,CAAC;aACzC,OAAO,CAAC,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC;aAC7C,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC,IAAI,CAAC;aACrC,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QACrC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACvC,KAAK,MAAM,GAAG,IAAI,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAA;QAC7D,CAAC;QACD,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;IAC3D,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { Host, DeployContext, TaskName } from '../types.ts';
2
+ import { type TaskFn, TaskRunner } from './runner.ts';
3
+ export declare class TaskStore {
4
+ #private;
5
+ constructor(runner: TaskRunner);
6
+ register(name: TaskName, fn: TaskFn): void;
7
+ has(name: TaskName): boolean;
8
+ list(): string[];
9
+ run(name: TaskName, deployCtx: DeployContext, host: Host): Promise<void>;
10
+ }
@@ -0,0 +1,35 @@
1
+ import { getPaths } from "../utils.js";
2
+ export class TaskStore {
3
+ #registry = new Map();
4
+ #runner;
5
+ constructor(runner) {
6
+ this.#runner = runner;
7
+ }
8
+ register(name, fn) {
9
+ this.#registry.set(name, fn);
10
+ }
11
+ has(name) {
12
+ return this.#registry.has(name);
13
+ }
14
+ list() {
15
+ return [...this.#registry.keys()];
16
+ }
17
+ async run(name, deployCtx, host) {
18
+ const fn = this.#registry.get(name);
19
+ if (!fn)
20
+ throw new Error(`Task not found: "${name}"`);
21
+ const paths = getPaths(host.deployPath, deployCtx.release);
22
+ const ctx = { host, paths, deployCtx };
23
+ this.#runner.set(ctx);
24
+ try {
25
+ const result = fn(ctx);
26
+ if (result instanceof Promise)
27
+ await result;
28
+ await this.#runner.flush();
29
+ }
30
+ finally {
31
+ this.#runner.clear();
32
+ }
33
+ }
34
+ }
35
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/task/store.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAGtC,MAAM,OAAO,SAAS;IACpB,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAA;IACrC,OAAO,CAAY;IAEnB,YAAY,MAAkB;QAC5B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAA;IACvB,CAAC;IAED,QAAQ,CAAC,IAAc,EAAE,EAAU;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAC9B,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,KAAK,CAAC,GAAG,CAAC,IAAc,EAAE,SAAwB,EAAE,IAAU;QAC5D,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,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;QACtC,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"}
@@ -1,33 +1,11 @@
1
- import type { Host, DeployContext, Paths, TaskName } from './types.ts';
2
- import { yellow, blue, gray } from './utils.ts';
3
- export { yellow, blue, gray };
4
- export type TaskFn = () => void | Promise<void>;
5
- export interface TaskContext {
6
- host: Host;
7
- paths: Paths;
8
- deployCtx: DeployContext;
9
- }
10
- export declare function getContext(): TaskContext;
1
+ import type { Host, DeployContext, TaskName } from './types.ts';
2
+ import { type TaskFn } from './task/runner.ts';
3
+ export type { TaskContext } from './task/runner.ts';
11
4
  export declare function task(name: TaskName, fn: TaskFn): void;
12
- export declare function cd(path: string): void;
13
- export declare function run(command: string): void;
14
- export declare function runTask(name: TaskName, deployCtx: DeployContext, host: Host): Promise<void>;
15
- export declare function before(existing: TaskName, newTask: TaskName): void;
16
- export declare function after(existing: TaskName, newTask: TaskName): void;
17
- export declare function getPipeline(): string[];
18
5
  export declare function hasTask(name: TaskName): boolean;
19
6
  export declare function getTasks(): string[];
20
- export declare function set(key: string, value: unknown): void;
21
- export declare function get<T>(key: string, defaultValue?: T): T;
7
+ export declare function runTask(name: TaskName, deployCtx: DeployContext, host: Host): Promise<void>;
8
+ export declare function cd(path: string): void;
9
+ export declare function run(command: string): void;
22
10
  export declare function bin(name: string): string;
23
- export declare function pm(): string;
24
- export declare function pmInstall(): string;
25
- export declare function pmInstallProd(): string;
26
- export declare function remove(name: TaskName): void;
27
- export declare function setPipeline(tasks: TaskName[]): void;
28
- type LifecycleHook = (ctx: DeployContext, host: Host) => Promise<void> | void;
29
- export declare function onSetup(fn: LifecycleHook): void;
30
- export declare function getSetupHooks(): LifecycleHook[];
31
- export declare function onStatus(fn: LifecycleHook): void;
32
- export declare function getStatusHooks(): LifecycleHook[];
33
11
  export declare function isVerbose(): boolean;