pypeline 1.1.3 → 1.1.4
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/lib/commands/pypeline/build.d.ts +18 -0
- package/lib/commands/pypeline/build.js +85 -0
- package/lib/commands/pypeline/build.js.map +1 -0
- package/lib/commands/pypeline/deploy/training.d.ts +15 -0
- package/lib/commands/pypeline/deploy/training.js +62 -0
- package/lib/commands/pypeline/deploy/training.js.map +1 -0
- package/lib/commands/pypeline/package.d.ts +11 -0
- package/lib/commands/pypeline/package.js +27 -0
- package/lib/commands/pypeline/package.js.map +1 -0
- package/lib/commands/pypeline/quickdeploy.d.ts +18 -0
- package/lib/commands/pypeline/quickdeploy.js +116 -0
- package/lib/commands/pypeline/quickdeploy.js.map +1 -0
- package/lib/commands/pypeline/run.d.ts +19 -0
- package/lib/commands/pypeline/run.js +179 -0
- package/lib/commands/pypeline/run.js.map +1 -0
- package/lib/commands/pypeline/validate/prd.d.ts +16 -0
- package/lib/commands/pypeline/validate/prd.js +78 -0
- package/lib/commands/pypeline/validate/prd.js.map +1 -0
- package/lib/config.d.ts +23 -0
- package/lib/config.js +65 -0
- package/lib/config.js.map +1 -0
- package/lib/fileUtils.d.ts +2 -0
- package/lib/fileUtils.js +78 -0
- package/lib/fileUtils.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/oclif.lock +434 -374
- package/oclif.manifest.json +414 -2
- package/package.json +18 -3
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
export type PypelineBuildResult = {
|
|
3
|
+
commitHash: string;
|
|
4
|
+
novoBaseline: string;
|
|
5
|
+
added: string[];
|
|
6
|
+
modified: string[];
|
|
7
|
+
deleted: string[];
|
|
8
|
+
};
|
|
9
|
+
export default class PypelineBuild extends SfCommand<PypelineBuildResult> {
|
|
10
|
+
static readonly summary: string;
|
|
11
|
+
static readonly description: string;
|
|
12
|
+
static readonly examples: string[];
|
|
13
|
+
static readonly flags: {
|
|
14
|
+
branch: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<PypelineBuildResult>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { execSync, spawnSync } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
5
|
+
import { Messages } from '@salesforce/core';
|
|
6
|
+
import { BASELINE_FILE, BRANCH, BUILD_DIR, PROJECT_DIR, PROJECT_NAME, SCRIPT_DIR, fileExists, readFileTrimmed, writeFile, gitDiffFiles, } from '../../config.js';
|
|
7
|
+
import { copyFile } from '../../fileUtils.js';
|
|
8
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
9
|
+
const messages = Messages.loadMessages('pypeline', 'pypeline.build');
|
|
10
|
+
export default class PypelineBuild extends SfCommand {
|
|
11
|
+
static summary = messages.getMessage('summary');
|
|
12
|
+
static description = messages.getMessage('description');
|
|
13
|
+
static examples = messages.getMessages('examples');
|
|
14
|
+
static flags = {
|
|
15
|
+
branch: Flags.string({
|
|
16
|
+
char: 'b',
|
|
17
|
+
summary: messages.getMessage('flags.branch.summary'),
|
|
18
|
+
default: BRANCH,
|
|
19
|
+
}),
|
|
20
|
+
'dry-run': Flags.boolean({
|
|
21
|
+
summary: messages.getMessage('flags.dry-run.summary'),
|
|
22
|
+
default: false,
|
|
23
|
+
}),
|
|
24
|
+
};
|
|
25
|
+
async run() {
|
|
26
|
+
const { flags } = await this.parse(PypelineBuild);
|
|
27
|
+
const branch = flags['branch'] ?? BRANCH;
|
|
28
|
+
const dryRun = flags['dry-run'];
|
|
29
|
+
this.log(`SCRIPT_DIR : ${SCRIPT_DIR}`);
|
|
30
|
+
this.log(`PROJECT_DIR : ${PROJECT_DIR()}`);
|
|
31
|
+
if (!dryRun) {
|
|
32
|
+
const gen = spawnSync('sf', ['project', 'generate', '--name', PROJECT_NAME, '--output-dir', PROJECT_DIR()], { encoding: 'utf8', stdio: 'inherit' });
|
|
33
|
+
if (gen.status !== 0)
|
|
34
|
+
this.error('Falha ao gerar estrutura do projeto sf.');
|
|
35
|
+
}
|
|
36
|
+
if (!fileExists(BASELINE_FILE()))
|
|
37
|
+
this.error('baseline.txt não encontrado!');
|
|
38
|
+
const commitHash = readFileTrimmed(BASELINE_FILE());
|
|
39
|
+
this.log(`Baseline : ${commitHash}`);
|
|
40
|
+
if (!dryRun) {
|
|
41
|
+
for (const cmd of [
|
|
42
|
+
['git', 'checkout', branch],
|
|
43
|
+
['git', 'fetch'],
|
|
44
|
+
['git', 'pull'],
|
|
45
|
+
]) {
|
|
46
|
+
const r = spawnSync(cmd[0], cmd.slice(1), { stdio: 'inherit' });
|
|
47
|
+
if (r.status !== 0)
|
|
48
|
+
this.error(`Falha ao executar: ${cmd.join(' ')}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const commits = execSync(`git rev-list ${commitHash}..HEAD --oneline`, { encoding: 'utf8' });
|
|
52
|
+
writeFile(path.join(PROJECT_DIR(), 'commitlist.txt'), commits);
|
|
53
|
+
if (fs.existsSync(BUILD_DIR()))
|
|
54
|
+
fs.rmSync(BUILD_DIR(), { recursive: true, force: true });
|
|
55
|
+
fs.mkdirSync(BUILD_DIR(), { recursive: true });
|
|
56
|
+
const diff = gitDiffFiles(commitHash);
|
|
57
|
+
writeFile(path.join(PROJECT_DIR(), 'lista_arquivos_naodeletados.txt'), diff.notDeleted.join('\n'));
|
|
58
|
+
writeFile(path.join(PROJECT_DIR(), 'lista_arquivos_deletados.txt'), diff.deleted.join('\n'));
|
|
59
|
+
writeFile(path.join(PROJECT_DIR(), 'lista_arquivos_adicionados.txt'), diff.added.join('\n'));
|
|
60
|
+
writeFile(path.join(PROJECT_DIR(), 'lista_arquivos_modificados.txt'), diff.modified.join('\n'));
|
|
61
|
+
this.log('Arquivos modificados ou adicionados:');
|
|
62
|
+
for (const file of diff.notDeleted) {
|
|
63
|
+
this.log(` Arquivo a ser avaliado: ${file}`);
|
|
64
|
+
if (!dryRun) {
|
|
65
|
+
try {
|
|
66
|
+
copyFile(file, BUILD_DIR());
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
this.warn(`Erro ao copiar '${file}': ${err.message}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// Calcula o novo baseline (HEAD atual após git pull)
|
|
74
|
+
const novoBaseline = execSync('git rev-parse HEAD', { encoding: 'utf8' }).trim();
|
|
75
|
+
this.log(`[INFO] Novo baseline calculado: ${novoBaseline}`);
|
|
76
|
+
this.log('[INFO] baseline.txt será atualizado pelo run após validate PRD com sucesso.');
|
|
77
|
+
// Persiste o novo baseline para o run.ts ler depois
|
|
78
|
+
process.env['PYPELINE_NOVO_BASELINE'] = novoBaseline;
|
|
79
|
+
const branchInfo = execSync('git branch', { encoding: 'utf8' });
|
|
80
|
+
this.log(`Branches:\n${branchInfo}`);
|
|
81
|
+
this.log(`Build project criado em ${BUILD_DIR()}.`);
|
|
82
|
+
return { commitHash, novoBaseline, added: diff.added, modified: diff.modified, deleted: diff.deleted };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=build.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/commands/pypeline/build.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
export type PypelineDeployTrainingResult = {
|
|
3
|
+
success: boolean;
|
|
4
|
+
logPath: string;
|
|
5
|
+
};
|
|
6
|
+
export default class PypelineDeployTraining extends SfCommand<PypelineDeployTrainingResult> {
|
|
7
|
+
static readonly summary: string;
|
|
8
|
+
static readonly description: string;
|
|
9
|
+
static readonly examples: string[];
|
|
10
|
+
static readonly flags: {
|
|
11
|
+
'target-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
12
|
+
wait: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
};
|
|
14
|
+
run(): Promise<PypelineDeployTrainingResult>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
4
|
+
import { Messages } from '@salesforce/core';
|
|
5
|
+
import { LOG_TRAINING, SOURCE_DIR, unlinkIfExists } from '../../../config.js';
|
|
6
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
7
|
+
const messages = Messages.loadMessages('pypeline', 'pypeline.deploy.training');
|
|
8
|
+
export default class PypelineDeployTraining extends SfCommand {
|
|
9
|
+
static summary = messages.getMessage('summary');
|
|
10
|
+
static description = messages.getMessage('description');
|
|
11
|
+
static examples = messages.getMessages('examples');
|
|
12
|
+
static flags = {
|
|
13
|
+
'target-org': Flags.string({
|
|
14
|
+
summary: messages.getMessage('flags.target-org.summary'),
|
|
15
|
+
default: 'treino',
|
|
16
|
+
}),
|
|
17
|
+
wait: Flags.integer({
|
|
18
|
+
char: 'w',
|
|
19
|
+
summary: messages.getMessage('flags.wait.summary'),
|
|
20
|
+
default: 240,
|
|
21
|
+
}),
|
|
22
|
+
};
|
|
23
|
+
async run() {
|
|
24
|
+
const { flags } = await this.parse(PypelineDeployTraining);
|
|
25
|
+
const logPath = LOG_TRAINING();
|
|
26
|
+
const sourceDir = SOURCE_DIR();
|
|
27
|
+
unlinkIfExists(logPath);
|
|
28
|
+
this.log('Iniciando deploy em Training...');
|
|
29
|
+
const cmd = [
|
|
30
|
+
'project', 'deploy', 'start',
|
|
31
|
+
'--source-dir', sourceDir,
|
|
32
|
+
'--target-org', flags['target-org'] ?? 'treino',
|
|
33
|
+
'--test-level', 'RunLocalTests',
|
|
34
|
+
'-w', String(flags['wait'] ?? 240),
|
|
35
|
+
'--ignore-conflicts',
|
|
36
|
+
'--verbose',
|
|
37
|
+
];
|
|
38
|
+
const exitCode = await new Promise((resolve) => {
|
|
39
|
+
const proc = spawn('sf', cmd, { stdio: ['inherit', 'pipe', 'pipe'] });
|
|
40
|
+
const log = fs.createWriteStream(logPath, { flags: 'a' });
|
|
41
|
+
if (proc.stdout)
|
|
42
|
+
proc.stdout.on('data', (chunk) => {
|
|
43
|
+
const text = chunk.toString();
|
|
44
|
+
process.stdout.write(text);
|
|
45
|
+
log.write(text);
|
|
46
|
+
});
|
|
47
|
+
if (proc.stderr)
|
|
48
|
+
proc.stderr.on('data', (chunk) => {
|
|
49
|
+
const text = chunk.toString();
|
|
50
|
+
process.stderr.write(text);
|
|
51
|
+
log.write(text);
|
|
52
|
+
});
|
|
53
|
+
proc.on('close', (code) => { log.close(); resolve(code ?? 1); });
|
|
54
|
+
});
|
|
55
|
+
if (exitCode !== 0) {
|
|
56
|
+
this.error(`Deploy em Training falhou com exit code ${exitCode}.`);
|
|
57
|
+
}
|
|
58
|
+
this.log('Deploy em Training concluído com sucesso.');
|
|
59
|
+
return { success: true, logPath };
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=training.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"training.js","sourceRoot":"","sources":["../../../../src/commands/pypeline/deploy/training.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
export type PypelinePackageResult = {
|
|
3
|
+
success: boolean;
|
|
4
|
+
buildDir: string;
|
|
5
|
+
};
|
|
6
|
+
export default class PypelinePackage extends SfCommand<PypelinePackageResult> {
|
|
7
|
+
static readonly summary: string;
|
|
8
|
+
static readonly description: string;
|
|
9
|
+
static readonly examples: string[];
|
|
10
|
+
run(): Promise<PypelinePackageResult>;
|
|
11
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
3
|
+
import { Messages } from '@salesforce/core';
|
|
4
|
+
import { BUILD_DIR } from '../../config.js';
|
|
5
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
6
|
+
const messages = Messages.loadMessages('pypeline', 'pypeline.package');
|
|
7
|
+
export default class PypelinePackage extends SfCommand {
|
|
8
|
+
static summary = messages.getMessage('summary');
|
|
9
|
+
static description = messages.getMessage('description');
|
|
10
|
+
static examples = messages.getMessages('examples');
|
|
11
|
+
async run() {
|
|
12
|
+
const buildDir = BUILD_DIR();
|
|
13
|
+
this.log('Gerando package.xml...');
|
|
14
|
+
const exitCode = await new Promise((resolve) => {
|
|
15
|
+
const proc = spawn('sf', ['project', 'generate', 'manifest', '--source-dir', buildDir], {
|
|
16
|
+
stdio: 'inherit',
|
|
17
|
+
});
|
|
18
|
+
proc.on('close', (code) => resolve(code ?? 1));
|
|
19
|
+
});
|
|
20
|
+
if (exitCode !== 0) {
|
|
21
|
+
this.error('Falha ao gerar package.xml.');
|
|
22
|
+
}
|
|
23
|
+
this.log('package.xml gerado com sucesso.');
|
|
24
|
+
return { success: true, buildDir };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=package.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package.js","sourceRoot":"","sources":["../../../src/commands/pypeline/package.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,QAAQ,CAAC,kCAAkC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AAOvE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAgC;IACpE,MAAM,CAAU,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACzD,MAAM,CAAU,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACjE,MAAM,CAAU,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAE5D,KAAK,CAAC,GAAG;QACd,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEnC,MAAM,QAAQ,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;YACrD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE;gBACtF,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC5C,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC5C,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACrC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
export type PypelineQuickdeployResult = {
|
|
3
|
+
success: boolean;
|
|
4
|
+
jobId: string;
|
|
5
|
+
logPath: string;
|
|
6
|
+
};
|
|
7
|
+
export default class PypelineQuickdeploy extends SfCommand<PypelineQuickdeployResult> {
|
|
8
|
+
static readonly summary: string;
|
|
9
|
+
static readonly description: string;
|
|
10
|
+
static readonly examples: string[];
|
|
11
|
+
static readonly flags: {
|
|
12
|
+
'target-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
'job-id': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
wait: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
15
|
+
'no-prompt': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
16
|
+
};
|
|
17
|
+
run(): Promise<PypelineQuickdeployResult>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
4
|
+
import { Messages } from '@salesforce/core';
|
|
5
|
+
import { JOB_ID_FILE, LOG_QUICK_DEPLOY, fileExists, readFileTrimmed, unlinkIfExists, } from '../../config.js';
|
|
6
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
7
|
+
const messages = Messages.loadMessages('pypeline', 'pypeline.quickdeploy');
|
|
8
|
+
const JOB_ID_FORMAT = /^0Af[0-9A-Za-z]{15}$/;
|
|
9
|
+
const ERROR_PATTERN = /deploy failed|error|exception/i;
|
|
10
|
+
export default class PypelineQuickdeploy extends SfCommand {
|
|
11
|
+
static summary = messages.getMessage('summary');
|
|
12
|
+
static description = messages.getMessage('description');
|
|
13
|
+
static examples = messages.getMessages('examples');
|
|
14
|
+
static flags = {
|
|
15
|
+
'target-org': Flags.string({
|
|
16
|
+
summary: messages.getMessage('flags.target-org.summary'),
|
|
17
|
+
default: 'devops',
|
|
18
|
+
}),
|
|
19
|
+
'job-id': Flags.string({
|
|
20
|
+
char: 'j',
|
|
21
|
+
summary: messages.getMessage('flags.job-id.summary'),
|
|
22
|
+
}),
|
|
23
|
+
wait: Flags.integer({
|
|
24
|
+
char: 'w',
|
|
25
|
+
summary: messages.getMessage('flags.wait.summary'),
|
|
26
|
+
default: 240,
|
|
27
|
+
}),
|
|
28
|
+
'no-prompt': Flags.boolean({
|
|
29
|
+
summary: messages.getMessage('flags.no-prompt.summary'),
|
|
30
|
+
default: false,
|
|
31
|
+
}),
|
|
32
|
+
};
|
|
33
|
+
async run() {
|
|
34
|
+
const { flags } = await this.parse(PypelineQuickdeploy);
|
|
35
|
+
const jobIdFile = JOB_ID_FILE();
|
|
36
|
+
const logPath = LOG_QUICK_DEPLOY();
|
|
37
|
+
this.log('');
|
|
38
|
+
this.log('╔══════════════════════════════════════════════╗');
|
|
39
|
+
this.log('║ QUICK DEPLOY EM PRODUÇÃO ║');
|
|
40
|
+
this.log('╚══════════════════════════════════════════════╝');
|
|
41
|
+
this.log('');
|
|
42
|
+
let jobId = flags['job-id'];
|
|
43
|
+
if (!jobId) {
|
|
44
|
+
if (!fileExists(jobIdFile)) {
|
|
45
|
+
this.error('prd_job_id.txt não encontrado. Execute sf pypeline run (ou sf pypeline validate prd) antes.');
|
|
46
|
+
}
|
|
47
|
+
jobId = readFileTrimmed(jobIdFile);
|
|
48
|
+
}
|
|
49
|
+
if (!jobId)
|
|
50
|
+
this.error('Job ID vazio. Nenhum Job ID disponível.');
|
|
51
|
+
if (!JOB_ID_FORMAT.test(jobId)) {
|
|
52
|
+
this.error(`Job ID com formato inválido: ${jobId}\nEsperado: 18 caracteres começando com 0Af`);
|
|
53
|
+
}
|
|
54
|
+
this.log(`[INFO] Job ID: ${jobId}`);
|
|
55
|
+
this.log('[INFO] Validate expira em 10 horas após a geração.');
|
|
56
|
+
this.log('');
|
|
57
|
+
this.log(` Org alvo : ${flags['target-org'] ?? 'devops'}`);
|
|
58
|
+
this.log(` Job ID : ${jobId}`);
|
|
59
|
+
this.log('');
|
|
60
|
+
if (!flags['no-prompt']) {
|
|
61
|
+
const confirmed = await this.confirm({ message: 'Confirma o quick deploy em PRODUÇÃO?' });
|
|
62
|
+
if (!confirmed) {
|
|
63
|
+
this.log('[CANCELADO] Quick deploy não executado.');
|
|
64
|
+
return { success: false, jobId, logPath };
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
unlinkIfExists(logPath);
|
|
68
|
+
this.log('[INFO] Iniciando quick deploy em PRD...');
|
|
69
|
+
const cmd = [
|
|
70
|
+
'project', 'deploy', 'quick',
|
|
71
|
+
'--job-id', jobId,
|
|
72
|
+
'--target-org', flags['target-org'] ?? 'devops',
|
|
73
|
+
'-w', String(flags['wait'] ?? 240),
|
|
74
|
+
'--verbose',
|
|
75
|
+
];
|
|
76
|
+
const exitCode = await new Promise((resolve) => {
|
|
77
|
+
const proc = spawn('sf', cmd, { stdio: ['inherit', 'pipe', 'pipe'] });
|
|
78
|
+
const log = fs.createWriteStream(logPath, { flags: 'a' });
|
|
79
|
+
const handle = (chunk, isErr = false) => {
|
|
80
|
+
const text = chunk.toString();
|
|
81
|
+
(isErr ? process.stderr : process.stdout).write(text);
|
|
82
|
+
log.write(text);
|
|
83
|
+
};
|
|
84
|
+
if (proc.stdout)
|
|
85
|
+
proc.stdout.on('data', (c) => handle(c));
|
|
86
|
+
if (proc.stderr)
|
|
87
|
+
proc.stderr.on('data', (c) => handle(c, true));
|
|
88
|
+
proc.on('close', (code) => { log.close(); resolve(code ?? 1); });
|
|
89
|
+
});
|
|
90
|
+
this.log('');
|
|
91
|
+
if (exitCode === 0) {
|
|
92
|
+
const logContent = fs.readFileSync(logPath, 'utf8');
|
|
93
|
+
if (ERROR_PATTERN.test(logContent)) {
|
|
94
|
+
this.log('╔══════════════════════════════════════════════╗');
|
|
95
|
+
this.log('║ [AVISO] Deploy concluído com warnings. ║');
|
|
96
|
+
this.log(`║ Verifique : ${logPath.split('/').pop()?.padEnd(32) ?? ''}║`);
|
|
97
|
+
this.log('╚══════════════════════════════════════════════╝');
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
unlinkIfExists(jobIdFile);
|
|
101
|
+
this.log('╔══════════════════════════════════════════════╗');
|
|
102
|
+
this.log('║ QUICK DEPLOY EM PRD CONCLUÍDO COM SUCESSO ║');
|
|
103
|
+
this.log('║ prd_job_id.txt removido (evita reuso) ║');
|
|
104
|
+
this.log('╚══════════════════════════════════════════════╝');
|
|
105
|
+
}
|
|
106
|
+
return { success: true, jobId, logPath };
|
|
107
|
+
}
|
|
108
|
+
this.log('╔══════════════════════════════════════════════╗');
|
|
109
|
+
this.log('║ [ERRO] Quick deploy falhou. ║');
|
|
110
|
+
this.log(`║ Exit code : ${String(exitCode).padEnd(32)}║`);
|
|
111
|
+
this.log(`║ Verifique : ${logPath.split('/').pop()?.padEnd(32) ?? ''}║`);
|
|
112
|
+
this.log('╚══════════════════════════════════════════════╝');
|
|
113
|
+
this.error(`Quick deploy falhou com exit code ${exitCode}.`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=quickdeploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quickdeploy.js","sourceRoot":"","sources":["../../../src/commands/pypeline/quickdeploy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
export type PypelineRunResult = {
|
|
3
|
+
success: boolean;
|
|
4
|
+
jobId: string | null;
|
|
5
|
+
baselineUpdated: string | null;
|
|
6
|
+
};
|
|
7
|
+
export default class PypelineRun extends SfCommand<PypelineRunResult> {
|
|
8
|
+
static readonly summary: string;
|
|
9
|
+
static readonly description: string;
|
|
10
|
+
static readonly examples: string[];
|
|
11
|
+
static readonly flags: {
|
|
12
|
+
branch: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
training: import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
14
|
+
'dry-run': import("@oclif/core/interfaces").BooleanFlag<boolean>;
|
|
15
|
+
'prd-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
16
|
+
'training-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
17
|
+
};
|
|
18
|
+
run(): Promise<PypelineRunResult>;
|
|
19
|
+
}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import * as fs from 'node:fs';
|
|
3
|
+
import { SfCommand, Flags } from '@salesforce/sf-plugins-core';
|
|
4
|
+
import { Messages } from '@salesforce/core';
|
|
5
|
+
import { BASELINE_FILE, JOB_ID_FILE, LOG_PRD, LOG_TRAINING, SCRIPT_DIR, fileExists, readFileTrimmed, writeFile, } from '../../config.js';
|
|
6
|
+
Messages.importMessagesDirectoryFromMetaUrl(import.meta.url);
|
|
7
|
+
const messages = Messages.loadMessages('pypeline', 'pypeline.run');
|
|
8
|
+
// ── Melhoria 4: regex específico para Status : Failed do sf CLI ────────────
|
|
9
|
+
const DEPLOY_FAILED_PATTERN = /Status\s*:\s*Failed/i;
|
|
10
|
+
function logHasErrors(logPath) {
|
|
11
|
+
if (!fs.existsSync(logPath))
|
|
12
|
+
return false;
|
|
13
|
+
return fs.readFileSync(logPath, 'utf8').split('\n').some((l) => DEPLOY_FAILED_PATTERN.test(l));
|
|
14
|
+
}
|
|
15
|
+
function extractJobId(logPath) {
|
|
16
|
+
if (!fs.existsSync(logPath))
|
|
17
|
+
return null;
|
|
18
|
+
for (const line of fs.readFileSync(logPath, 'utf8').split('\n')) {
|
|
19
|
+
const match = /\b(0Af[0-9A-Za-z]{15})\b/.exec(line);
|
|
20
|
+
if (match)
|
|
21
|
+
return match[1];
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
async function runSubcommand(args) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
const proc = spawn('sf', args, { stdio: 'inherit' });
|
|
28
|
+
proc.on('close', (code) => resolve(code ?? 1));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export default class PypelineRun extends SfCommand {
|
|
32
|
+
static summary = messages.getMessage('summary');
|
|
33
|
+
static description = messages.getMessage('description');
|
|
34
|
+
static examples = messages.getMessages('examples');
|
|
35
|
+
static flags = {
|
|
36
|
+
branch: Flags.string({
|
|
37
|
+
char: 'b',
|
|
38
|
+
summary: messages.getMessage('flags.branch.summary'),
|
|
39
|
+
}),
|
|
40
|
+
// ── Melhoria 3: training é opt-in, não opt-out ─────────────────────────
|
|
41
|
+
// Por padrão o training NÃO roda. Passe --training para habilitá-lo.
|
|
42
|
+
training: Flags.boolean({
|
|
43
|
+
summary: messages.getMessage('flags.training.summary'),
|
|
44
|
+
default: false,
|
|
45
|
+
}),
|
|
46
|
+
'dry-run': Flags.boolean({
|
|
47
|
+
summary: messages.getMessage('flags.dry-run.summary'),
|
|
48
|
+
default: false,
|
|
49
|
+
}),
|
|
50
|
+
'prd-org': Flags.string({
|
|
51
|
+
summary: messages.getMessage('flags.prd-org.summary'),
|
|
52
|
+
default: 'devops',
|
|
53
|
+
}),
|
|
54
|
+
'training-org': Flags.string({
|
|
55
|
+
summary: messages.getMessage('flags.training-org.summary'),
|
|
56
|
+
default: 'treino',
|
|
57
|
+
}),
|
|
58
|
+
};
|
|
59
|
+
async run() {
|
|
60
|
+
const { flags } = await this.parse(PypelineRun);
|
|
61
|
+
const baselineFile = BASELINE_FILE();
|
|
62
|
+
const jobIdFile = JOB_ID_FILE();
|
|
63
|
+
const logPrd = LOG_PRD();
|
|
64
|
+
const logTraining = LOG_TRAINING();
|
|
65
|
+
if (!fileExists(baselineFile)) {
|
|
66
|
+
this.error('baseline.txt não encontrado. Abortando.');
|
|
67
|
+
}
|
|
68
|
+
const baselineBackup = readFileTrimmed(baselineFile);
|
|
69
|
+
this.log(`[INFO] Baseline salvo para rollback : ${baselineBackup}`);
|
|
70
|
+
this.log(`[INFO] Diretório de trabalho : ${process.cwd()}`);
|
|
71
|
+
this.log(`[INFO] Script dir : ${SCRIPT_DIR}`);
|
|
72
|
+
const rollback = (etapa) => {
|
|
73
|
+
this.log('');
|
|
74
|
+
this.log('╔══════════════════════════════════════════════╗');
|
|
75
|
+
this.log(`║ ERRO NA ETAPA: ${etapa.padEnd(28)}║`);
|
|
76
|
+
this.log(`║ Restaurando baseline → ${baselineBackup.slice(0, 20)}... ║`);
|
|
77
|
+
this.log('╚══════════════════════════════════════════════╝');
|
|
78
|
+
writeFile(baselineFile, baselineBackup + '\n');
|
|
79
|
+
this.log('[INFO] Rollback concluído. Nenhuma alteração foi promovida.');
|
|
80
|
+
this.error(`Pipeline abortado na etapa: ${etapa}`);
|
|
81
|
+
};
|
|
82
|
+
// ── ETAPA 1: Build ───────────────────────────────────────────────────
|
|
83
|
+
this.log('');
|
|
84
|
+
this.log('==> [1/4] Executando build...');
|
|
85
|
+
const buildArgs = [
|
|
86
|
+
'pypeline', 'build',
|
|
87
|
+
...(flags['branch'] ? ['--branch', flags['branch']] : []),
|
|
88
|
+
...(flags['dry-run'] ? ['--dry-run'] : []),
|
|
89
|
+
];
|
|
90
|
+
if ((await runSubcommand(buildArgs)) !== 0)
|
|
91
|
+
rollback('pypeline build');
|
|
92
|
+
// ── Melhoria 2: lê o novoBaseline calculado pelo build ────────────────
|
|
93
|
+
// O build.ts salva o HEAD atual em PYPELINE_NOVO_BASELINE.
|
|
94
|
+
// Se por algum motivo a env não estiver disponível (subprocesso separado),
|
|
95
|
+
// faz fallback lendo o git rev-parse HEAD diretamente.
|
|
96
|
+
const novoBaseline = process.env['PYPELINE_NOVO_BASELINE'] ?? readFileTrimmed(baselineFile);
|
|
97
|
+
this.log(`[INFO] Novo baseline a ser gravado : ${novoBaseline}`);
|
|
98
|
+
// ── ETAPA 2: package.xml ─────────────────────────────────────────────
|
|
99
|
+
this.log('');
|
|
100
|
+
this.log('==> [2/4] Gerando package.xml...');
|
|
101
|
+
if ((await runSubcommand(['pypeline', 'package'])) !== 0)
|
|
102
|
+
rollback('pypeline package');
|
|
103
|
+
// ── ETAPA 3: Training (opt-in via --training) ────────────────────────
|
|
104
|
+
let trainingPromise = null;
|
|
105
|
+
if (flags['training']) {
|
|
106
|
+
this.log('');
|
|
107
|
+
this.log('==> [3/4] Disparando deploy em Training (paralelo ao PRD)...');
|
|
108
|
+
trainingPromise = runSubcommand([
|
|
109
|
+
'pypeline', 'deploy', 'training',
|
|
110
|
+
'--target-org', flags['training-org'] ?? 'treino',
|
|
111
|
+
]);
|
|
112
|
+
this.log('[INFO] Training rodando em background...');
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
this.log('');
|
|
116
|
+
this.log('==> [3/4] Training ignorado (use --training para habilitar).');
|
|
117
|
+
}
|
|
118
|
+
// ── ETAPA 4: Validação PRD (síncrono) ────────────────────────────────
|
|
119
|
+
this.log('');
|
|
120
|
+
this.log('==> [4/4] Validação em PRD...');
|
|
121
|
+
const prdExit = await runSubcommand([
|
|
122
|
+
'pypeline', 'validate', 'prd',
|
|
123
|
+
'--target-org', flags['prd-org'] ?? 'devops',
|
|
124
|
+
]);
|
|
125
|
+
const trainingExit = trainingPromise ? await trainingPromise : null;
|
|
126
|
+
if (prdExit !== 0)
|
|
127
|
+
rollback('pypeline validate prd (exit code diferente de 0)');
|
|
128
|
+
// ── Melhoria 4: detecta "Status : Failed" no log ─────────────────────
|
|
129
|
+
if (logHasErrors(logPrd)) {
|
|
130
|
+
this.log('[ERRO] Status : Failed detectado no deploy_prd_output.log:');
|
|
131
|
+
let shown = 0;
|
|
132
|
+
for (const l of fs.readFileSync(logPrd, 'utf8').split('\n')) {
|
|
133
|
+
if (DEPLOY_FAILED_PATTERN.test(l)) {
|
|
134
|
+
this.log(` ${l}`);
|
|
135
|
+
if (++shown >= 20)
|
|
136
|
+
break;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
rollback('validate PRD (Status : Failed encontrado no log)');
|
|
140
|
+
}
|
|
141
|
+
this.log('[OK] Validação em PRD concluída sem erros.');
|
|
142
|
+
// ── Resultado do Training ────────────────────────────────────────────
|
|
143
|
+
this.log('');
|
|
144
|
+
if (trainingExit === null) {
|
|
145
|
+
this.log('[INFO] Training não executado nesta run (use --training para habilitar).');
|
|
146
|
+
}
|
|
147
|
+
else if (trainingExit !== 0) {
|
|
148
|
+
this.warn(`Training terminou com exit code ${trainingExit} — verifique deploy_training_output.log`);
|
|
149
|
+
}
|
|
150
|
+
else if (logHasErrors(logTraining)) {
|
|
151
|
+
this.warn('Training concluído mas com Status : Failed no log — verifique deploy_training_output.log');
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.log('[OK] Deploy em Training concluído sem erros.');
|
|
155
|
+
}
|
|
156
|
+
// ── Melhoria 2: grava o novoBaseline correto (HEAD do git pull) ───────
|
|
157
|
+
writeFile(baselineFile, novoBaseline + '\n');
|
|
158
|
+
this.log(`[INFO] baseline.txt atualizado para: ${novoBaseline}`);
|
|
159
|
+
// ── Job ID para quick deploy ─────────────────────────────────────────
|
|
160
|
+
const jobId = extractJobId(logPrd);
|
|
161
|
+
if (jobId) {
|
|
162
|
+
writeFile(jobIdFile, jobId + '\n');
|
|
163
|
+
this.log('');
|
|
164
|
+
this.log('╔══════════════════════════════════════════════════════════════╗');
|
|
165
|
+
this.log('║ PIPELINE CONCLUÍDO COM SUCESSO ║');
|
|
166
|
+
this.log(`║ Job ID para quick deploy: ${jobId.padEnd(34)}║`);
|
|
167
|
+
this.log('║ Execute: sf pypeline quickdeploy ║');
|
|
168
|
+
this.log('╚══════════════════════════════════════════════════════════════╝');
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
this.warn('Job ID não encontrado no log. Verifique deploy_prd_output.log manualmente.');
|
|
172
|
+
this.log('[INFO] Pipeline concluído. Baseline atualizado.');
|
|
173
|
+
}
|
|
174
|
+
this.log('');
|
|
175
|
+
this.log('Fim da execução.');
|
|
176
|
+
return { success: true, jobId, baselineUpdated: novoBaseline };
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/pypeline/run.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { SfCommand } from '@salesforce/sf-plugins-core';
|
|
2
|
+
export type PypelineValidatePrdResult = {
|
|
3
|
+
success: boolean;
|
|
4
|
+
jobId: string | null;
|
|
5
|
+
logPath: string;
|
|
6
|
+
};
|
|
7
|
+
export default class PypelineValidatePrd extends SfCommand<PypelineValidatePrdResult> {
|
|
8
|
+
static readonly summary: string;
|
|
9
|
+
static readonly description: string;
|
|
10
|
+
static readonly examples: string[];
|
|
11
|
+
static readonly flags: {
|
|
12
|
+
'target-org': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
|
|
13
|
+
wait: import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
|
|
14
|
+
};
|
|
15
|
+
run(): Promise<PypelineValidatePrdResult>;
|
|
16
|
+
}
|