projen-pipelines 0.0.1 → 0.0.3

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/README.md CHANGED
@@ -1 +1,154 @@
1
- # replace this
1
+ # Projen Pipelines
2
+
3
+ [![npm version](https://badge.fury.io/js/projen-pipelines.svg)](https://www.npmjs.com/package/projen-pipelines)
4
+
5
+
6
+ Projen Pipelines is a projen library that provides high-level abstractions for defining continuous delivery (CD) pipelines for AWS CDK applications.
7
+ It is specifically designed to work with the projen project configuration engine.
8
+
9
+ This library provides high-level abstractions for defining multi-environment and multi-account AWS CDK applications with ease.
10
+ With this library, you can handle complex deployment scenarios with less code and manage your AWS infrastructure in a more efficient and straightforward way.
11
+
12
+ ## Getting Started
13
+
14
+ ### Installation
15
+
16
+ To install the package, add the package `projen-pipelines` to your projects devDeps in your projen configuration file.
17
+
18
+
19
+ After installing the package, you can import and use the constructs to define your CDK Pipelines.
20
+
21
+ ### Usage
22
+
23
+ You can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:
24
+
25
+ ```typescript
26
+ import { awscdk } from 'projen';
27
+ import { CDKPipeline, CDKPipelineOptions } from 'projen-pipelines';
28
+
29
+ // Define your AWS CDK TypeScript App
30
+ const app = new awscdk.AwsCdkTypeScriptApp({
31
+ cdkVersion: '2.80.0',
32
+ name: 'my-awesome-app',
33
+ defaultReleaseBranch: 'main',
34
+ devDeps: [
35
+ 'projen-pipelines',
36
+ ],
37
+ });
38
+
39
+ // Create the pipeline
40
+ new CDKPipeline(app, {
41
+ stackPrefix: 'MyApp',
42
+ pkgNamespace: '@company-assemblies',
43
+ environments: {
44
+ dev: { account: '111111111111', region: 'eu-central-1' },
45
+ prod: { account: '222222222222', region: 'eu-central-1' },
46
+ },
47
+ });
48
+ ```
49
+
50
+ After running projen (`npx projen`) a new file called `src/app.ts` will be created and contain a specialized CDK App class for your project.
51
+
52
+ You can then use this in your `main.ts` to configure your deployment.
53
+
54
+ ```typescript
55
+ import { PipelineApp } from './app';
56
+ import { BackendStack } from './stack';
57
+
58
+ const app = new PipelineApp({
59
+ provideDevStack: (scope, id, props) => {
60
+ return new BackendStack(scope, id, {
61
+ ...props,
62
+ apiHostname: 'api-dev',
63
+ myConfigSetting: 'value-for-dev',
64
+ });
65
+ },
66
+ provideProdStack: (scope, id, props) => {
67
+ return new BackendStack(scope, id, {
68
+ ...props,
69
+ apiHostname: 'api',
70
+ myConfigSetting: 'value-for-prod',
71
+ });
72
+ },
73
+ providePersonalStack: (scope, id, props) => {
74
+ return new BackendStack(scope, id, {
75
+ ...props,
76
+ apiHostname: `api-${props.stageName}`,
77
+ myConfigSetting: 'value-for-personal-stage',
78
+ });
79
+ },
80
+ });
81
+
82
+ app.synth();
83
+ ```
84
+
85
+ ### Deployment
86
+
87
+ The `CDKPipeline` class creates and adds several tasks to the projen project that then can be used in your pipeline to deploy your application to AWS.
88
+
89
+ Here's a brief description of each one:
90
+
91
+ 1. **deploy:personal** - This task deploys the application's personal stage, which is a distinct, isolated deployment of the application. The personal stage is intended for personal use, such as testing and development.
92
+
93
+ 2. **watch:personal** - This task deploys the personal stage of the application in watch mode. In this mode, the AWS CDK monitors your application source files for changes, automatically re-synthesizing and deploying when it detects any changes.
94
+
95
+ 3. **diff:personal** - This task compares the deployed personal stage with the current state of the application code. It's used to understand what changes would be made if the application were deployed.
96
+
97
+ 4. **destroy:personal** - This task destroys the resources created for the personal stage of the application.
98
+
99
+ 5. **deploy:feature** - This task deploys the application's feature stage. The feature stage is used for new features testing before these are merged into the main branch.
100
+
101
+ 6. **diff:feature** - This task is similar to `diff:personal`, but for the feature stage.
102
+
103
+ 7. **destroy:feature** - This task destroys the resources created for the feature stage of the application.
104
+
105
+ 8. **deploy:<stageName>** - This task deploys a specific stage of the application (like 'dev' or 'prod').
106
+
107
+ 9. **diff:<stageName>** - This task compares the specified application stage with the current state of the application code.
108
+
109
+ 10. **publish:assets** - This task publishes the CDK assets to all accounts. This is useful when the CDK application uses assets like Docker images or files from the S3 bucket.
110
+
111
+ 11. **bump** - This task bumps the version based on the latest git tag and pushes the updated tag to the git repository.
112
+
113
+ 12. **release:push-assembly** - This task creates a manifest, bumps the version without creating a git tag, and publishes the cloud assembly to your registry.
114
+
115
+ Remember that these tasks are created and managed automatically by the `CDKPipeline` class. You can run these tasks using the `npx projen TASK_NAME` command.
116
+
117
+
118
+ ## Contributing
119
+
120
+ We welcome all contributions to Projen Pipelines! Here's how you can get started:
121
+
122
+ 1. **Fork the Repository**: Click the 'Fork' button at the top right of this page to duplicate this repository in your GitHub account.
123
+
124
+ 2. **Clone your Fork**: Clone the forked repository to your local machine.
125
+
126
+ ```bash
127
+ git clone https://github.com/<your_username>/projen-pipelines.git
128
+ ```
129
+
130
+ 3. **Create a Branch**: To keep your work organized, create a branch for your contribution.
131
+
132
+ ```bash
133
+ git checkout -b my-branch
134
+ ```
135
+
136
+ 4. **Make your Changes**: Make your changes, additions, or fixes to the codebase. Remember to follow the existing code style.
137
+
138
+ 5. **Test your Changes**: Before committing your changes, make sure to test them to ensure they work as expected and do not introduce bugs.
139
+
140
+ 6. **Commit your Changes**: Commit your changes with a descriptive commit message using conventional commit messages.
141
+
142
+ ```bash
143
+ git commit -m "feat: Your descriptive commit message"
144
+ ```
145
+
146
+ 7. **Push to your Fork**: Push your commits to the branch in your forked repository.
147
+
148
+ ```bash
149
+ git push origin my-branch
150
+ ```
151
+
152
+ 8. **Submit a Pull Request**: Once your changes are ready to be reviewed, create a pull request from your forked repository's branch into the `main` branch of this repository.
153
+
154
+ Your pull request will be reviewed and hopefully merged quickly. Thanks for contributing!
@@ -0,0 +1,22 @@
1
+ import { awscdk } from 'projen';
2
+ import { CDKPipeline, CDKPipelineOptions, Environment } from '../pipeline';
3
+ export interface SynthStageOptions {
4
+ readonly commands: string[];
5
+ }
6
+ export interface AssetUploadStageOptions {
7
+ readonly commands: string[];
8
+ }
9
+ export interface DeployStageOptions {
10
+ readonly stageName: string;
11
+ readonly commands: string[];
12
+ readonly env: Environment;
13
+ }
14
+ export declare abstract class BaseEngine {
15
+ protected app: awscdk.AwsCdkTypeScriptApp;
16
+ protected props: CDKPipelineOptions;
17
+ protected pipeline: CDKPipeline;
18
+ constructor(app: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions, pipeline: CDKPipeline);
19
+ abstract createSynth(options: SynthStageOptions): void;
20
+ abstract createAssetUpload(options: AssetUploadStageOptions): void;
21
+ abstract createDeployment(options: DeployStageOptions): void;
22
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BaseEngine = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ class BaseEngine {
7
+ constructor(app, props, pipeline) {
8
+ this.app = app;
9
+ this.props = props;
10
+ this.pipeline = pipeline;
11
+ }
12
+ }
13
+ _a = JSII_RTTI_SYMBOL_1;
14
+ BaseEngine[_a] = { fqn: "projen-pipelines.BaseEngine", version: "0.0.3" };
15
+ exports.BaseEngine = BaseEngine;
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmdpbmUvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWlCQSxNQUFzQixVQUFVO0lBQzlCLFlBQXNCLEdBQStCLEVBQVksS0FBeUIsRUFBWSxRQUFxQjtRQUFyRyxRQUFHLEdBQUgsR0FBRyxDQUE0QjtRQUFZLFVBQUssR0FBTCxLQUFLLENBQW9CO1FBQVksYUFBUSxHQUFSLFFBQVEsQ0FBYTtJQUczSCxDQUFDOzs7O0FBSm1CLGdDQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXdzY2RrIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IENES1BpcGVsaW5lLCBDREtQaXBlbGluZU9wdGlvbnMsIEVudmlyb25tZW50IH0gZnJvbSAnLi4vcGlwZWxpbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN5bnRoU3RhZ2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgY29tbWFuZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VXBsb2FkU3RhZ2VPcHRpb25zIHtcbiAgcmVhZG9ubHkgY29tbWFuZHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveVN0YWdlT3B0aW9ucyB7XG4gIHJlYWRvbmx5IHN0YWdlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBjb21tYW5kczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGVudjogRW52aXJvbm1lbnQ7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRW5naW5lIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGFwcDogYXdzY2RrLkF3c0Nka1R5cGVTY3JpcHRBcHAsIHByb3RlY3RlZCBwcm9wczogQ0RLUGlwZWxpbmVPcHRpb25zLCBwcm90ZWN0ZWQgcGlwZWxpbmU6IENES1BpcGVsaW5lKSB7XG5cblxuICB9XG5cbiAgYWJzdHJhY3QgY3JlYXRlU3ludGgob3B0aW9uczogU3ludGhTdGFnZU9wdGlvbnMpOiB2b2lkO1xuICBhYnN0cmFjdCBjcmVhdGVBc3NldFVwbG9hZChvcHRpb25zOiBBc3NldFVwbG9hZFN0YWdlT3B0aW9ucyk6IHZvaWQ7XG4gIGFic3RyYWN0IGNyZWF0ZURlcGxveW1lbnQob3B0aW9uczogRGVwbG95U3RhZ2VPcHRpb25zKTogdm9pZDtcblxufSJdfQ==
@@ -0,0 +1,22 @@
1
+ import { awscdk } from 'projen';
2
+ import { AssetUploadStageOptions, BaseEngine, DeployStageOptions, SynthStageOptions } from './base';
3
+ import { CDKPipeline, CDKPipelineOptions } from '../pipeline';
4
+ export interface RoleMap {
5
+ readonly feature?: string;
6
+ readonly dev?: string;
7
+ readonly prod?: string;
8
+ }
9
+ export interface GithubEngineConfig {
10
+ readonly defaultAwsRoleArn?: string;
11
+ readonly awsRoleArnForSynth?: string;
12
+ readonly awsRoleArnForAssetPublishing?: string;
13
+ readonly awsRoleArnForDeployment?: RoleMap;
14
+ }
15
+ export declare class GitHubEngine extends BaseEngine {
16
+ private deploymentWorkflow;
17
+ private deploymentStages;
18
+ constructor(app: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions, pipeline: CDKPipeline);
19
+ createSynth(options: SynthStageOptions): void;
20
+ createAssetUpload(options: AssetUploadStageOptions): void;
21
+ createDeployment(options: DeployStageOptions): void;
22
+ }
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.GitHubEngine = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const workflows_model_1 = require("projen/lib/github/workflows-model");
7
+ const base_1 = require("./base");
8
+ class GitHubEngine extends base_1.BaseEngine {
9
+ constructor(app, props, pipeline) {
10
+ super(app, props, pipeline);
11
+ this.deploymentStages = [];
12
+ this.deploymentWorkflow = this.app.github.addWorkflow('deploy');
13
+ this.deploymentWorkflow.on({
14
+ push: {
15
+ branches: ['main'], // TODO use defaultReleaseBranch
16
+ },
17
+ workflowDispatch: {},
18
+ });
19
+ }
20
+ createSynth(options) {
21
+ const steps = [{
22
+ name: 'Checkout',
23
+ uses: 'actions/checkout@v2',
24
+ env: {
25
+ CI: 'true',
26
+ },
27
+ }];
28
+ if (this.props.githubConfig?.awsRoleArnForSynth) {
29
+ steps.push({
30
+ name: 'AWS Credentials',
31
+ uses: 'aws-actions/configure-aws-credentials@master',
32
+ with: {
33
+ 'role-to-assume': this.props.githubConfig.awsRoleArnForSynth,
34
+ 'role-session-name': 'GitHubAction',
35
+ 'aws-region': 'us-east-1',
36
+ },
37
+ });
38
+ }
39
+ steps.push(...options.commands.map(cmd => ({
40
+ run: cmd,
41
+ })));
42
+ this.deploymentWorkflow.addJob('synth', {
43
+ name: 'Synth CDK application',
44
+ runsOn: ['ubuntu-latest'],
45
+ permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: workflows_model_1.JobPermission.READ },
46
+ steps,
47
+ });
48
+ }
49
+ createAssetUpload(options) {
50
+ this.deploymentWorkflow.addJob('assetUpload', {
51
+ name: 'Publish assets to AWS',
52
+ needs: ['synth'],
53
+ runsOn: ['ubuntu-latest'],
54
+ permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: workflows_model_1.JobPermission.READ },
55
+ steps: [{
56
+ name: 'Checkout',
57
+ uses: 'actions/checkout@v2',
58
+ }, {
59
+ name: 'AWS Credentials',
60
+ uses: 'aws-actions/configure-aws-credentials@master',
61
+ with: {
62
+ 'role-to-assume': this.props.githubConfig?.awsRoleArnForAssetPublishing ?? this.props.githubConfig?.defaultAwsRoleArn,
63
+ 'role-session-name': 'GitHubAction',
64
+ 'aws-region': 'us-east-1',
65
+ },
66
+ },
67
+ ...options.commands.map(cmd => ({
68
+ run: cmd,
69
+ }))],
70
+ });
71
+ }
72
+ createDeployment(options) {
73
+ this.deploymentWorkflow.addJob(`deploy-${options.stageName}`, {
74
+ name: `Deploy stage ${options.stageName} to AWS`,
75
+ needs: this.deploymentStages.length > 0 ? ['assetUpload', `deploy-${this.deploymentStages.at(-1)}`] : ['assetUpload'],
76
+ runsOn: ['ubuntu-latest'],
77
+ permissions: { idToken: workflows_model_1.JobPermission.WRITE, contents: workflows_model_1.JobPermission.READ },
78
+ steps: [{
79
+ name: 'Checkout',
80
+ uses: 'actions/checkout@v2',
81
+ }, {
82
+ name: 'AWS Credentials',
83
+ uses: 'aws-actions/configure-aws-credentials@master',
84
+ with: {
85
+ 'role-to-assume': this.props.githubConfig?.awsRoleArnForDeployment?.[options.stageName] ?? this.props.githubConfig?.defaultAwsRoleArn,
86
+ 'role-session-name': 'GitHubAction',
87
+ 'aws-region': options.env.region,
88
+ },
89
+ },
90
+ ...options.commands.map(cmd => ({
91
+ run: cmd,
92
+ }))],
93
+ });
94
+ this.deploymentStages.push(options.stageName);
95
+ }
96
+ }
97
+ _a = JSII_RTTI_SYMBOL_1;
98
+ GitHubEngine[_a] = { fqn: "projen-pipelines.GitHubEngine", version: "0.0.3" };
99
+ exports.GitHubEngine = GitHubEngine;
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0aHViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2VuZ2luZS9naXRodWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSx1RUFBMkU7QUFDM0UsaUNBQW9HO0FBZ0JwRyxNQUFhLFlBQWEsU0FBUSxpQkFBVTtJQUsxQyxZQUFZLEdBQStCLEVBQUUsS0FBeUIsRUFBRSxRQUFxQjtRQUMzRixLQUFLLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUh0QixxQkFBZ0IsR0FBYSxFQUFFLENBQUM7UUFLdEMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ3pCLElBQUksRUFBRTtnQkFDSixRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxnQ0FBZ0M7YUFDckQ7WUFDRCxnQkFBZ0IsRUFBRSxFQUFFO1NBQ3JCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBMEI7UUFDM0MsTUFBTSxLQUFLLEdBQWMsQ0FBQztnQkFDeEIsSUFBSSxFQUFFLFVBQVU7Z0JBQ2hCLElBQUksRUFBRSxxQkFBcUI7Z0JBQzNCLEdBQUcsRUFBRTtvQkFDSCxFQUFFLEVBQUUsTUFBTTtpQkFDWDthQUNGLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDVCxJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixJQUFJLEVBQUUsOENBQThDO2dCQUNwRCxJQUFJLEVBQUU7b0JBQ0osZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsa0JBQWtCO29CQUM1RCxtQkFBbUIsRUFBRSxjQUFjO29CQUNu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T0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNO3FCQUNqQztpQkFDRjtnQkFDRCxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDOUIsR0FBRyxFQUFFLEdBQUc7aUJBQ1QsQ0FBQyxDQUFDLENBQUM7U0FDTCxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNoRCxDQUFDOzs7O0FBakdVLG9DQUFZIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXdzY2RrIH0gZnJvbSAncHJvamVuJztcbmltcG9ydCB7IEdpdGh1YldvcmtmbG93IH0gZnJvbSAncHJvamVuL2xpYi9naXRodWInO1xuaW1wb3J0IHsgSm9iUGVybWlzc2lvbiwgSm9iU3RlcCB9IGZyb20gJ3Byb2plbi9saWIvZ2l0aHViL3dvcmtmbG93cy1tb2RlbCc7XG5pbXBvcnQgeyBBc3NldFVwbG9hZFN0YWdlT3B0aW9ucywgQmFzZUVuZ2luZSwgRGVwbG95U3RhZ2VPcHRpb25zLCBTeW50aFN0YWdlT3B0aW9ucyB9IGZyb20gJy4vYmFzZSc7XG5pbXBvcnQgeyBDREtQaXBlbGluZSwgQ0RLUGlwZWxpbmVPcHRpb25zIH0gZnJvbSAnLi4vcGlwZWxpbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJvbGVNYXAge1xuICByZWFkb25seSBmZWF0dXJlPzogc3RyaW5nO1xuICByZWFkb25seSBkZXY/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHByb2Q/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0aHViRW5naW5lQ29uZmlnIHtcbiAgcmVhZG9ubHkgZGVmYXVsdEF3c1JvbGVBcm4/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF3c1JvbGVBcm5Gb3JTeW50aD86IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzUm9sZUFybkZvckFzc2V0UHVibGlzaGluZz86IHN0cmluZztcbiAgcmVhZG9ubHkgYXdzUm9sZUFybkZvckRlcGxveW1lbnQ/OiBSb2xlTWFwO1xufVxuXG5leHBvcnQgY2xhc3MgR2l0SHViRW5naW5lIGV4dGVuZHMgQmFzZUVuZ2luZSB7XG5cbiAgcHJpdmF0ZSBkZXBsb3ltZW50V29ya2Zsb3c6IEdpdGh1YldvcmtmbG93O1xuICBwcml2YXRlIGRlcGxveW1lbnRTdGFnZXM6IHN0cmluZ1tdID0gW107XG5cbiAgY29uc3RydWN0b3IoYXBwOiBhd3NjZGsuQXdzQ2RrVHlwZVNjcmlwdEFwcCwgcHJvcHM6IENES1BpcGVsaW5lT3B0aW9ucywgcGlwZWxpbmU6IENES1BpcGVsaW5lKSB7XG4gICAgc3VwZXIoYXBwLCBwcm9wcywgcGlwZWxpbmUpO1xuXG4gICAgdGhpcy5kZXBsb3ltZW50V29ya2Zsb3cgPSB0aGlzLmFwcC5naXRodWIhLmFkZFdvcmtmbG93KCdkZXBsb3knKTtcbiAgICB0aGlzLmRlcGxveW1lbnRXb3JrZmxvdy5vbih7XG4gICAgICBwdXNoOiB7XG4gICAgICAgIGJyYW5jaGVzOiBbJ21haW4nXSwgLy8gVE9ETyB1c2UgZGVmYXVsdFJlbGVhc2VCcmFuY2hcbiAgICAgIH0sXG4gICAgICB3b3JrZmxvd0Rpc3BhdGNoOiB7fSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVTeW50aChvcHRpb25zOiBTeW50aFN0YWdlT3B0aW9ucyk6IHZvaWQge1xuICAgIGNvbnN0IHN0ZXBzOiBKb2JTdGVwW10gPSBbe1xuICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHYyJyxcbiAgICAgIGVudjoge1xuICAgICAgICBDSTogJ3RydWUnLFxuICAgICAgfSxcbiAgICB9XTtcblxuICAgIGlmICh0aGlzLnByb3BzLmdpdGh1YkNvbmZpZz8uYXdzUm9sZUFybkZvclN5bnRoKSB7XG4gICAgICBzdGVwcy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ0FXUyBDcmVkZW50aWFscycsXG4gICAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQG1hc3RlcicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiB0aGlzLnByb3BzLmdpdGh1YkNvbmZpZy5hd3NSb2xlQXJuRm9yU3ludGgsXG4gICAgICAgICAgJ3JvbGUtc2Vzc2lvbi1uYW1lJzogJ0dpdEh1YkFjdGlvbicsXG4gICAgICAgICAgJ2F3cy1yZWdpb24nOiAndXMtZWFzdC0xJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN0ZXBzLnB1c2goLi4ub3B0aW9ucy5jb21tYW5kcy5tYXAoY21kID0+ICh7XG4gICAgICBydW46IGNtZCxcbiAgICB9KSkpO1xuXG4gICAgdGhpcy5kZXBsb3ltZW50V29ya2Zsb3cuYWRkSm9iKCdzeW50aCcsIHtcbiAgICAgIG5hbWU6ICdTeW50aCBDREsgYXBwbGljYXRpb24nLFxuICAgICAgcnVuc09uOiBbJ3VidW50dS1sYXRlc3QnXSxcbiAgICAgIHBlcm1pc3Npb25zOiB7IGlkVG9rZW46IEpvYlBlcm1pc3Npb24uV1JJVEUsIGNvbnRlbnRzOiBKb2JQZXJtaXNzaW9uLlJFQUQgfSxcbiAgICAgIHN0ZXBzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUFzc2V0VXBsb2FkKG9wdGlvbnM6IEFzc2V0VXBsb2FkU3RhZ2VPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5kZXBsb3ltZW50V29ya2Zsb3cuYWRkSm9iKCdhc3NldFVwbG9hZCcsIHtcbiAgICAgIG5hbWU6ICdQdWJsaXNoIGFzc2V0cyB0byBBV1MnLFxuICAgICAgbmVlZHM6IFsnc3ludGgnXSxcbiAgICAgIHJ1bnNPbjogWyd1YnVudHUtbGF0ZXN0J10sXG4gICAgICBwZXJtaXNzaW9uczogeyBpZFRva2VuOiBKb2JQZXJtaXNzaW9uLldSSVRFLCBjb250ZW50czogSm9iUGVybWlzc2lvbi5SRUFEIH0sXG4gICAgICBzdGVwczogW3tcbiAgICAgICAgbmFtZTogJ0NoZWNrb3V0JyxcbiAgICAgICAgdXNlczogJ2FjdGlvbnMvY2hlY2tvdXRAdjInLFxuICAgICAgfSwge1xuICAgICAgICBuYW1lOiAnQVdTIENyZWRlbnRpYWxzJyxcbiAgICAgICAgdXNlczogJ2F3cy1hY3Rpb25zL2NvbmZpZ3VyZS1hd3MtY3JlZGVudGlhbHNAbWFzdGVyJyxcbiAgICAgICAgd2l0aDoge1xuICAgICAgICAgICdyb2xlLXRvLWFzc3VtZSc6IHRoaXMucHJvcHMuZ2l0aHViQ29uZmlnPy5hd3NSb2xlQXJuRm9yQXNzZXRQdWJsaXNoaW5nID8/IHRoaXMucHJvcHMuZ2l0aHViQ29uZmlnPy5kZWZhdWx0QXdzUm9sZUFybixcbiAgICAgICAgICAncm9sZS1zZXNzaW9uLW5hbWUnOiAnR2l0SHViQWN0aW9uJyxcbiAgICAgICAgICAnYXdzLXJlZ2lvbic6ICd1cy1lYXN0LTEnLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC4uLm9wdGlvbnMuY29tbWFuZHMubWFwKGNtZCA9PiAoe1xuICAgICAgICBydW46IGNtZCxcbiAgICAgIH0pKV0sXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlRGVwbG95bWVudChvcHRpb25zOiBEZXBsb3lTdGFnZU9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmRlcGxveW1lbnRXb3JrZmxvdy5hZGRKb2IoYGRlcGxveS0ke29wdGlvbnMuc3RhZ2VOYW1lfWAsIHtcbiAgICAgIG5hbWU6IGBEZXBsb3kgc3RhZ2UgJHtvcHRpb25zLnN0YWdlTmFtZX0gdG8gQVdTYCxcbiAgICAgIG5lZWRzOiB0aGlzLmRlcGxveW1lbnRTdGFnZXMubGVuZ3RoID4gMCA/IFsnYXNzZXRVcGxvYWQnLCBgZGVwbG95LSR7dGhpcy5kZXBsb3ltZW50U3RhZ2VzLmF0KC0xKSF9YF0gOiBbJ2Fzc2V0VXBsb2FkJ10sXG4gICAgICBydW5zT246IFsndWJ1bnR1LWxhdGVzdCddLFxuICAgICAgcGVybWlzc2lvbnM6IHsgaWRUb2tlbjogSm9iUGVybWlzc2lvbi5XUklURSwgY29udGVudHM6IEpvYlBlcm1pc3Npb24uUkVBRCB9LFxuICAgICAgc3RlcHM6IFt7XG4gICAgICAgIG5hbWU6ICdDaGVja291dCcsXG4gICAgICAgIHVzZXM6ICdhY3Rpb25zL2NoZWNrb3V0QHYyJyxcbiAgICAgIH0sIHtcbiAgICAgICAgbmFtZTogJ0FXUyBDcmVkZW50aWFscycsXG4gICAgICAgIHVzZXM6ICdhd3MtYWN0aW9ucy9jb25maWd1cmUtYXdzLWNyZWRlbnRpYWxzQG1hc3RlcicsXG4gICAgICAgIHdpdGg6IHtcbiAgICAgICAgICAncm9sZS10by1hc3N1bWUnOiB0aGlzLnByb3BzLmdpdGh1YkNvbmZpZz8uYXdzUm9sZUFybkZvckRlcGxveW1lbnQ/LltvcHRpb25zLnN0YWdlTmFtZSBhcyBrZXlvZiBSb2xlTWFwXSA/PyB0aGlzLnByb3BzLmdpdGh1YkNvbmZpZz8uZGVmYXVsdEF3c1JvbGVBcm4sXG4gICAgICAgICAgJ3JvbGUtc2Vzc2lvbi1uYW1lJzogJ0dpdEh1YkFjdGlvbicsXG4gICAgICAgICAgJ2F3cy1yZWdpb24nOiBvcHRpb25zLmVudi5yZWdpb24sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgLi4ub3B0aW9ucy5jb21tYW5kcy5tYXAoY21kID0+ICh7XG4gICAgICAgIHJ1bjogY21kLFxuICAgICAgfSkpXSxcbiAgICB9KTtcbiAgICB0aGlzLmRlcGxveW1lbnRTdGFnZXMucHVzaChvcHRpb25zLnN0YWdlTmFtZSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1,2 @@
1
+ export * from './base';
2
+ export * from './github';
@@ -0,0 +1,19 @@
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./base"), exports);
18
+ __exportStar(require("./github"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZW5naW5lL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5Q0FBdUI7QUFDdkIsMkNBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9iYXNlJztcbmV4cG9ydCAqIGZyb20gJy4vZ2l0aHViJzsiXX0=
package/lib/index.d.ts CHANGED
@@ -1 +1,2 @@
1
1
  export * from './pipeline';
2
+ export * from './engine';
package/lib/index.js CHANGED
@@ -15,4 +15,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./pipeline"), exports);
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vcGlwZWxpbmUnOyJdfQ==
18
+ __exportStar(require("./engine"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDZDQUEyQjtBQUMzQiwyQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3BpcGVsaW5lJztcbmV4cG9ydCAqIGZyb20gJy4vZW5naW5lJzsiXX0=
package/lib/pipeline.d.ts CHANGED
@@ -1,26 +1,154 @@
1
1
  import { Component, awscdk } from 'projen';
2
+ import { BaseEngine, GithubEngineConfig } from './engine';
3
+ /**
4
+ * The Environment interface is designed to hold AWS related information
5
+ * for a specific deployment environment within your infrastructure.
6
+ * Each environment requires a specific account and region for its resources.
7
+ */
2
8
  export interface Environment {
9
+ /**
10
+ * The AWS Account ID associated with the environment. It's important because
11
+ * different services or features could have distinct permissions and settings
12
+ * in different accounts.
13
+ */
3
14
  readonly account: string;
15
+ /**
16
+ * The AWS Region for the environment. This determines where your resources
17
+ * are created and where your application will run. It can affect latency,
18
+ * availability, and pricing.
19
+ */
4
20
  readonly region: string;
5
21
  }
22
+ /**
23
+ * The EnvironmentMap interface is used to maintain a mapping of different types
24
+ * of environments used in the application. Each type of environment - personal,
25
+ * feature, dev, and prod, represents a different stage of development or usage.
26
+ */
6
27
  export interface EnvironmentMap {
28
+ /**
29
+ * The personal environment is usually used for individual development and
30
+ * testing, allowing developers to freely test and experiment without
31
+ * affecting the shared development environment.
32
+ */
7
33
  readonly personal: Environment;
34
+ /**
35
+ * The feature environment is typically used for developing specific features
36
+ * in isolation from the main codebase. This allows developers to work on
37
+ * individual features without impacting the stability of the dev or prod
38
+ * environments.
39
+ */
8
40
  readonly feature: Environment;
41
+ /**
42
+ * The dev environment is a shared environment where developers integrate
43
+ * their feature changes. It represents the latest version of the application
44
+ * but may not be as stable as the production environment.
45
+ */
9
46
  readonly dev: Environment;
47
+ /**
48
+ * The prod environment is where the live, user-facing application runs.
49
+ * It should be stable and only receive thoroughly tested changes.
50
+ */
10
51
  readonly prod: Environment;
11
52
  }
53
+ /**
54
+ * The CI/CD tooling used to run your pipeline.
55
+ * The component will render workflows for the given system
56
+ */
57
+ export declare enum PipelineEngine {
58
+ /** Create GitHub actions */
59
+ GITHUB = 0,
60
+ /** Create a .gitlab-ci.yaml file */
61
+ GITLAB = 1
62
+ }
63
+ /**
64
+ * Describes the type of pipeline that will be created
65
+ */
66
+ export declare enum DeploymentType {
67
+ /** Deploy every commit as far as possible; hopefully into production */
68
+ CONTINUOUS_DEPLOYMENT = 0,
69
+ /** Build every commit and prepare all assets for a later deployment */
70
+ CONTINUOUS_DELIVERY = 1
71
+ }
72
+ /**
73
+ * The CDKPipelineOptions interface is designed to provide configuration
74
+ * options for a CDK (Cloud Development Kit) pipeline. It allows the definition
75
+ * of settings such as the stack prefix and package namespace to be used in the
76
+ * AWS stack, along with the environments configuration to be used.
77
+ */
12
78
  export interface CDKPipelineOptions {
13
- readonly stackPrefix: string;
79
+ /**
80
+ * This field is used to define a prefix for the AWS Stack resources created
81
+ * during the pipeline's operation.
82
+ *
83
+ * @default project name
84
+ */
85
+ readonly stackPrefix?: string;
86
+ /**
87
+ * This field determines the NPM namespace to be used when packaging CDK cloud
88
+ * assemblies. A namespace helps group related resources together, providing
89
+ * better organization and ease of management.
90
+ */
14
91
  readonly pkgNamespace: string;
92
+ /**
93
+ * This is a map of environments to be used in the pipeline. It allows the
94
+ * pipeline to deploy to different environments based on the stage of the
95
+ * deployment process, whether that's a personal, feature, dev, or prod stage.
96
+ */
15
97
  readonly environments: EnvironmentMap;
98
+ /**
99
+ * This field specifies the type of pipeline to create. If set to CONTINUOUS_DEPLOYMENT,
100
+ * every commit is deployed as far as possible, hopefully into production. If set to
101
+ * CONTINUOUS_DELIVERY, every commit is built and all assets are prepared for a later deployment.
102
+ *
103
+ * @default CONTINUOUS_DELIVERY
104
+ */
105
+ readonly deploymentType?: DeploymentType;
106
+ /**
107
+ * This field determines the CI/CD tooling that will be used to run the pipeline. The component
108
+ * will render workflows for the given system. Options include GitHub and GitLab.
109
+ *
110
+ * @default - tries to derive it from the projects configuration
111
+ */
112
+ readonly engine?: PipelineEngine;
113
+ readonly githubConfig?: GithubEngineConfig;
114
+ readonly preInstallCommands?: string[];
115
+ readonly preSynthCommands?: string[];
116
+ readonly postSynthCommands?: string[];
16
117
  }
118
+ /**
119
+ * The CDKPipeline class extends the Component class and sets up the necessary configuration for deploying AWS CDK (Cloud Development Kit) applications across multiple stages.
120
+ * It also manages tasks such as publishing CDK assets, bumping version based on git tags, and cleaning up conflicting tasks.
121
+ */
17
122
  export declare class CDKPipeline extends Component {
18
123
  private app;
19
124
  private props;
125
+ readonly stackPrefix: string;
126
+ readonly engine: BaseEngine;
20
127
  constructor(app: awscdk.AwsCdkTypeScriptApp, props: CDKPipelineOptions);
128
+ private createSynthStage;
129
+ /**
130
+ * This method generates the entry point for the application, including interfaces and classes
131
+ * necessary to set up the pipeline and define the AWS CDK stacks for different environments.
132
+ */
21
133
  private createApplicationEntrypoint;
134
+ /**
135
+ * This method sets up tasks to publish CDK assets to all accounts and handle versioning, including bumping the version
136
+ * based on the latest git tag and pushing the CDK assembly to the package repository.
137
+ */
22
138
  private createReleaseTasks;
139
+ /**
140
+ * This method sets up tasks for the personal deployment stage, including deployment, watching for changes,
141
+ * comparing changes (diff), and destroying the stack when no longer needed.
142
+ */
23
143
  private createPersonalStage;
144
+ /**
145
+ * This method sets up tasks for the feature deployment stage, including deployment, comparing changes (diff),
146
+ * and destroying the stack when no longer needed.
147
+ */
24
148
  private createFeatureStage;
149
+ /**
150
+ * This method sets up tasks for the general pipeline stages (dev, prod), including deployment and comparing changes (diff).
151
+ * @param {string} stageName - The name of the stage (e.g., 'dev', 'prod')
152
+ */
25
153
  private createPipelineStage;
26
154
  }