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.
Files changed (52) hide show
  1. package/.prettierrc +4 -0
  2. package/README.md +365 -0
  3. package/dist/app.controller.d.ts +6 -0
  4. package/dist/app.controller.js +35 -0
  5. package/dist/app.controller.js.map +1 -0
  6. package/dist/app.controller.spec.d.ts +1 -0
  7. package/dist/app.controller.spec.js +21 -0
  8. package/dist/app.controller.spec.js.map +1 -0
  9. package/dist/app.module.d.ts +2 -0
  10. package/dist/app.module.js +35 -0
  11. package/dist/app.module.js.map +1 -0
  12. package/dist/app.service.d.ts +3 -0
  13. package/dist/app.service.js +20 -0
  14. package/dist/app.service.js.map +1 -0
  15. package/dist/cli.d.ts +2 -0
  16. package/dist/cli.js +32 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/index.d.ts +9 -0
  19. package/dist/index.js +26 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/interfaces/config.interface.d.ts +70 -0
  22. package/dist/interfaces/config.interface.js +3 -0
  23. package/dist/interfaces/config.interface.js.map +1 -0
  24. package/dist/main.d.ts +1 -0
  25. package/dist/main.js +3 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/services/cicd-generator.service.d.ts +14 -0
  28. package/dist/services/cicd-generator.service.js +158 -0
  29. package/dist/services/cicd-generator.service.js.map +1 -0
  30. package/dist/services/cloud-provider.service.d.ts +9 -0
  31. package/dist/services/cloud-provider.service.js +230 -0
  32. package/dist/services/cloud-provider.service.js.map +1 -0
  33. package/dist/services/jenkinsfile.service.d.ts +14 -0
  34. package/dist/services/jenkinsfile.service.js +414 -0
  35. package/dist/services/jenkinsfile.service.js.map +1 -0
  36. package/dist/services/notification.service.d.ts +10 -0
  37. package/dist/services/notification.service.js +235 -0
  38. package/dist/services/notification.service.js.map +1 -0
  39. package/dist/services/prompt.service.d.ts +16 -0
  40. package/dist/services/prompt.service.js +415 -0
  41. package/dist/services/prompt.service.js.map +1 -0
  42. package/dist/services/security.service.d.ts +9 -0
  43. package/dist/services/security.service.js +95 -0
  44. package/dist/services/security.service.js.map +1 -0
  45. package/dist/services/validation.service.d.ts +8 -0
  46. package/dist/services/validation.service.js +140 -0
  47. package/dist/services/validation.service.js.map +1 -0
  48. package/dist/tsconfig.tsbuildinfo +1 -0
  49. package/eslint.config.mjs +34 -0
  50. package/nest-cli.json +8 -0
  51. package/package.json +67 -0
  52. package/tsconfig.build.json +4 -0
package/dist/main.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};
package/dist/main.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=main.js.map
@@ -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
+ }