git-push-deploy-cli 0.1.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/LICENSE +21 -0
- package/README.md +187 -0
- package/dist/commands/deploy.d.ts +9 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +10 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +212 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/install.d.ts +10 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +67 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/logs.d.ts +10 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +42 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/release.d.ts +9 -0
- package/dist/commands/release.d.ts.map +1 -0
- package/dist/commands/release.js +32 -0
- package/dist/commands/release.js.map +1 -0
- package/dist/commands/stage.d.ts +5 -0
- package/dist/commands/stage.d.ts.map +1 -0
- package/dist/commands/stage.js +37 -0
- package/dist/commands/stage.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +61 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/config/loader.d.ts +22 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +66 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/types.d.ts +42 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +10 -0
- package/dist/config/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/files.d.ts +25 -0
- package/dist/utils/files.d.ts.map +1 -0
- package/dist/utils/files.js +47 -0
- package/dist/utils/files.js.map +1 -0
- package/dist/utils/git.d.ts +33 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +63 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/pm2.d.ts +39 -0
- package/dist/utils/pm2.d.ts.map +1 -0
- package/dist/utils/pm2.js +83 -0
- package/dist/utils/pm2.js.map +1 -0
- package/dist/utils/process-manager.d.ts +37 -0
- package/dist/utils/process-manager.d.ts.map +1 -0
- package/dist/utils/process-manager.js +17 -0
- package/dist/utils/process-manager.js.map +1 -0
- package/dist/utils/shell.d.ts +24 -0
- package/dist/utils/shell.d.ts.map +1 -0
- package/dist/utils/shell.js +51 -0
- package/dist/utils/shell.js.map +1 -0
- package/dist/utils/systemd.d.ts +34 -0
- package/dist/utils/systemd.d.ts.map +1 -0
- package/dist/utils/systemd.js +79 -0
- package/dist/utils/systemd.js.map +1 -0
- package/package.json +60 -0
- package/templates/post-receive.sh +55 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getServiceConfig, getWorkspaceRoot } from '../config/loader.js';
|
|
3
|
+
import { gitAddAll, gitCommit, gitPush, hasChanges, getCurrentBranch } from '../utils/git.js';
|
|
4
|
+
import { joinPath } from '../utils/files.js';
|
|
5
|
+
/**
|
|
6
|
+
* Release command - commit and push deploy repository
|
|
7
|
+
*/
|
|
8
|
+
export async function releaseCommand(serviceName, options = {}) {
|
|
9
|
+
console.log(chalk.blue(`Releasing ${serviceName}...`));
|
|
10
|
+
const config = getServiceConfig(serviceName);
|
|
11
|
+
const workspaceRoot = getWorkspaceRoot();
|
|
12
|
+
const deployRepoPath = joinPath(workspaceRoot, config.deployRepo);
|
|
13
|
+
// Check for changes
|
|
14
|
+
if (!hasChanges(deployRepoPath)) {
|
|
15
|
+
console.log(chalk.yellow('No changes to release.'));
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
// Commit
|
|
19
|
+
const message = options.message || `deploy: ${serviceName}`;
|
|
20
|
+
gitAddAll(deployRepoPath);
|
|
21
|
+
const committed = gitCommit(deployRepoPath, message);
|
|
22
|
+
if (!committed) {
|
|
23
|
+
console.log(chalk.yellow('No changes to commit.'));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
// Push
|
|
27
|
+
const branch = getCurrentBranch(deployRepoPath);
|
|
28
|
+
console.log(chalk.gray(` Pushing to origin/${branch}...`));
|
|
29
|
+
gitPush(deployRepoPath, 'origin', branch);
|
|
30
|
+
console.log(chalk.green(`✓ Released ${serviceName}`));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=release.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"release.js","sourceRoot":"","sources":["../../src/commands/release.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM7C;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,UAA0B,EAAE;IACpF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,WAAW,KAAK,CAAC,CAAC,CAAC;IAEvD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAElE,oBAAoB;IACpB,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,SAAS;IACT,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,WAAW,WAAW,EAAE,CAAC;IAC5D,SAAS,CAAC,cAAc,CAAC,CAAC;IAE1B,MAAM,SAAS,GAAG,SAAS,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IAED,OAAO;IACP,MAAM,MAAM,GAAG,gBAAgB,CAAC,cAAc,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,MAAM,KAAK,CAAC,CAAC,CAAC;IAC5D,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,WAAW,EAAE,CAAC,CAAC,CAAC;AACxD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage.d.ts","sourceRoot":"","sources":["../../src/commands/stage.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAmCrE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { getServiceConfig, getWorkspaceRoot } from '../config/loader.js';
|
|
3
|
+
import { DEFAULT_ARTIFACTS } from '../config/types.js';
|
|
4
|
+
import { ensureDir, removeDir, copy, exists, joinPath } from '../utils/files.js';
|
|
5
|
+
/**
|
|
6
|
+
* Stage command - copy build artifacts to deploy repository
|
|
7
|
+
*/
|
|
8
|
+
export async function stageCommand(serviceName) {
|
|
9
|
+
console.log(chalk.blue(`Staging ${serviceName}...`));
|
|
10
|
+
const config = getServiceConfig(serviceName);
|
|
11
|
+
const workspaceRoot = getWorkspaceRoot();
|
|
12
|
+
const deployRepoPath = joinPath(workspaceRoot, config.deployRepo);
|
|
13
|
+
const artifacts = config.artifacts || DEFAULT_ARTIFACTS;
|
|
14
|
+
// Stage each package
|
|
15
|
+
for (const pkg of config.packages) {
|
|
16
|
+
const pkgPath = joinPath(workspaceRoot, pkg);
|
|
17
|
+
const destPath = joinPath(deployRepoPath, pkg);
|
|
18
|
+
if (!exists(pkgPath)) {
|
|
19
|
+
console.log(chalk.yellow(` Warning: Package ${pkg} not found at ${pkgPath}`));
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
// Remove old staged files
|
|
23
|
+
removeDir(destPath);
|
|
24
|
+
ensureDir(destPath);
|
|
25
|
+
// Copy artifacts
|
|
26
|
+
for (const artifact of artifacts) {
|
|
27
|
+
const srcArtifact = joinPath(pkgPath, artifact);
|
|
28
|
+
const destArtifact = joinPath(destPath, artifact);
|
|
29
|
+
if (exists(srcArtifact)) {
|
|
30
|
+
copy(srcArtifact, destArtifact);
|
|
31
|
+
console.log(chalk.gray(` ${pkg}/${artifact}`));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
console.log(chalk.green(`✓ Staged ${config.packages.length} package(s) to ${config.deployRepo}`));
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=stage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stage.js","sourceRoot":"","sources":["../../src/commands/stage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzE,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEjF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,WAAW,KAAK,CAAC,CAAC,CAAC;IAErD,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC;IAExD,qBAAqB;IACrB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;QAE/C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,GAAG,iBAAiB,OAAO,EAAE,CAAC,CAAC,CAAC;YAC/E,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpB,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEpB,iBAAiB;QACjB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAElD,IAAI,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBACxB,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,CAAC,MAAM,kBAAkB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AACpG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqDnD"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { loadConfig, listServices } from '../config/loader.js';
|
|
3
|
+
import { createProcessManager } from '../utils/process-manager.js';
|
|
4
|
+
import { commandExists } from '../utils/shell.js';
|
|
5
|
+
/**
|
|
6
|
+
* Status command - show all services and process manager status
|
|
7
|
+
*/
|
|
8
|
+
export async function statusCommand() {
|
|
9
|
+
console.log(chalk.blue('Service Status'));
|
|
10
|
+
console.log('');
|
|
11
|
+
// List configured services
|
|
12
|
+
try {
|
|
13
|
+
const services = listServices();
|
|
14
|
+
const config = loadConfig();
|
|
15
|
+
console.log(chalk.white('Configured Services:'));
|
|
16
|
+
for (const name of services) {
|
|
17
|
+
const svc = config.services[name];
|
|
18
|
+
const pmType = svc.processManager || 'pm2';
|
|
19
|
+
console.log(chalk.gray(` ${name}`));
|
|
20
|
+
console.log(chalk.gray(` Process Manager: ${pmType}`));
|
|
21
|
+
console.log(chalk.gray(` Process Name: ${svc.processName}`));
|
|
22
|
+
console.log(chalk.gray(` Packages: ${svc.packages.join(', ')}`));
|
|
23
|
+
console.log(chalk.gray(` Target: ${svc.server.targetDir}`));
|
|
24
|
+
}
|
|
25
|
+
console.log('');
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
console.log(chalk.yellow('No .git-deploy.json found in current directory tree.'));
|
|
29
|
+
console.log('');
|
|
30
|
+
}
|
|
31
|
+
// Show PM2 status if available
|
|
32
|
+
if (commandExists('pm2')) {
|
|
33
|
+
console.log(chalk.white('PM2 Processes:'));
|
|
34
|
+
try {
|
|
35
|
+
const pm2 = createProcessManager('pm2');
|
|
36
|
+
const status = pm2.list();
|
|
37
|
+
console.log(status);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
console.log(chalk.gray(' No PM2 processes running or PM2 not accessible.'));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Show systemd status if available
|
|
44
|
+
if (commandExists('systemctl')) {
|
|
45
|
+
console.log(chalk.white('Systemd Services (running):'));
|
|
46
|
+
try {
|
|
47
|
+
const systemd = createProcessManager('systemd');
|
|
48
|
+
const status = systemd.list();
|
|
49
|
+
// Filter to show only relevant lines
|
|
50
|
+
const lines = status.split('\n').slice(0, 10);
|
|
51
|
+
console.log(chalk.gray(lines.join('\n')));
|
|
52
|
+
if (status.split('\n').length > 10) {
|
|
53
|
+
console.log(chalk.gray(' ... (use systemctl for full list)'));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
console.log(chalk.gray(' Could not query systemd.'));
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { DeployConfig, ServiceConfig } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Find config file by walking up directory tree
|
|
4
|
+
*/
|
|
5
|
+
export declare function findConfigFile(startDir?: string): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Load and parse config file
|
|
8
|
+
*/
|
|
9
|
+
export declare function loadConfig(configPath?: string): DeployConfig;
|
|
10
|
+
/**
|
|
11
|
+
* Get configuration for a specific service
|
|
12
|
+
*/
|
|
13
|
+
export declare function getServiceConfig(serviceName: string, configPath?: string): ServiceConfig;
|
|
14
|
+
/**
|
|
15
|
+
* Get workspace root (directory containing .git-deploy.json)
|
|
16
|
+
*/
|
|
17
|
+
export declare function getWorkspaceRoot(): string;
|
|
18
|
+
/**
|
|
19
|
+
* List all configured services
|
|
20
|
+
*/
|
|
21
|
+
export declare function listServices(configPath?: string): string[];
|
|
22
|
+
//# sourceMappingURL=loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,GAAE,MAAsB,GAAG,MAAM,GAAG,IAAI,CAY9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,YAAY,CAgB5D;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAUxF;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAMzC;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAG1D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
const CONFIG_FILENAME = '.git-deploy.json';
|
|
4
|
+
/**
|
|
5
|
+
* Find config file by walking up directory tree
|
|
6
|
+
*/
|
|
7
|
+
export function findConfigFile(startDir = process.cwd()) {
|
|
8
|
+
let currentDir = startDir;
|
|
9
|
+
while (currentDir !== dirname(currentDir)) {
|
|
10
|
+
const configPath = join(currentDir, CONFIG_FILENAME);
|
|
11
|
+
if (existsSync(configPath)) {
|
|
12
|
+
return configPath;
|
|
13
|
+
}
|
|
14
|
+
currentDir = dirname(currentDir);
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Load and parse config file
|
|
20
|
+
*/
|
|
21
|
+
export function loadConfig(configPath) {
|
|
22
|
+
const path = configPath || findConfigFile();
|
|
23
|
+
if (!path) {
|
|
24
|
+
throw new Error(`Config file ${CONFIG_FILENAME} not found. Run from workspace root or specify path.`);
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
const content = readFileSync(path, 'utf-8');
|
|
28
|
+
return JSON.parse(content);
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
if (error instanceof SyntaxError) {
|
|
32
|
+
throw new Error(`Invalid JSON in ${path}: ${error.message}`);
|
|
33
|
+
}
|
|
34
|
+
throw error;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get configuration for a specific service
|
|
39
|
+
*/
|
|
40
|
+
export function getServiceConfig(serviceName, configPath) {
|
|
41
|
+
const config = loadConfig(configPath);
|
|
42
|
+
const serviceConfig = config.services[serviceName];
|
|
43
|
+
if (!serviceConfig) {
|
|
44
|
+
const available = Object.keys(config.services).join(', ');
|
|
45
|
+
throw new Error(`Service '${serviceName}' not found in config. Available: ${available}`);
|
|
46
|
+
}
|
|
47
|
+
return serviceConfig;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get workspace root (directory containing .git-deploy.json)
|
|
51
|
+
*/
|
|
52
|
+
export function getWorkspaceRoot() {
|
|
53
|
+
const configPath = findConfigFile();
|
|
54
|
+
if (!configPath) {
|
|
55
|
+
throw new Error(`Config file ${CONFIG_FILENAME} not found.`);
|
|
56
|
+
}
|
|
57
|
+
return dirname(configPath);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* List all configured services
|
|
61
|
+
*/
|
|
62
|
+
export function listServices(configPath) {
|
|
63
|
+
const config = loadConfig(configPath);
|
|
64
|
+
return Object.keys(config.services);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/config/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAGrC,MAAM,eAAe,GAAG,kBAAkB,CAAC;AAE3C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,WAAmB,OAAO,CAAC,GAAG,EAAE;IAC7D,IAAI,UAAU,GAAG,QAAQ,CAAC;IAE1B,OAAO,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QACrD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,OAAO,UAAU,CAAC;QACpB,CAAC;QACD,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,UAAmB;IAC5C,MAAM,IAAI,GAAG,UAAU,IAAI,cAAc,EAAE,CAAC;IAE5C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,eAAe,eAAe,sDAAsD,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,mBAAmB,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB,EAAE,UAAmB;IACvE,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAEnD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,IAAI,KAAK,CAAC,YAAY,WAAW,qCAAqC,SAAS,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,cAAc,EAAE,CAAC;IACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,eAAe,eAAe,aAAa,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,UAAmB;IAC9C,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACtC,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { ProcessManagerType } from '../utils/process-manager.js';
|
|
2
|
+
/**
|
|
3
|
+
* Service configuration for git-deploy
|
|
4
|
+
*/
|
|
5
|
+
export interface ServiceConfig {
|
|
6
|
+
/** Packages to deploy (monorepo support) */
|
|
7
|
+
packages: string[];
|
|
8
|
+
/** Package with package.json for npm install */
|
|
9
|
+
mainPackage: string;
|
|
10
|
+
/** Path to local deploy repository (relative to workspace root) */
|
|
11
|
+
deployRepo: string;
|
|
12
|
+
/** Process manager type (default: 'pm2') */
|
|
13
|
+
processManager?: ProcessManagerType;
|
|
14
|
+
/** Process name (PM2 name or systemd service name) */
|
|
15
|
+
processName: string;
|
|
16
|
+
/** PM2 home directory (optional, only for PM2) */
|
|
17
|
+
pm2Home?: string;
|
|
18
|
+
/** Files/dirs to copy (default: dist, package.json, package-lock.json) */
|
|
19
|
+
artifacts?: string[];
|
|
20
|
+
/** Server-side configuration */
|
|
21
|
+
server: {
|
|
22
|
+
/** Where to install on server */
|
|
23
|
+
targetDir: string;
|
|
24
|
+
/** Path to bare git repo on server */
|
|
25
|
+
bareRepo: string;
|
|
26
|
+
/** Unix user for file ownership */
|
|
27
|
+
user?: string;
|
|
28
|
+
/** Unix group (default: deploy-<service>) */
|
|
29
|
+
group?: string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Root configuration file (.git-deploy.json)
|
|
34
|
+
*/
|
|
35
|
+
export interface DeployConfig {
|
|
36
|
+
services: Record<string, ServiceConfig>;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Default artifacts to copy if not specified
|
|
40
|
+
*/
|
|
41
|
+
export declare const DEFAULT_ARTIFACTS: string[];
|
|
42
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,EAAE,CAAC;IAEnB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IAEpB,mEAAmE;IACnE,UAAU,EAAE,MAAM,CAAC;IAEnB,4CAA4C;IAC5C,cAAc,CAAC,EAAE,kBAAkB,CAAC;IAEpC,sDAAsD;IACtD,WAAW,EAAE,MAAM,CAAC;IAEpB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,0EAA0E;IAC1E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,gCAAgC;IAChC,MAAM,EAAE;QACN,iCAAiC;QACjC,SAAS,EAAE,MAAM,CAAC;QAElB,sCAAsC;QACtC,QAAQ,EAAE,MAAM,CAAC;QAEjB,mCAAmC;QACnC,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd,6CAA6C;QAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,eAAO,MAAM,iBAAiB,UAK7B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAkDA;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,MAAM;IACN,cAAc;IACd,mBAAmB;IACnB,sBAAsB;CACvB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import { stageCommand } from './commands/stage.js';
|
|
4
|
+
import { releaseCommand } from './commands/release.js';
|
|
5
|
+
import { deployCommand } from './commands/deploy.js';
|
|
6
|
+
import { initCommand } from './commands/init.js';
|
|
7
|
+
import { installCommand } from './commands/install.js';
|
|
8
|
+
import { statusCommand } from './commands/status.js';
|
|
9
|
+
import { logsCommand } from './commands/logs.js';
|
|
10
|
+
const program = new Command();
|
|
11
|
+
program
|
|
12
|
+
.name('gpd')
|
|
13
|
+
.description('Git Push Deploy - CLI for git-based deployments with PM2/systemd support')
|
|
14
|
+
.version('0.1.0');
|
|
15
|
+
// Development commands
|
|
16
|
+
program
|
|
17
|
+
.command('stage <service>')
|
|
18
|
+
.description('Copy build artifacts to deploy repository')
|
|
19
|
+
.action(stageCommand);
|
|
20
|
+
program
|
|
21
|
+
.command('release <service>')
|
|
22
|
+
.description('Commit and push deploy repository')
|
|
23
|
+
.option('-m, --message <message>', 'Commit message')
|
|
24
|
+
.action(releaseCommand);
|
|
25
|
+
program
|
|
26
|
+
.command('deploy <service>')
|
|
27
|
+
.description('Stage and release in one step')
|
|
28
|
+
.option('-m, --message <message>', 'Commit message')
|
|
29
|
+
.action(deployCommand);
|
|
30
|
+
// Server commands
|
|
31
|
+
program
|
|
32
|
+
.command('init <service>')
|
|
33
|
+
.description('Initialize bare repo, hook, and permissions on server')
|
|
34
|
+
.option('--users <users>', 'Comma-separated list of users to add to group')
|
|
35
|
+
.action(initCommand);
|
|
36
|
+
program
|
|
37
|
+
.command('install <service>')
|
|
38
|
+
.description('Extract, npm install, pm2 restart (used by post-receive hook)')
|
|
39
|
+
.option('--ref <ref>', 'Git ref to deploy (branch or tag)', 'main')
|
|
40
|
+
.action(installCommand);
|
|
41
|
+
program
|
|
42
|
+
.command('status')
|
|
43
|
+
.description('Show all services and PM2 status')
|
|
44
|
+
.action(statusCommand);
|
|
45
|
+
program
|
|
46
|
+
.command('logs <service>')
|
|
47
|
+
.description('Show deployment logs')
|
|
48
|
+
.option('-n, --lines <lines>', 'Number of lines to show', '50')
|
|
49
|
+
.option('-f, --follow', 'Follow log output')
|
|
50
|
+
.action(logsCommand);
|
|
51
|
+
program.parse();
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,0EAA0E,CAAC;KACvF,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,uBAAuB;AACvB,OAAO;KACJ,OAAO,CAAC,iBAAiB,CAAC;KAC1B,WAAW,CAAC,2CAA2C,CAAC;KACxD,MAAM,CAAC,YAAY,CAAC,CAAC;AAExB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,mCAAmC,CAAC;KAChD,MAAM,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;KACnD,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,kBAAkB,CAAC;KAC3B,WAAW,CAAC,+BAA+B,CAAC;KAC5C,MAAM,CAAC,yBAAyB,EAAE,gBAAgB,CAAC;KACnD,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,kBAAkB;AAClB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,uDAAuD,CAAC;KACpE,MAAM,CAAC,iBAAiB,EAAE,+CAA+C,CAAC;KAC1E,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO;KACJ,OAAO,CAAC,mBAAmB,CAAC;KAC5B,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,aAAa,EAAE,mCAAmC,EAAE,MAAM,CAAC;KAClE,MAAM,CAAC,cAAc,CAAC,CAAC;AAE1B,OAAO;KACJ,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,aAAa,CAAC,CAAC;AAEzB,OAAO;KACJ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,sBAAsB,CAAC;KACnC,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,IAAI,CAAC;KAC9D,MAAM,CAAC,cAAc,EAAE,mBAAmB,CAAC;KAC3C,MAAM,CAAC,WAAW,CAAC,CAAC;AAEvB,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ensure directory exists
|
|
3
|
+
*/
|
|
4
|
+
export declare function ensureDir(path: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Remove directory recursively
|
|
7
|
+
*/
|
|
8
|
+
export declare function removeDir(path: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Copy file or directory
|
|
11
|
+
*/
|
|
12
|
+
export declare function copy(src: string, dest: string): void;
|
|
13
|
+
/**
|
|
14
|
+
* Check if path exists
|
|
15
|
+
*/
|
|
16
|
+
export declare function exists(path: string): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* List directory contents
|
|
19
|
+
*/
|
|
20
|
+
export declare function listDir(path: string): string[];
|
|
21
|
+
/**
|
|
22
|
+
* Join paths
|
|
23
|
+
*/
|
|
24
|
+
export declare function joinPath(...parts: string[]): string;
|
|
25
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAI5C;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAK9C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEnD"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, rmSync, cpSync, readdirSync } from 'fs';
|
|
2
|
+
import { join, dirname } from 'path';
|
|
3
|
+
/**
|
|
4
|
+
* Ensure directory exists
|
|
5
|
+
*/
|
|
6
|
+
export function ensureDir(path) {
|
|
7
|
+
if (!existsSync(path)) {
|
|
8
|
+
mkdirSync(path, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Remove directory recursively
|
|
13
|
+
*/
|
|
14
|
+
export function removeDir(path) {
|
|
15
|
+
if (existsSync(path)) {
|
|
16
|
+
rmSync(path, { recursive: true, force: true });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Copy file or directory
|
|
21
|
+
*/
|
|
22
|
+
export function copy(src, dest) {
|
|
23
|
+
ensureDir(dirname(dest));
|
|
24
|
+
cpSync(src, dest, { recursive: true });
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if path exists
|
|
28
|
+
*/
|
|
29
|
+
export function exists(path) {
|
|
30
|
+
return existsSync(path);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* List directory contents
|
|
34
|
+
*/
|
|
35
|
+
export function listDir(path) {
|
|
36
|
+
if (!existsSync(path)) {
|
|
37
|
+
return [];
|
|
38
|
+
}
|
|
39
|
+
return readdirSync(path);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Join paths
|
|
43
|
+
*/
|
|
44
|
+
export function joinPath(...parts) {
|
|
45
|
+
return join(...parts);
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACxE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAErC;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,SAAS,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,IAAI,CAAC,GAAW,EAAE,IAAY;IAC5C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,IAAY;IAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,GAAG,KAAe;IACzC,OAAO,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git archive from bare repo
|
|
3
|
+
*/
|
|
4
|
+
export declare function gitArchive(bareRepo: string, ref: string, path: string, targetDir: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Git add all changes
|
|
7
|
+
*/
|
|
8
|
+
export declare function gitAddAll(repoDir: string): void;
|
|
9
|
+
/**
|
|
10
|
+
* Git commit with message
|
|
11
|
+
*/
|
|
12
|
+
export declare function gitCommit(repoDir: string, message: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Git push with tags
|
|
15
|
+
*/
|
|
16
|
+
export declare function gitPush(repoDir: string, remote?: string, branch?: string): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get current branch name
|
|
19
|
+
*/
|
|
20
|
+
export declare function getCurrentBranch(repoDir: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Get latest tag
|
|
23
|
+
*/
|
|
24
|
+
export declare function getLatestTag(repoDir: string): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Check if repo has uncommitted changes
|
|
27
|
+
*/
|
|
28
|
+
export declare function hasChanges(repoDir: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Initialize bare repo
|
|
31
|
+
*/
|
|
32
|
+
export declare function initBareRepo(path: string): void;
|
|
33
|
+
//# sourceMappingURL=git.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.d.ts","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAE/F;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAQnE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAiB,EAAE,MAAM,GAAE,MAAe,GAAG,IAAI,CAEjG;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM3D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGnD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAE/C"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { exec, execOutput } from './shell.js';
|
|
2
|
+
/**
|
|
3
|
+
* Git archive from bare repo
|
|
4
|
+
*/
|
|
5
|
+
export function gitArchive(bareRepo, ref, path, targetDir) {
|
|
6
|
+
exec(`git archive ${ref} ${path}/ | tar -x -C ${targetDir}`, { cwd: bareRepo });
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Git add all changes
|
|
10
|
+
*/
|
|
11
|
+
export function gitAddAll(repoDir) {
|
|
12
|
+
exec('git add -A', { cwd: repoDir, silent: true });
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Git commit with message
|
|
16
|
+
*/
|
|
17
|
+
export function gitCommit(repoDir, message) {
|
|
18
|
+
try {
|
|
19
|
+
exec(`git commit -m "${message}"`, { cwd: repoDir, silent: true });
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
// No changes to commit
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Git push with tags
|
|
29
|
+
*/
|
|
30
|
+
export function gitPush(repoDir, remote = 'origin', branch = 'main') {
|
|
31
|
+
exec(`git push ${remote} ${branch} --tags`, { cwd: repoDir });
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get current branch name
|
|
35
|
+
*/
|
|
36
|
+
export function getCurrentBranch(repoDir) {
|
|
37
|
+
return execOutput('git rev-parse --abbrev-ref HEAD', repoDir);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Get latest tag
|
|
41
|
+
*/
|
|
42
|
+
export function getLatestTag(repoDir) {
|
|
43
|
+
try {
|
|
44
|
+
return execOutput('git describe --tags --abbrev=0', repoDir);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if repo has uncommitted changes
|
|
52
|
+
*/
|
|
53
|
+
export function hasChanges(repoDir) {
|
|
54
|
+
const status = execOutput('git status --porcelain', repoDir);
|
|
55
|
+
return status.length > 0;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Initialize bare repo
|
|
59
|
+
*/
|
|
60
|
+
export function initBareRepo(path) {
|
|
61
|
+
exec(`git init --bare --shared=group ${path}`);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=git.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.js","sourceRoot":"","sources":["../../src/utils/git.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,QAAgB,EAAE,GAAW,EAAE,IAAY,EAAE,SAAiB;IACvF,IAAI,CAAC,eAAe,GAAG,IAAI,IAAI,iBAAiB,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,IAAI,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,OAAe;IACxD,IAAI,CAAC;QACH,IAAI,CAAC,kBAAkB,OAAO,GAAG,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,uBAAuB;QACvB,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,OAAO,CAAC,OAAe,EAAE,SAAiB,QAAQ,EAAE,SAAiB,MAAM;IACzF,IAAI,CAAC,YAAY,MAAM,IAAI,MAAM,SAAS,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,UAAU,CAAC,iCAAiC,EAAE,OAAO,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,CAAC;QACH,OAAO,UAAU,CAAC,gCAAgC,EAAE,OAAO,CAAC,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,MAAM,GAAG,UAAU,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IAC7D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,IAAI,CAAC,kCAAkC,IAAI,EAAE,CAAC,CAAC;AACjD,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ProcessManager, ProcessManagerOptions } from './process-manager.js';
|
|
2
|
+
/**
|
|
3
|
+
* PM2 Process Manager implementation
|
|
4
|
+
*/
|
|
5
|
+
export declare class PM2ProcessManager implements ProcessManager {
|
|
6
|
+
readonly name = "pm2";
|
|
7
|
+
private buildEnv;
|
|
8
|
+
restart(processName: string, options?: ProcessManagerOptions): void;
|
|
9
|
+
list(options?: ProcessManagerOptions): string;
|
|
10
|
+
save(options?: ProcessManagerOptions): void;
|
|
11
|
+
show(processName: string, options?: ProcessManagerOptions): string;
|
|
12
|
+
exists(processName: string, options?: ProcessManagerOptions): boolean;
|
|
13
|
+
asUser(user: string, command: string, options?: ProcessManagerOptions): void;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Restart PM2 process
|
|
17
|
+
*/
|
|
18
|
+
export declare function pm2Restart(processName: string, pm2Home?: string): void;
|
|
19
|
+
/**
|
|
20
|
+
* Get PM2 process list
|
|
21
|
+
*/
|
|
22
|
+
export declare function pm2List(pm2Home?: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Save PM2 process list
|
|
25
|
+
*/
|
|
26
|
+
export declare function pm2Save(pm2Home?: string): void;
|
|
27
|
+
/**
|
|
28
|
+
* Get PM2 process info
|
|
29
|
+
*/
|
|
30
|
+
export declare function pm2Show(processName: string, pm2Home?: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Check if PM2 process exists
|
|
33
|
+
*/
|
|
34
|
+
export declare function pm2ProcessExists(processName: string, pm2Home?: string): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Run PM2 command as specific user (for server-side)
|
|
37
|
+
*/
|
|
38
|
+
export declare function pm2AsUser(user: string, command: string, pm2Home?: string): void;
|
|
39
|
+
//# sourceMappingURL=pm2.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pm2.d.ts","sourceRoot":"","sources":["../../src/utils/pm2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAGlF;;GAEG;AACH,qBAAa,iBAAkB,YAAW,cAAc;IACtD,QAAQ,CAAC,IAAI,SAAS;IAEtB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAKnE,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAK7C,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;IAK3C,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,MAAM;IAKlE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO;IASrE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI;CAI7E;AAID;;GAEG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG9C;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAGrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAG/E;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAG/E"}
|