@catapultjs/deploy 0.11.0 → 0.13.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 +34 -13
- package/build/bin/run.js +31 -55
- package/build/bin/run.js.map +1 -1
- package/build/commands/config_validate.d.ts +7 -0
- package/build/commands/config_validate.js +45 -0
- package/build/commands/config_validate.js.map +1 -0
- package/build/commands/init.js +20 -4
- package/build/commands/init.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/recipes/caddy.d.ts +10 -0
- package/build/recipes/caddy.js +64 -0
- package/build/recipes/caddy.js.map +1 -0
- package/build/recipes/systemd.d.ts +9 -0
- package/build/recipes/systemd.js +37 -0
- package/build/recipes/systemd.js.map +1 -0
- package/build/src/config/json/loader.d.ts +4 -0
- package/build/src/config/json/loader.js +206 -0
- package/build/src/config/json/loader.js.map +1 -0
- package/build/src/config/json/recipe_registry.d.ts +3 -0
- package/build/src/config/json/recipe_registry.js +44 -0
- package/build/src/config/json/recipe_registry.js.map +1 -0
- package/build/src/config/json/schema.d.ts +45 -0
- package/build/src/config/json/schema.js +198 -0
- package/build/src/config/json/schema.js.map +1 -0
- package/build/src/config/loader.d.ts +2 -0
- package/build/src/config/loader.js +21 -0
- package/build/src/config/loader.js.map +1 -0
- package/build/src/config/resolve.d.ts +2 -0
- package/build/src/config/resolve.js +30 -0
- package/build/src/config/resolve.js.map +1 -0
- package/build/src/utils.js +8 -1
- package/build/src/utils.js.map +1 -1
- package/package.json +11 -6
- package/schema/deploy.schema.json +287 -0
- package/skills/catapultjs/SKILL.md +14 -11
- package/skills/catapultjs/references/cli.md +11 -2
- package/skills/catapultjs/references/config.md +133 -34
- package/skills/catapultjs/references/recipe.md +1 -1
- package/skills/catapultjs/references/recipes.md +68 -0
package/README.md
CHANGED
|
@@ -19,13 +19,13 @@ Full documentation at **https://catapultjs.com/**
|
|
|
19
19
|
|
|
20
20
|
## Quick start
|
|
21
21
|
|
|
22
|
-
Run `init` at the root of your project
|
|
22
|
+
Run `init` at the root of your project. It lets you choose TypeScript, JavaScript or JSON, creates the matching `deploy.config.*` file, and installs `@catapultjs/deploy` as a dev dependency:
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
25
|
npx @catapultjs/deploy init
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
Edit
|
|
28
|
+
Edit the generated config to describe your hosts and pick your recipes. With TypeScript:
|
|
29
29
|
|
|
30
30
|
```typescript
|
|
31
31
|
import { defineConfig } from '@catapultjs/deploy'
|
|
@@ -43,6 +43,27 @@ export default defineConfig({
|
|
|
43
43
|
})
|
|
44
44
|
```
|
|
45
45
|
|
|
46
|
+
For a fully declarative config, choose JSON. Catapult validates it against the schema shipped with the package and supports built-in recipes, store values, custom task steps and declarative pipeline controls:
|
|
47
|
+
|
|
48
|
+
```json
|
|
49
|
+
{
|
|
50
|
+
"$schema": "https://catapultjs.com/schema/deploy.schema.json",
|
|
51
|
+
"version": 1,
|
|
52
|
+
"recipes": ["git", "pm2"],
|
|
53
|
+
"config": {
|
|
54
|
+
"hosts": [
|
|
55
|
+
{
|
|
56
|
+
"name": "production",
|
|
57
|
+
"ssh": "deploy@example.com",
|
|
58
|
+
"deployPath": "/home/deploy/myapp"
|
|
59
|
+
}
|
|
60
|
+
]
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
See the [JSON configuration guide](https://catapultjs.com/guide/json-configuration) for tasks, pipeline customization, supported recipes and the cases that still require TypeScript or JavaScript.
|
|
66
|
+
|
|
46
67
|
Prepare the server (once per host), then deploy:
|
|
47
68
|
|
|
48
69
|
```bash
|
|
@@ -69,18 +90,18 @@ npx cata deploy
|
|
|
69
90
|
|
|
70
91
|
## Recipes
|
|
71
92
|
|
|
72
|
-
| Recipe | Description
|
|
73
|
-
| ---------------- |
|
|
93
|
+
| Recipe | Description |
|
|
94
|
+
| ---------------- | -------------------------------------------------------------------------- |
|
|
74
95
|
| `git` | Clones the repository into each release, keeps a bare mirror on the server |
|
|
75
|
-
| `rsync` | Pushes a local directory into the release with rsync
|
|
76
|
-
| `pm2` | Start, reload and manage PM2 processes
|
|
77
|
-
| `adonisjs` | Install, build and migration tasks for AdonisJS apps
|
|
78
|
-
| `adonisjs_local` | Builds the AdonisJS app locally, uploads the artifact
|
|
79
|
-
| `astro` | Builds locally with `astro build`, uploads the output
|
|
80
|
-
| `nuxt` | Build tasks for Nuxt apps
|
|
81
|
-
| `vitepress` | Builds locally with `vitepress build`, uploads the static files
|
|
82
|
-
| `directus` | Directus database migration and schema snapshot tasks
|
|
83
|
-
| `redis` | Flush one, many or all Redis databases
|
|
96
|
+
| `rsync` | Pushes a local directory into the release with rsync |
|
|
97
|
+
| `pm2` | Start, reload and manage PM2 processes |
|
|
98
|
+
| `adonisjs` | Install, build and migration tasks for AdonisJS apps |
|
|
99
|
+
| `adonisjs_local` | Builds the AdonisJS app locally, uploads the artifact |
|
|
100
|
+
| `astro` | Builds locally with `astro build`, uploads the output |
|
|
101
|
+
| `nuxt` | Build tasks for Nuxt apps |
|
|
102
|
+
| `vitepress` | Builds locally with `vitepress build`, uploads the static files |
|
|
103
|
+
| `directus` | Directus database migration and schema snapshot tasks |
|
|
104
|
+
| `redis` | Flush one, many or all Redis databases |
|
|
84
105
|
|
|
85
106
|
## Requirements
|
|
86
107
|
|
package/build/bin/run.js
CHANGED
|
@@ -1,33 +1,25 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
4
|
-
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
5
|
-
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
6
|
-
});
|
|
7
|
-
}
|
|
8
|
-
return path;
|
|
9
|
-
};
|
|
10
|
-
import { pathToFileURL } from 'node:url';
|
|
11
|
-
import { resolve } from 'node:path';
|
|
12
|
-
import { access } from 'node:fs/promises';
|
|
13
|
-
import { findDeployFile } from "../src/utils.js";
|
|
2
|
+
import { loadDeployConfig } from "../src/config/loader.js";
|
|
14
3
|
import { Context } from "../src/context.js";
|
|
15
4
|
import { logger } from "../src/logger.js";
|
|
16
5
|
import { Verbose } from "../src/enums.js";
|
|
17
6
|
import { Kernel, ListLoader, HelpCommand } from '@adonisjs/ace';
|
|
18
|
-
import Version from
|
|
19
|
-
import Init from
|
|
20
|
-
import Setup from
|
|
21
|
-
import Deploy from
|
|
22
|
-
import Rollback from
|
|
23
|
-
import Status from
|
|
24
|
-
import ListReleases from
|
|
25
|
-
import ListRevisions from
|
|
26
|
-
import ListTasks from
|
|
27
|
-
import Pipeline from
|
|
28
|
-
import RunTask from
|
|
29
|
-
import Ssh from
|
|
30
|
-
import Run from
|
|
7
|
+
import Version from "../commands/version.js";
|
|
8
|
+
import Init from "../commands/init.js";
|
|
9
|
+
import Setup from "../commands/setup.js";
|
|
10
|
+
import Deploy from "../commands/deploy.js";
|
|
11
|
+
import Rollback from "../commands/rollback.js";
|
|
12
|
+
import Status from "../commands/status.js";
|
|
13
|
+
import ListReleases from "../commands/list_releases.js";
|
|
14
|
+
import ListRevisions from "../commands/list_revisions.js";
|
|
15
|
+
import ListTasks from "../commands/list_tasks.js";
|
|
16
|
+
import Pipeline from "../commands/pipeline.js";
|
|
17
|
+
import RunTask from "../commands/run_task.js";
|
|
18
|
+
import Ssh from "../commands/ssh.js";
|
|
19
|
+
import Run from "../commands/run.js";
|
|
20
|
+
import ConfigValidate from "../commands/config_validate.js";
|
|
21
|
+
import { resolveDeployConfigFile } from "../src/config/resolve.js";
|
|
22
|
+
const cliArgs = process.argv.slice(2);
|
|
31
23
|
function parseVerboseLevel(argv) {
|
|
32
24
|
let count = 0;
|
|
33
25
|
for (const arg of argv) {
|
|
@@ -38,39 +30,18 @@ function parseVerboseLevel(argv) {
|
|
|
38
30
|
}
|
|
39
31
|
return Math.min(count, Verbose.DEBUG);
|
|
40
32
|
}
|
|
41
|
-
|
|
42
|
-
for (let i = 0; i < argv.length; i++) {
|
|
43
|
-
if ((argv[i] === '--config' || argv[i] === '-c') && argv[i + 1]) {
|
|
44
|
-
return argv[i + 1];
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
return null;
|
|
48
|
-
}
|
|
49
|
-
const skipDeployFile = ['init', 'version'].includes(process.argv[2]);
|
|
33
|
+
const skipDeployFile = ['init', 'version', 'config:validate'].includes(cliArgs[0]);
|
|
50
34
|
if (!skipDeployFile) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
try {
|
|
56
|
-
await access(resolved);
|
|
57
|
-
deployFile = resolved;
|
|
58
|
-
}
|
|
59
|
-
catch {
|
|
60
|
-
logger.error(`Config file not found: ${configFlag}`);
|
|
61
|
-
process.exit(1);
|
|
62
|
-
}
|
|
35
|
+
try {
|
|
36
|
+
const deployFile = await resolveDeployConfigFile(cliArgs);
|
|
37
|
+
const initialize = await loadDeployConfig(deployFile);
|
|
38
|
+
await initialize();
|
|
63
39
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
if (!deployFile) {
|
|
68
|
-
logger.error('No supported deploy config file found in current directory. Run `npx cata init` to create one.');
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger.error(error instanceof Error ? error.message : String(error));
|
|
69
42
|
process.exit(1);
|
|
70
43
|
}
|
|
71
|
-
const
|
|
72
|
-
await mod.default();
|
|
73
|
-
const verboseLevel = parseVerboseLevel(process.argv.slice(2));
|
|
44
|
+
const verboseLevel = parseVerboseLevel(cliArgs);
|
|
74
45
|
if (verboseLevel > Verbose.SILENT)
|
|
75
46
|
Context.get().config.verbose = verboseLevel;
|
|
76
47
|
}
|
|
@@ -84,6 +55,10 @@ kernel.defineFlag('config', {
|
|
|
84
55
|
alias: 'c',
|
|
85
56
|
description: 'Path to the deploy config file (default: auto-detected)',
|
|
86
57
|
});
|
|
58
|
+
kernel.defineFlag('json', {
|
|
59
|
+
type: 'boolean',
|
|
60
|
+
description: 'Output result as JSON when supported by the command',
|
|
61
|
+
});
|
|
87
62
|
kernel.on('help', async (command, $kernel, parsed) => {
|
|
88
63
|
parsed.args.unshift(command.commandName);
|
|
89
64
|
const help = new HelpCommand($kernel, parsed, kernel.ui, kernel.prompt);
|
|
@@ -101,10 +76,11 @@ kernel.addLoader(new ListLoader([
|
|
|
101
76
|
ListRevisions,
|
|
102
77
|
ListTasks,
|
|
103
78
|
Pipeline,
|
|
79
|
+
ConfigValidate,
|
|
104
80
|
RunTask,
|
|
105
81
|
Ssh,
|
|
106
82
|
Run,
|
|
107
83
|
]));
|
|
108
|
-
await kernel.handle(
|
|
84
|
+
await kernel.handle(cliArgs);
|
|
109
85
|
process.exitCode = kernel.exitCode ?? 0;
|
|
110
86
|
//# sourceMappingURL=run.js.map
|
package/build/bin/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/run.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../bin/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { BaseCommand, flags } from '@adonisjs/ace';
|
|
11
|
+
import { loadDeployConfig } from "../src/config/loader.js";
|
|
12
|
+
import { resolveDeployConfigFile } from "../src/config/resolve.js";
|
|
13
|
+
export default class ConfigValidate extends BaseCommand {
|
|
14
|
+
static commandName = 'config:validate';
|
|
15
|
+
static description = 'Validate the deploy configuration file';
|
|
16
|
+
async run() {
|
|
17
|
+
let file = null;
|
|
18
|
+
try {
|
|
19
|
+
file = await resolveDeployConfigFile(process.argv.slice(2));
|
|
20
|
+
const initialize = await loadDeployConfig(file);
|
|
21
|
+
await initialize();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
25
|
+
if (this.json || process.argv.includes('--json')) {
|
|
26
|
+
console.log(JSON.stringify({ valid: false, file, error: message }, null, 2));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.logger.error(message);
|
|
30
|
+
}
|
|
31
|
+
this.exitCode = 1;
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (this.json || process.argv.includes('--json')) {
|
|
35
|
+
console.log(JSON.stringify({ valid: true, file }, null, 2));
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this.logger.info(`Deploy config is valid: ${file}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
__decorate([
|
|
42
|
+
flags.boolean({ description: 'Output result as JSON' }),
|
|
43
|
+
__metadata("design:type", Boolean)
|
|
44
|
+
], ConfigValidate.prototype, "json", void 0);
|
|
45
|
+
//# sourceMappingURL=config_validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config_validate.js","sourceRoot":"","sources":["../../commands/config_validate.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAElE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAA;IACtC,MAAM,CAAC,WAAW,GAAG,wCAAwC,CAAA;IAK7D,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,GAAkB,IAAI,CAAA;QAE9B,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,uBAAuB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAC3D,MAAM,UAAU,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAA;YAC/C,MAAM,UAAU,EAAE,CAAA;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC9E,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;YAC5B,CAAC;YACD,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;YACjB,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAC3D,OAAM;QACR,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAA;IACrD,CAAC;;AA1BO;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;;4CACnC"}
|
package/build/commands/init.js
CHANGED
|
@@ -25,6 +25,21 @@ export default defineConfig({
|
|
|
25
25
|
],
|
|
26
26
|
})
|
|
27
27
|
`;
|
|
28
|
+
const JSON_TEMPLATE = `{
|
|
29
|
+
"$schema": "https://catapultjs.com/schema/deploy.schema.json",
|
|
30
|
+
"version": 1,
|
|
31
|
+
"config": {
|
|
32
|
+
"hosts": [
|
|
33
|
+
{
|
|
34
|
+
"name": "production",
|
|
35
|
+
"ssh": "deploy@example.com",
|
|
36
|
+
"deployPath": "/home/deploy/myapp",
|
|
37
|
+
"branch": "main"
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
28
43
|
export default class Init extends BaseCommand {
|
|
29
44
|
static commandName = 'init';
|
|
30
45
|
static description = 'Create a deploy configuration file';
|
|
@@ -35,12 +50,13 @@ export default class Init extends BaseCommand {
|
|
|
35
50
|
return;
|
|
36
51
|
}
|
|
37
52
|
const lang = await this.prompt.choice('Which language do you want to use?', [
|
|
38
|
-
{ name: 'ts', message: 'TypeScript (deploy.ts)' },
|
|
39
|
-
{ name: 'js', message: 'JavaScript (deploy.js)' },
|
|
53
|
+
{ name: 'ts', message: 'TypeScript (deploy.config.ts)' },
|
|
54
|
+
{ name: 'js', message: 'JavaScript (deploy.config.js)' },
|
|
55
|
+
{ name: 'json', message: 'JSON (deploy.config.json)' },
|
|
40
56
|
]);
|
|
41
|
-
const filename =
|
|
57
|
+
const filename = `deploy.config.${lang}`;
|
|
42
58
|
const dest = resolve(process.cwd(), filename);
|
|
43
|
-
await writeFile(dest, TEMPLATE);
|
|
59
|
+
await writeFile(dest, lang === 'json' ? JSON_TEMPLATE : TEMPLATE);
|
|
44
60
|
this.logger.action(`create ${filename}`).succeeded();
|
|
45
61
|
if (this.skipInstall) {
|
|
46
62
|
this.logger.info('Skipping @catapultjs/deploy installation');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../commands/init.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,QAAQ,GAAG;;;;;;;;;;;;CAYhB,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,WAAW,GAAG,oCAAoC,CAAA;IAKzD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,iBAAiB,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oCAAoC,EAAE;YAC1E,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../commands/init.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAEtE,MAAM,QAAQ,GAAG;;;;;;;;;;;;CAYhB,CAAA;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;CAcrB,CAAA;AAED,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,WAAW;IAC3C,MAAM,CAAC,WAAW,GAAG,MAAM,CAAA;IAC3B,MAAM,CAAC,WAAW,GAAG,oCAAoC,CAAA;IAKzD,KAAK,CAAC,GAAG;QACP,MAAM,QAAQ,GAAG,MAAM,cAAc,EAAE,CAAA;QACvC,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,QAAQ,iBAAiB,CAAC,CAAA;YACjD,OAAM;QACR,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,oCAAoC,EAAE;YAC1E,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACxD,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,+BAA+B,EAAE;YACxD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,2BAA2B,EAAE;SACvD,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,iBAAiB,IAAI,EAAE,CAAA;QACxC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,CAAC,CAAA;QAE7C,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,QAAQ,EAAE,CAAC,CAAC,SAAS,EAAE,CAAA;QAEpD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAA;YAC5D,OAAM;QACR,CAAC;QAED,MAAM,EAAE,GAAG,MAAM,oBAAoB,EAAE,CAAA;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAA;QACpD,MAAM,KAAK,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;YACvD,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,SAAS,EAAE,CAAA;IAC9D,CAAC;;AAjCO;IADP,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,8DAA8D,EAAE,CAAC;;yCACnE"}
|
package/build/index.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export * from './src/task.ts';
|
|
|
5
5
|
export * from './src/pipeline.ts';
|
|
6
6
|
export * from './src/package_manager.ts';
|
|
7
7
|
export * from './src/define_config.ts';
|
|
8
|
+
export * from './src/config/json/schema.ts';
|
|
8
9
|
export * from './src/deployer.ts';
|
|
9
10
|
export * from './src/status.ts';
|
|
10
11
|
export { Catapult } from './src/api.ts';
|
package/build/index.js
CHANGED
|
@@ -5,6 +5,7 @@ export * from "./src/task.js";
|
|
|
5
5
|
export * from "./src/pipeline.js";
|
|
6
6
|
export * from "./src/package_manager.js";
|
|
7
7
|
export * from "./src/define_config.js";
|
|
8
|
+
export * from "./src/config/json/schema.js";
|
|
8
9
|
export * from "./src/deployer.js";
|
|
9
10
|
export * from "./src/status.js";
|
|
10
11
|
export { Catapult } from "./src/api.js";
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,wBAAwB,CAAA;AACtC,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,mBAAmB,CAAA;AACjC,cAAc,0BAA0B,CAAA;AACxC,cAAc,wBAAwB,CAAA;AACtC,cAAc,6BAA6B,CAAA;AAC3C,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { task, desc, after, get, bin, upload, onStatus } from "../index.js";
|
|
2
|
+
import { ssh, q } from "../src/utils.js";
|
|
3
|
+
function sudo() {
|
|
4
|
+
return get('caddy_use_sudo', true) ? 'sudo ' : '';
|
|
5
|
+
}
|
|
6
|
+
function configPath() {
|
|
7
|
+
return get('caddy_config_path', '/etc/caddy/Caddyfile');
|
|
8
|
+
}
|
|
9
|
+
function localConfigPath() {
|
|
10
|
+
return get('caddy_local_config_path', './Caddyfile');
|
|
11
|
+
}
|
|
12
|
+
function validateCommand() {
|
|
13
|
+
return `${sudo()}${bin('caddy')} validate --config ${q(configPath())}`;
|
|
14
|
+
}
|
|
15
|
+
function reloadCommand() {
|
|
16
|
+
return `${sudo()}${bin('caddy')} reload --config ${q(configPath())}`;
|
|
17
|
+
}
|
|
18
|
+
onStatus(async (_ctx, host) => {
|
|
19
|
+
const { stdout } = await ssh(host, `set +e\n${bin('caddy')} version || true`);
|
|
20
|
+
const version = stdout.trim().split(/\s+/)[0];
|
|
21
|
+
return { caddy: version || 'unavailable' };
|
|
22
|
+
});
|
|
23
|
+
desc('Validates the Caddy configuration');
|
|
24
|
+
task('caddy:validate', async ({ host, logger }) => {
|
|
25
|
+
const { stdout } = await ssh(host, `set -e\n${validateCommand()}`, { color: true });
|
|
26
|
+
logger.log(stdout.trim());
|
|
27
|
+
});
|
|
28
|
+
desc('Formats the configured Caddyfile');
|
|
29
|
+
task('caddy:fmt', async ({ host, logger }) => {
|
|
30
|
+
const { stdout } = await ssh(host, `set -e\n${sudo()}${bin('caddy')} fmt --overwrite ${q(configPath())}`, { color: true });
|
|
31
|
+
logger.log(stdout.trim());
|
|
32
|
+
});
|
|
33
|
+
desc('Reloads Caddy with the configured Caddyfile');
|
|
34
|
+
task('caddy:reload', async ({ host, logger }) => {
|
|
35
|
+
const validateBeforeReload = get('caddy_validate_before_reload', true);
|
|
36
|
+
const commands = [
|
|
37
|
+
'set -e',
|
|
38
|
+
validateBeforeReload ? validateCommand() : '',
|
|
39
|
+
reloadCommand(),
|
|
40
|
+
].filter(Boolean);
|
|
41
|
+
const { stdout } = await ssh(host, commands.join('\n'), { color: true });
|
|
42
|
+
logger.log(stdout.trim());
|
|
43
|
+
});
|
|
44
|
+
desc('Displays the configured Caddyfile');
|
|
45
|
+
task('caddy:config:show', async ({ host, logger }) => {
|
|
46
|
+
const { stdout } = await ssh(host, `set -e\n${sudo()}cat ${q(configPath())}`, { color: true });
|
|
47
|
+
logger.log(stdout.trim());
|
|
48
|
+
});
|
|
49
|
+
desc('Uploads and validates a local Caddyfile');
|
|
50
|
+
task('caddy:config:upload', async ({ host, paths, logger }) => {
|
|
51
|
+
const remoteTmp = `${paths.cataConfig}/Caddyfile.upload`;
|
|
52
|
+
await ssh(host, `set -e\nmkdir -p ${q(paths.cataConfig)}`);
|
|
53
|
+
await upload(localConfigPath(), remoteTmp);
|
|
54
|
+
const { stdout } = await ssh(host, [
|
|
55
|
+
'set -e',
|
|
56
|
+
`${sudo()}install -m 0644 ${q(remoteTmp)} ${q(configPath())}`,
|
|
57
|
+
validateCommand(),
|
|
58
|
+
].join('\n'), { color: true });
|
|
59
|
+
logger.log(stdout.trim());
|
|
60
|
+
});
|
|
61
|
+
if (get('caddy_reload_after_publish', false)) {
|
|
62
|
+
after('deploy:publish', 'caddy:reload');
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=caddy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caddy.js","sourceRoot":"","sources":["../../recipes/caddy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { task, desc, get } from "../index.js";
|
|
2
|
+
import { ssh, q } from "../src/utils.js";
|
|
3
|
+
function sudo() {
|
|
4
|
+
return get('systemd_use_sudo', true) ? 'sudo ' : '';
|
|
5
|
+
}
|
|
6
|
+
function service() {
|
|
7
|
+
return get('systemd_service', 'app');
|
|
8
|
+
}
|
|
9
|
+
function logLines() {
|
|
10
|
+
const lines = Number(get('systemd_logs_lines', 100));
|
|
11
|
+
return Number.isFinite(lines) && lines > 0 ? Math.floor(lines) : 100;
|
|
12
|
+
}
|
|
13
|
+
desc('Restarts the configured systemd service');
|
|
14
|
+
task('systemd:restart', async ({ host, logger }) => {
|
|
15
|
+
const { stdout } = await ssh(host, `set -e\n${sudo()}systemctl restart ${q(service())}`, {
|
|
16
|
+
color: true,
|
|
17
|
+
});
|
|
18
|
+
logger.log(stdout.trim());
|
|
19
|
+
});
|
|
20
|
+
desc('Reloads the configured systemd service');
|
|
21
|
+
task('systemd:reload', async ({ host, logger }) => {
|
|
22
|
+
const { stdout } = await ssh(host, `set -e\n${sudo()}systemctl reload ${q(service())}`, {
|
|
23
|
+
color: true,
|
|
24
|
+
});
|
|
25
|
+
logger.log(stdout.trim());
|
|
26
|
+
});
|
|
27
|
+
desc('Displays the configured systemd service status');
|
|
28
|
+
task('systemd:status', async ({ host, logger }) => {
|
|
29
|
+
const { stdout } = await ssh(host, `set +e\n${sudo()}systemctl status ${q(service())} --no-pager`, { color: true });
|
|
30
|
+
logger.log(stdout.trim());
|
|
31
|
+
});
|
|
32
|
+
desc('Displays journal logs for the configured systemd service');
|
|
33
|
+
task('systemd:logs', async ({ host, logger }) => {
|
|
34
|
+
const { stdout } = await ssh(host, `set +e\n${sudo()}journalctl -u ${q(service())} -n ${q(String(logLines()))} --no-pager`, { color: true });
|
|
35
|
+
logger.log(stdout.trim());
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=systemd.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"systemd.js","sourceRoot":"","sources":["../../recipes/systemd.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,iBAAiB,CAAA;AAWxC,SAAS,IAAI;IACX,OAAO,GAAG,CAAU,kBAAkB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9D,CAAC;AAED,SAAS,OAAO;IACd,OAAO,GAAG,CAAS,iBAAiB,EAAE,KAAK,CAAC,CAAA;AAC9C,CAAC;AAED,SAAS,QAAQ;IACf,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAS,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAA;IAC5D,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;AACtE,CAAC;AAED,IAAI,CAAC,yCAAyC,CAAC,CAAA;AAC/C,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC9D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,qBAAqB,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QACvF,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,wCAAwC,CAAC,CAAA;AAC9C,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,WAAW,IAAI,EAAE,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;QACtF,KAAK,EAAE,IAAI;KACZ,CAAC,CAAA;IACF,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gDAAgD,CAAC,CAAA;AACtD,IAAI,CAAC,gBAAgB,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC7D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,IAAI,EACJ,WAAW,IAAI,EAAE,oBAAoB,CAAC,CAAC,OAAO,EAAE,CAAC,aAAa,EAC9D,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,CAAC,CAAA;AAChE,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM,EAAe,EAAE,EAAE;IAC3D,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,CAC1B,IAAI,EACJ,WAAW,IAAI,EAAE,iBAAiB,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,EACvF,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CAAA;IACD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAA;AAC3B,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type JsonDeployConfig } from './schema.ts';
|
|
2
|
+
export declare function validateJsonConfig(value: unknown): JsonDeployConfig;
|
|
3
|
+
export declare function parseJsonConfig(contents: string, source: string): JsonDeployConfig;
|
|
4
|
+
export declare function loadJsonConfig(filePath: string): Promise<() => Promise<void>>;
|