Build and archive the tested frontend, upload it through dedicated FTPS credentials, and atomically activate it through cPanel after CI succeeds.
41 lines
1.3 KiB
JavaScript
41 lines
1.3 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import { DeploymentError, deployRelease, readDeploymentConfig, rollbackRelease } from "./cpanel-deploy-lib.mjs";
|
|
|
|
async function main() {
|
|
const mode = process.argv[2] || "deploy";
|
|
if (!new Set(["deploy", "--rollback"]).has(mode) || process.argv.length > 3) {
|
|
throw new DeploymentError("Usage: deploy-cpanel.mjs [--rollback]");
|
|
}
|
|
|
|
const config = readDeploymentConfig(process.env);
|
|
if (mode === "--rollback") {
|
|
const target = process.env.RELEASE_ROLLBACK_TARGET;
|
|
if (!target) {
|
|
throw new DeploymentError("RELEASE_ROLLBACK_TARGET is required for --rollback.");
|
|
}
|
|
const result = await rollbackRelease(config, target);
|
|
console.log(`Frontend rollback completed: active release ${result.activeTarget.split("/")[1]}.`);
|
|
return;
|
|
}
|
|
|
|
const result = await deployRelease(config);
|
|
console.log(
|
|
`Frontend deployment completed: active release ${config.releaseId}; retained rollback release ${
|
|
result.previousTarget.split("/")[1]
|
|
}.`
|
|
);
|
|
if (result.removed.length > 0) {
|
|
console.log(`Pruned ${result.removed.length} inactive release(s).`);
|
|
}
|
|
if (result.retentionWarning) {
|
|
console.warn(result.retentionWarning);
|
|
}
|
|
}
|
|
|
|
main().catch((error) => {
|
|
const message = error instanceof Error ? error.message : "Unknown deployment failure.";
|
|
console.error(message);
|
|
process.exit(1);
|
|
});
|