jenkins-generator 1.0.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/.prettierrc +4 -0
- package/README.md +365 -0
- package/dist/app.controller.d.ts +6 -0
- package/dist/app.controller.js +35 -0
- package/dist/app.controller.js.map +1 -0
- package/dist/app.controller.spec.d.ts +1 -0
- package/dist/app.controller.spec.js +21 -0
- package/dist/app.controller.spec.js.map +1 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +35 -0
- package/dist/app.module.js.map +1 -0
- package/dist/app.service.d.ts +3 -0
- package/dist/app.service.js +20 -0
- package/dist/app.service.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +32 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/config.interface.d.ts +70 -0
- package/dist/interfaces/config.interface.js +3 -0
- package/dist/interfaces/config.interface.js.map +1 -0
- package/dist/main.d.ts +1 -0
- package/dist/main.js +3 -0
- package/dist/main.js.map +1 -0
- package/dist/services/cicd-generator.service.d.ts +14 -0
- package/dist/services/cicd-generator.service.js +158 -0
- package/dist/services/cicd-generator.service.js.map +1 -0
- package/dist/services/cloud-provider.service.d.ts +9 -0
- package/dist/services/cloud-provider.service.js +230 -0
- package/dist/services/cloud-provider.service.js.map +1 -0
- package/dist/services/jenkinsfile.service.d.ts +14 -0
- package/dist/services/jenkinsfile.service.js +414 -0
- package/dist/services/jenkinsfile.service.js.map +1 -0
- package/dist/services/notification.service.d.ts +10 -0
- package/dist/services/notification.service.js +235 -0
- package/dist/services/notification.service.js.map +1 -0
- package/dist/services/prompt.service.d.ts +16 -0
- package/dist/services/prompt.service.js +415 -0
- package/dist/services/prompt.service.js.map +1 -0
- package/dist/services/security.service.d.ts +9 -0
- package/dist/services/security.service.js +95 -0
- package/dist/services/security.service.js.map +1 -0
- package/dist/services/validation.service.d.ts +8 -0
- package/dist/services/validation.service.js +140 -0
- package/dist/services/validation.service.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/eslint.config.mjs +34 -0
- package/nest-cli.json +8 -0
- package/package.json +67 -0
- package/tsconfig.build.json +4 -0
package/dist/main.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/main.js
ADDED
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { PromptService } from './prompt.service';
|
|
2
|
+
import { JenkinsFileService } from './jenkinsfile.service';
|
|
3
|
+
import { SecurityService } from './security.service';
|
|
4
|
+
import { ValidationService } from './validation.service';
|
|
5
|
+
export declare class CICDGeneratorService {
|
|
6
|
+
private readonly promptService;
|
|
7
|
+
private readonly jenkinsFileService;
|
|
8
|
+
private readonly securityService;
|
|
9
|
+
private readonly validationService;
|
|
10
|
+
constructor(promptService: PromptService, jenkinsFileService: JenkinsFileService, securityService: SecurityService, validationService: ValidationService);
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
private writeFiles;
|
|
13
|
+
private displaySummary;
|
|
14
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
42
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
43
|
+
};
|
|
44
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
45
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
46
|
+
};
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.CICDGeneratorService = void 0;
|
|
49
|
+
const common_1 = require("@nestjs/common");
|
|
50
|
+
const prompt_service_1 = require("./prompt.service");
|
|
51
|
+
const jenkinsfile_service_1 = require("./jenkinsfile.service");
|
|
52
|
+
const security_service_1 = require("./security.service");
|
|
53
|
+
const validation_service_1 = require("./validation.service");
|
|
54
|
+
const fs = __importStar(require("fs-extra"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
57
|
+
const ora_1 = __importDefault(require("ora"));
|
|
58
|
+
let CICDGeneratorService = class CICDGeneratorService {
|
|
59
|
+
promptService;
|
|
60
|
+
jenkinsFileService;
|
|
61
|
+
securityService;
|
|
62
|
+
validationService;
|
|
63
|
+
constructor(promptService, jenkinsFileService, securityService, validationService) {
|
|
64
|
+
this.promptService = promptService;
|
|
65
|
+
this.jenkinsFileService = jenkinsFileService;
|
|
66
|
+
this.securityService = securityService;
|
|
67
|
+
this.validationService = validationService;
|
|
68
|
+
}
|
|
69
|
+
async run() {
|
|
70
|
+
try {
|
|
71
|
+
console.log(chalk_1.default.cyan('Starting CICD configuration...\n'));
|
|
72
|
+
const spinner = (0, ora_1.default)('Validating project structure...').start();
|
|
73
|
+
try {
|
|
74
|
+
const packageJson = await this.validationService.readPackageJson();
|
|
75
|
+
spinner.succeed('Project structure validated');
|
|
76
|
+
console.log(chalk_1.default.gray(`Found projhect: ${packageJson.name}`));
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
spinner.fail('Project validation failed');
|
|
80
|
+
throw error;
|
|
81
|
+
}
|
|
82
|
+
console.log(chalk_1.default.yellow('Please provide the following information:\n'));
|
|
83
|
+
const config = await this.promptService.collectAllConfigurations();
|
|
84
|
+
const generatingSpinner = (0, ora_1.default)('Generating Jenkinsfile...').start();
|
|
85
|
+
const jenkinsfile = this.jenkinsFileService.generateJenkinsfile(config);
|
|
86
|
+
generatingSpinner.succeed('Jenkinsfile generated');
|
|
87
|
+
const credentialsGuide = this.jenkinsFileService.generateCredentialsSetupGuide(config);
|
|
88
|
+
const readme = this.jenkinsFileService.generateReadme(config);
|
|
89
|
+
const writingSpinner = (0, ora_1.default)('Writing files...').start();
|
|
90
|
+
await this.writeFiles(jenkinsfile, credentialsGuide, readme, config);
|
|
91
|
+
writingSpinner.succeed('Files written successfully');
|
|
92
|
+
this.displaySummary(config);
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
console.error(chalk_1.default.red('\n❌ Error:'), error);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async writeFiles(jenkinsfile, credentialsGuide, readme, config) {
|
|
99
|
+
const rootDir = process.cwd();
|
|
100
|
+
const cicdDir = path.join(rootDir, '.cicd');
|
|
101
|
+
await fs.ensureDir(cicdDir);
|
|
102
|
+
const jenkinsfilePath = path.join(rootDir, 'Jenkinsfile');
|
|
103
|
+
await fs.writeFile(jenkinsfilePath, jenkinsfile);
|
|
104
|
+
const credentialsPath = path.join(cicdDir, 'CREDENTIALS_SETUP.md');
|
|
105
|
+
await fs.writeFile(credentialsPath, credentialsGuide);
|
|
106
|
+
const readmePath = path.join(cicdDir, 'README.md');
|
|
107
|
+
await fs.writeFile(readmePath, readme);
|
|
108
|
+
const configPath = path.join(cicdDir, 'config.encrypted.json');
|
|
109
|
+
const encryptedConfig = this.securityService.encryptCredentials(config);
|
|
110
|
+
await fs.writeFile(configPath, JSON.stringify({ encrypted: encryptedConfig }, null, 2));
|
|
111
|
+
const gitignorePath = path.join(cicdDir, '.gitignore');
|
|
112
|
+
await fs.writeFile(gitignorePath, 'config.encrypted.json\n*.log\n');
|
|
113
|
+
console.log(chalk_1.default.green('\n📁 Generated files:'));
|
|
114
|
+
console.log(chalk_1.default.gray(` ├─ Jenkinsfile (${jenkinsfilePath})`));
|
|
115
|
+
console.log(chalk_1.default.gray(` ├─ .cicd/CREDENTIALS_SETUP.md`));
|
|
116
|
+
console.log(chalk_1.default.gray(` ├─ .cicd/README.md`));
|
|
117
|
+
console.log(chalk_1.default.gray(` └─ .cicd/config.encrypted.json`));
|
|
118
|
+
}
|
|
119
|
+
displaySummary(config) {
|
|
120
|
+
console.log(chalk_1.default.green.bold('\n✅ CICD Pipeline Generated Successfully!\n'));
|
|
121
|
+
console.log(chalk_1.default.cyan('📋 Configuration Summary:'));
|
|
122
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
123
|
+
console.log(chalk_1.default.white(` Project: ${config.project.projectName}`));
|
|
124
|
+
console.log(chalk_1.default.white(` Type: ${config.project.projectType}`));
|
|
125
|
+
console.log(chalk_1.default.white(` Language: ${config.project.language}`));
|
|
126
|
+
console.log(chalk_1.default.white(` Repository: ${config.project.repository}`));
|
|
127
|
+
console.log(chalk_1.default.white(` Branch: ${config.project.branch}`));
|
|
128
|
+
console.log(chalk_1.default.white(` Cloud: ${config.cloud.provider.toUpperCase()}`));
|
|
129
|
+
console.log(chalk_1.default.white(` Region: ${config.cloud.region}`));
|
|
130
|
+
console.log(chalk_1.default.white(` Instance: ${config.cloud.instanceType}`));
|
|
131
|
+
console.log(chalk_1.default.white(` Tests: ${config.project.runTests ? 'Enabled' : 'Disabled'}`));
|
|
132
|
+
console.log(chalk_1.default.white(` Auto-scaling: ${config.cloud.deploymentConfig.autoScaling ? 'Enabled' : 'Disabled'}`));
|
|
133
|
+
console.log(chalk_1.default.gray('─'.repeat(60)));
|
|
134
|
+
console.log(chalk_1.default.yellow('\n📝 Next Steps:\n'));
|
|
135
|
+
console.log(chalk_1.default.white(' 1. Review the generated Jenkinsfile in your project root'));
|
|
136
|
+
console.log(chalk_1.default.white(' 2. Read .cicd/CREDENTIALS_SETUP.md for Jenkins credential setup'));
|
|
137
|
+
console.log(chalk_1.default.white(' 3. Configure Jenkins credentials as specified'));
|
|
138
|
+
console.log(chalk_1.default.white(' 4. Create a new Jenkins Pipeline job'));
|
|
139
|
+
console.log(chalk_1.default.white(' 5. Point Jenkins to your repository'));
|
|
140
|
+
console.log(chalk_1.default.white(' 6. Run the pipeline and monitor deployment'));
|
|
141
|
+
console.log(chalk_1.default.yellow('\n⚠️ Important Security Notes:\n'));
|
|
142
|
+
console.log(chalk_1.default.red(' • NEVER commit .cicd/config.encrypted.json to version control'));
|
|
143
|
+
console.log(chalk_1.default.red(' • Always use Jenkins credential storage for sensitive data'));
|
|
144
|
+
console.log(chalk_1.default.red(' • Review and rotate credentials regularly'));
|
|
145
|
+
console.log(chalk_1.default.red(' • Keep your Jenkinsfile in version control'));
|
|
146
|
+
console.log(chalk_1.default.cyan('\n🚀 Your CI/CD pipeline is ready for deployment!\n'));
|
|
147
|
+
console.log(chalk_1.default.gray(`For detailed documentation, check .cicd/README.md\n`));
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
exports.CICDGeneratorService = CICDGeneratorService;
|
|
151
|
+
exports.CICDGeneratorService = CICDGeneratorService = __decorate([
|
|
152
|
+
(0, common_1.Injectable)(),
|
|
153
|
+
__metadata("design:paramtypes", [prompt_service_1.PromptService,
|
|
154
|
+
jenkinsfile_service_1.JenkinsFileService,
|
|
155
|
+
security_service_1.SecurityService,
|
|
156
|
+
validation_service_1.ValidationService])
|
|
157
|
+
], CICDGeneratorService);
|
|
158
|
+
//# sourceMappingURL=cicd-generator.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cicd-generator.service.js","sourceRoot":"","sources":["../../src/services/cicd-generator.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CloudConfig } from '../interfaces/config.interface';
|
|
2
|
+
export declare class CloudProviderService {
|
|
3
|
+
generateAWSDeploymentScript(config: CloudConfig, dockerImageName: string): string;
|
|
4
|
+
generateAzureDeploymentScript(config: CloudConfig, dockerImageName: string): string;
|
|
5
|
+
generateGCPDeploymentScript(config: CloudConfig, dockerImageName: string): string;
|
|
6
|
+
generateDigitalOceanDeploymentScript(config: CloudConfig, dockerImageName: string): string;
|
|
7
|
+
generateDeploymentScript(config: CloudConfig, dockerImageName: string): string;
|
|
8
|
+
generateCredentialsEnvironmentVariables(config: CloudConfig): string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.CloudProviderService = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let CloudProviderService = class CloudProviderService {
|
|
12
|
+
generateAWSDeploymentScript(config, dockerImageName) {
|
|
13
|
+
const { region, deploymentConfig } = config;
|
|
14
|
+
return `
|
|
15
|
+
#AWS Deployment Configuration
|
|
16
|
+
aws configure set aws_access_key_id \${AWS_ACCESS_KEY_ID}
|
|
17
|
+
aws configure set aws_secret_access_key \${AWS_SECRET_ACCESS_KEY}
|
|
18
|
+
aws configure set region ${region}
|
|
19
|
+
|
|
20
|
+
#Create/Updateb ECS Cluster
|
|
21
|
+
aws ecs create-cluster --cluster-name ${dockerImageName}-cluster || true
|
|
22
|
+
|
|
23
|
+
#Register Task Definition
|
|
24
|
+
cat >task-definition.json << EOF
|
|
25
|
+
{
|
|
26
|
+
"family": "${dockerImageName}",
|
|
27
|
+
"networkMode": "awsvpc",
|
|
28
|
+
"requiresCompatibility": ["FARGATE"],
|
|
29
|
+
"cpu": "256",
|
|
30
|
+
"memory": "512",
|
|
31
|
+
"containerDefinitions": [
|
|
32
|
+
{
|
|
33
|
+
"name": "${dockerImageName}",
|
|
34
|
+
"image": "${dockerImageName}",
|
|
35
|
+
"portMappings": [
|
|
36
|
+
{
|
|
37
|
+
"containerPort": ${deploymentConfig.port},
|
|
38
|
+
"protocol": "tcp"
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"logConfiguration": {
|
|
42
|
+
"logDriver": "awslogs",
|
|
43
|
+
"options": {
|
|
44
|
+
"awslogs-group": "/ecs/${dockerImageName}",
|
|
45
|
+
"awslogs-region": "${region}",
|
|
46
|
+
"awslogs-stream-prefix": "ecs"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"healthCheck": {
|
|
51
|
+
"command": ["CMD-SHELL", "curl -f http://localhost:${deploymentConfig.port}${deploymentConfig.healthCheckPath} || exit 1"],
|
|
52
|
+
"interval": 30,
|
|
53
|
+
"timeout": 5,
|
|
54
|
+
"retries": 3
|
|
55
|
+
}
|
|
56
|
+
}]
|
|
57
|
+
}
|
|
58
|
+
EOF
|
|
59
|
+
|
|
60
|
+
aws ecs register-task-definition --cli-input-json file://task-definition.json
|
|
61
|
+
|
|
62
|
+
#Create or Update Service
|
|
63
|
+
|
|
64
|
+
if[ "\$SERVICE_EXISTS" != "ACTIVE" ]; then
|
|
65
|
+
aws ecs create-service \\
|
|
66
|
+
--cluster ${dockerImageName}-cluster \\
|
|
67
|
+
--service-name ${dockerImageName}-service \\
|
|
68
|
+
--task-definition ${dockerImageName} \\
|
|
69
|
+
--desired-count ${deploymentConfig.minInstances || 1} \\
|
|
70
|
+
--launch-type FARGATE \\
|
|
71
|
+
--network-configuration "awsvpcConfiguration={subnets=[\${SUBNET_IDS}], securityGroups=[\${SECURITY_GROUP_IDS}], assignPublicIp=ENABLED}"
|
|
72
|
+
else
|
|
73
|
+
aws ecs update-service \\
|
|
74
|
+
--cluster ${dockerImageName}-cluster \\
|
|
75
|
+
--service ${dockerImageName}-service \\
|
|
76
|
+
--task-definition ${dockerImageName} \\
|
|
77
|
+
--force-new-deployment
|
|
78
|
+
fi
|
|
79
|
+
|
|
80
|
+
echo "AWS deployment completed successfully"
|
|
81
|
+
|
|
82
|
+
`;
|
|
83
|
+
}
|
|
84
|
+
generateAzureDeploymentScript(config, dockerImageName) {
|
|
85
|
+
const { deploymentConfig } = config;
|
|
86
|
+
return `
|
|
87
|
+
# Azure Deployment Configuration
|
|
88
|
+
az login --service-principal \\
|
|
89
|
+
-u \${AZURE_CLIENT_ID} \\
|
|
90
|
+
-p \${AZURE_CLIENT_SECRET} \\
|
|
91
|
+
--tenant \${AZURE_TENANT_ID}
|
|
92
|
+
|
|
93
|
+
az account set --subscription \${AZURE_SUBSCRIPTION_ID}
|
|
94
|
+
|
|
95
|
+
# Create Resource Group
|
|
96
|
+
az group create --name \${RESOURCE_GROUP_NAME} --location \${REGION}
|
|
97
|
+
|
|
98
|
+
# Create Container Instance
|
|
99
|
+
az container create \\
|
|
100
|
+
--resource-group \${RESOURCE_GROUP} \\
|
|
101
|
+
--name ${dockerImageName} \\
|
|
102
|
+
--image \${DOCKER_IMAGE} \\
|
|
103
|
+
--cpu 1 \\
|
|
104
|
+
--memory 1.5 \\
|
|
105
|
+
--registry-login-server \${ACR_LOGIN_SERVER} \\
|
|
106
|
+
--registry-username \${ACR_USERNAME} \\
|
|
107
|
+
--registry-password \${ACR_PASSWORD} \\
|
|
108
|
+
--dns-name-label ${dockerImageName} \\
|
|
109
|
+
--ports ${deploymentConfig.port}
|
|
110
|
+
--environment-variables NODE_ENV=production \\
|
|
111
|
+
--restart-policy Always
|
|
112
|
+
|
|
113
|
+
echo "Azure deployment completed successfully"
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
generateGCPDeploymentScript(config, dockerImageName) {
|
|
117
|
+
const { region, deploymentConfig } = config;
|
|
118
|
+
return `
|
|
119
|
+
# GCP Deployment Configuration
|
|
120
|
+
gcloud auth activate-service-account --key-file=\${GCP_KEY_FILE}
|
|
121
|
+
gcloud config set project \${GCP_PROJECT_ID}
|
|
122
|
+
gcloud config set compute/region ${region}
|
|
123
|
+
|
|
124
|
+
# Deploy to Cloud Run
|
|
125
|
+
gcloud run deploy ${dockerImageName} \\
|
|
126
|
+
--image \${DOCKER_IMAGE} \\
|
|
127
|
+
--platform managed \\
|
|
128
|
+
--region ${region} \\
|
|
129
|
+
--allow-unauthenticated
|
|
130
|
+
--port ${deploymentConfig.port} \\
|
|
131
|
+
--memory 512Mi \\
|
|
132
|
+
--cpu 1 \\
|
|
133
|
+
--min-instances ${deploymentConfig.minInstances || 0} \\
|
|
134
|
+
--max-instances ${deploymentConfig.maxInstances || 1} \\
|
|
135
|
+
--set-env-vars NODE_ENV=production
|
|
136
|
+
|
|
137
|
+
echo "GCP deployment completed successfully"
|
|
138
|
+
`;
|
|
139
|
+
}
|
|
140
|
+
generateDigitalOceanDeploymentScript(config, dockerImageName) {
|
|
141
|
+
const { region, deploymentConfig } = config;
|
|
142
|
+
return `
|
|
143
|
+
# DigitalOcean Deployment Configuration
|
|
144
|
+
doctl auth init --access-token \${DO_API_TOKEN}
|
|
145
|
+
|
|
146
|
+
#Create App Platform APP
|
|
147
|
+
cat > app-spec.yaml << EOF
|
|
148
|
+
name: ${dockerImageName}
|
|
149
|
+
region: ${region}
|
|
150
|
+
services:
|
|
151
|
+
- name: ${dockerImageName}
|
|
152
|
+
image:
|
|
153
|
+
registry-type: DOCKER_HUB
|
|
154
|
+
repository: \${DOCKER_IMAGE}
|
|
155
|
+
http_port: ${deploymentConfig.port}
|
|
156
|
+
instance_count: ${deploymentConfig.minInstances || 1}
|
|
157
|
+
instance_size_slug: basic-xxs
|
|
158
|
+
health-check:
|
|
159
|
+
http_path: ${deploymentConfig.healthCheckPath}
|
|
160
|
+
routes:
|
|
161
|
+
- path: /
|
|
162
|
+
|
|
163
|
+
EOF
|
|
164
|
+
|
|
165
|
+
# Create or update app
|
|
166
|
+
|
|
167
|
+
APP_ID=\$(doctl apps list --format ID --no-header | head -n 1)
|
|
168
|
+
|
|
169
|
+
if [ -z "\$APP_ID" ]; then
|
|
170
|
+
doctl apps create --spec app-spec.yaml
|
|
171
|
+
else
|
|
172
|
+
doctl apps update \$APP_ID --spec app-spec.yaml
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
echo "DigitalOcean deployment completed successfully
|
|
176
|
+
`;
|
|
177
|
+
}
|
|
178
|
+
generateDeploymentScript(config, dockerImageName) {
|
|
179
|
+
switch (config.provider) {
|
|
180
|
+
case 'aws':
|
|
181
|
+
return this.generateAWSDeploymentScript(config, dockerImageName);
|
|
182
|
+
case 'azure':
|
|
183
|
+
return this.generateAzureDeploymentScript(config, dockerImageName);
|
|
184
|
+
case 'gcp':
|
|
185
|
+
return this.generateGCPDeploymentScript(config, dockerImageName);
|
|
186
|
+
case 'digitalocean':
|
|
187
|
+
return this.generateDigitalOceanDeploymentScript(config, dockerImageName);
|
|
188
|
+
default:
|
|
189
|
+
throw new Error(`Unsupported cloud provider: ${config.provider}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
generateCredentialsEnvironmentVariables(config) {
|
|
193
|
+
const { provider, credentials } = config;
|
|
194
|
+
switch (provider) {
|
|
195
|
+
case 'aws':
|
|
196
|
+
return `
|
|
197
|
+
environment {
|
|
198
|
+
AWS_ACCESS_KEY_ID = credentials('aws-access-key-id')
|
|
199
|
+
AWS_SECRET_ACCESS_KEY = credentials('aws-secret-access-key')
|
|
200
|
+
AWS_REGION = '${credentials['aws-region']}'
|
|
201
|
+
}`;
|
|
202
|
+
case 'azure':
|
|
203
|
+
return `
|
|
204
|
+
environment {
|
|
205
|
+
AZURE_CLIENT_ID = credentials('azure-client-id')
|
|
206
|
+
AZURE_CLIENT_SECRET = credentials('azure-client-secret')
|
|
207
|
+
AZURE_TENANT_ID = credentials('azure-tenant-id')
|
|
208
|
+
AZURE_SUBSCRIPTION_ID = credentials('azure-subscription-id')
|
|
209
|
+
}`;
|
|
210
|
+
case 'gcp':
|
|
211
|
+
return `
|
|
212
|
+
environment {
|
|
213
|
+
GCP_PROJECT_ID = credentials('gcp-project-id')
|
|
214
|
+
GCP_KEY_FILE = credentials('gcp-key-file')
|
|
215
|
+
}`;
|
|
216
|
+
case 'digitalocean':
|
|
217
|
+
return `
|
|
218
|
+
environment {
|
|
219
|
+
DO_API_TOKEN = credentials('do-api-token')
|
|
220
|
+
}`;
|
|
221
|
+
default:
|
|
222
|
+
return '';
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
exports.CloudProviderService = CloudProviderService;
|
|
227
|
+
exports.CloudProviderService = CloudProviderService = __decorate([
|
|
228
|
+
(0, common_1.Injectable)()
|
|
229
|
+
], CloudProviderService);
|
|
230
|
+
//# sourceMappingURL=cloud-provider.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cloud-provider.service.js","sourceRoot":"","sources":["../../src/services/cloud-provider.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { CICDConfig } from '../interfaces/config.interface';
|
|
2
|
+
import { CloudProviderService } from './cloud-provider.service';
|
|
3
|
+
import { NotificationService } from './notification.service';
|
|
4
|
+
import { SecurityService } from './security.service';
|
|
5
|
+
export declare class JenkinsFileService {
|
|
6
|
+
private readonly cloudProvider;
|
|
7
|
+
private readonly notificationService;
|
|
8
|
+
private readonly securityService;
|
|
9
|
+
constructor(cloudProvider: CloudProviderService, notificationService: NotificationService, securityService: SecurityService);
|
|
10
|
+
generateJenkinsfile(config: CICDConfig): string;
|
|
11
|
+
private generateTestStage;
|
|
12
|
+
generateCredentialsSetupGuide(config: CICDConfig): string;
|
|
13
|
+
generateReadme(config: CICDConfig): string;
|
|
14
|
+
}
|