projen-pipelines 0.0.60 → 0.0.62

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/.jsii CHANGED
@@ -11,7 +11,7 @@
11
11
  "pipelines-release": "lib/release.js"
12
12
  },
13
13
  "bundled": {
14
- "standard-version": "^9.5.0"
14
+ "standard-version": "^9"
15
15
  },
16
16
  "dependencies": {
17
17
  "constructs": "^10.3.0",
@@ -88,7 +88,7 @@
88
88
  "stability": "stable"
89
89
  },
90
90
  "homepage": "https://github.com/taimos/projen-pipelines.git",
91
- "jsiiVersion": "1.98.0 (build 00b106d)",
91
+ "jsiiVersion": "5.4.18 (build db6e7f8)",
92
92
  "keywords": [
93
93
  "aws",
94
94
  "cdk"
@@ -104,7 +104,7 @@
104
104
  },
105
105
  "name": "projen-pipelines",
106
106
  "readme": {
107
- "markdown": "# Projen Pipelines\n\n[![npm version](https://badge.fury.io/js/projen-pipelines.svg)](https://www.npmjs.com/package/projen-pipelines)\n\n\nProjen Pipelines is a projen library that provides high-level abstractions for defining continuous delivery (CD) pipelines for AWS CDK applications.\nIt is specifically designed to work with the projen project configuration engine.\n\nThis library provides high-level abstractions for defining multi-environment and multi-account AWS CDK applications with ease.\nWith this library, you can handle complex deployment scenarios with less code and manage your AWS infrastructure in a more efficient and straightforward way.\n## How Projen Pipelines work\n![High level Projen Pipelines Overview](documentation/overview.png)\nUnder the hood, after you defined the pipeline and selected target engine that you want to work on, we are using code generation methods that will create - in your project - the required CI/CD pipeline.\n\nWe are considering to allow selecting multiple engines going forward - please let us know if this is a feature you would use or not!\n\n## Getting Started\n\n### Installation\n\nTo install the package, add the package `projen-pipelines` to your projects devDeps in your projen configuration file.\n\n\nAfter installing the package, you can import and use the constructs to define your CDK Pipelines.\n\n### Usage\n\nYou can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:\n\n```typescript\nimport { awscdk } from 'projen';\nimport { CDKPipeline, CDKPipelineOptions } from 'projen-pipelines';\n\n// Define your AWS CDK TypeScript App\nconst app = new awscdk.AwsCdkTypeScriptApp({\n cdkVersion: '2.80.0',\n name: 'my-awesome-app',\n defaultReleaseBranch: 'main',\n devDeps: [\n 'projen-pipelines',\n ],\n});\n\n// Create the pipeline\nnew GithubCDKPipeline(app, {\n stackPrefix: 'MyApp',\n pkgNamespace: '@company-assemblies',\n stages: [\n {\n name: 'dev',\n env: { account: '123456789012', region: 'eu-central-1' },\n }, {\n name: 'prod',\n manualApproval: true,\n env: {account: '123456789012', region: 'eu-central-1' },\n }],\n});\n```\n\nAfter running projen (`npx projen`) a new file called `src/app.ts` will be created and contain a specialized CDK App class for your project.\n\nYou can then use this in your `main.ts` to configure your deployment.\n\n```typescript\nimport { PipelineApp } from './app';\nimport { BackendStack } from './stack';\n\nconst app = new PipelineApp({\n provideDevStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: 'api-dev',\n myConfigSetting: 'value-for-dev',\n });\n },\n provideProdStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: 'api',\n myConfigSetting: 'value-for-prod',\n });\n },\n providePersonalStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: `api-${props.stageName}`,\n myConfigSetting: 'value-for-personal-stage',\n });\n },\n});\n\napp.synth();\n```\n\n### Deployment\n\nThe `<Engine>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.\n\nHere's a brief description of each one:\n\n1. **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.\n\n2. **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.\n\n3. **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.\n\n4. **destroy:personal** - This task destroys the resources created for the personal stage of the application.\n\n5. **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.\n\n6. **diff:feature** - This task is similar to `diff:personal`, but for the feature stage.\n\n7. **destroy:feature** - This task destroys the resources created for the feature stage of the application.\n\n8. **deploy:<stageName>** - This task deploys a specific stage of the application (like 'dev' or 'prod').\n\n9. **diff:<stageName>** - This task compares the specified application stage with the current state of the application code.\n\n10. **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.\n\n11. **bump** - This task bumps the version based on the latest git tag and pushes the updated tag to the git repository.\n\n12. **release:push-assembly** - This task creates a manifest, bumps the version without creating a git tag, and publishes the cloud assembly to your registry.\n\nRemember that these tasks are created and managed automatically by the `CDKPipeline` class. You can run these tasks using the `npx projen TASK_NAME` command.\n\n\n## Contributing\n### By raising feature requests or issues\nUse the Github integrated \"[Issues](https://github.com/taimos/projen-pipelines/issues/new)\" view to create an item that you would love to have added to our open source project.\n\n***No request is too big or too small*** - get your thoughts created and we'll get back to you if we have questions!\n\n\n### By committing code\n\nWe welcome all contributions to Projen Pipelines! Here's how you can get started:\n\n1. **Fork the Repository**: Click the 'Fork' button at the top right of this page to duplicate this repository in your GitHub account.\n\n2. **Clone your Fork**: Clone the forked repository to your local machine.\n\n```bash\ngit clone https://github.com/<your_username>/projen-pipelines.git\n```\n\n3. **Create a Branch**: To keep your work organized, create a branch for your contribution.\n\n```bash\ngit checkout -b my-branch\n```\n\n4. **Make your Changes**: Make your changes, additions, or fixes to the codebase. Remember to follow the existing code style.\n\n5. **Test your Changes**: Before committing your changes, make sure to test them to ensure they work as expected and do not introduce bugs.\n\n6. **Commit your Changes**: Commit your changes with a descriptive commit message using conventional commit messages.\n\n```bash\ngit commit -m \"feat: Your descriptive commit message\"\n```\n\n7. **Push to your Fork**: Push your commits to the branch in your forked repository.\n\n```bash\ngit push origin my-branch\n```\n\n8. **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.\n\nYour pull request will be reviewed and hopefully merged quickly. Thanks for contributing!\n"
107
+ "markdown": "# Projen Pipelines\n\n[![npm version](https://badge.fury.io/js/projen-pipelines.svg)](https://www.npmjs.com/package/projen-pipelines)\n\n\nProjen Pipelines is a projen library that provides high-level abstractions for defining continuous delivery (CD) pipelines for AWS CDK applications.\nIt is specifically designed to work with the projen project configuration engine.\n\nThis library provides high-level abstractions for defining multi-environment and multi-account AWS CDK applications with ease.\nWith this library, you can handle complex deployment scenarios with less code and manage your AWS infrastructure in a more efficient and straightforward way.\n## How Projen Pipelines work\n![High level Projen Pipelines Overview](documentation/overview.png)\nUnder the hood, after you defined the pipeline and selected target engine that you want to work on, we are using code generation methods that will create - in your project - the required CI/CD pipeline.\n\nWe are considering to allow selecting multiple engines going forward - please let us know if this is a feature you would use or not!\n\n## Getting Started\n\n### Installation\n\nTo install the package, add the package `projen-pipelines` to your projects devDeps in your projen configuration file.\n\nAfter installing the package, you can import and use the constructs to define your CDK Pipelines.\n\nYou will also have to setup an IAM role that can be used by GitHub Actions. You can find a tutorial on how set this up here: [Configuring OpenID Connect in Amazon Web Services](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)\n\n### Usage\n\nYou can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:\n\n```typescript\nimport { awscdk } from 'projen';\nimport { GithubCDKPipeline } from 'projen-pipelines';\n\n// Define your AWS CDK TypeScript App\nconst app = new awscdk.AwsCdkTypeScriptApp({\n cdkVersion: '2.80.0',\n name: 'my-awesome-app',\n defaultReleaseBranch: 'main',\n devDeps: [\n 'projen-pipelines',\n ],\n});\n\nproject.package.addPackageResolutions('projen');\n\n// Create the pipeline\nnew GithubCDKPipeline(app, {\n stackPrefix: 'MyApp',\n iamRoleArns: {\n default: 'arn:aws:iam::123456789012:role/GithubDeploymentRole',\n },\n pkgNamespace: '@company-assemblies',\n useGithubPackagesForAssembly: true,\n stages: [\n {\n name: 'dev',\n env: { account: '123456789012', region: 'eu-central-1' },\n }, {\n name: 'prod',\n manualApproval: true,\n env: {account: '123456789012', region: 'eu-central-1' },\n }],\n});\n```\n\nAfter running projen (`npx projen`) a new file called `src/app.ts` will be created and contain a specialized CDK App class for your project.\n\nYou can then use this in your `main.ts` to configure your deployment.\n\n```typescript\nimport { PipelineApp } from './app';\nimport { BackendStack } from './stack';\n\nconst app = new PipelineApp({\n provideDevStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: 'api-dev',\n myConfigSetting: 'value-for-dev',\n });\n },\n provideProdStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: 'api',\n myConfigSetting: 'value-for-prod',\n });\n },\n providePersonalStack: (scope, id, props) => {\n return new BackendStack(scope, id, {\n ...props,\n apiHostname: `api-${props.stageName}`,\n myConfigSetting: 'value-for-personal-stage',\n });\n },\n});\n\napp.synth();\n```\n\n### Setting Up Trust Relationships Between Accounts\n\nWhen planning to manage multiple staging environments, you will need to establish trust relationships. This process centralizes deployment control, improving operational efficiency and security by consolidating deployment management through a singular, monitored channel. Here is a simplified diagram for the setup:\n\n![Trust relationship](documentation/trust.svg)\n\n#### Step 1: Bootstrapping Each Account\n\nBootstrapping initializes the AWS CDK environment in each account. It prepares the account to work with AWS CDK apps deployed from other accounts. Use the `cdk bootstrap` command for this purpose. Replace `<deployment_account_id>` with the actual AWS account ID of your deployment account.\n\nYou can use the [CloudShell](https://aws.amazon.com/cloudshell/) to bootstrap each staging account:\n\n```bash\ncdk bootstrap --trust <deployment_account_id> --cloudformation-execution-policies \"arn:aws:iam::aws:policy/AdministratorAccess\"\n```\n\n**Note:**\n\nWhile `AdministratorAccess` grants full access to all AWS services and resources, it's not recommended for production environments due to security risks. Instead, create custom IAM policies that grant only the necessary permissions required for deployment operations.\n\n### Deployment\n\nThe `<Engine>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.\n\nHere's a brief description of each one:\n\n1. **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.\n\n2. **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.\n\n3. **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.\n\n4. **destroy:personal** - This task destroys the resources created for the personal stage of the application.\n\n5. **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.\n\n6. **diff:feature** - This task is similar to `diff:personal`, but for the feature stage.\n\n7. **destroy:feature** - This task destroys the resources created for the feature stage of the application.\n\n8. **deploy:<stageName>** - This task deploys a specific stage of the application (like 'dev' or 'prod').\n\n9. **diff:<stageName>** - This task compares the specified application stage with the current state of the application code.\n\n10. **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.\n\n11. **bump** - This task bumps the version based on the latest git tag and pushes the updated tag to the git repository.\n\n12. **release:push-assembly** - This task creates a manifest, bumps the version without creating a git tag, and publishes the cloud assembly to your registry.\n\nRemember that these tasks are created and managed automatically by the `CDKPipeline` class. You can run these tasks using the `npx projen TASK_NAME` command.\n\n## Contributing\n### By raising feature requests or issues\nUse the Github integrated \"[Issues](https://github.com/taimos/projen-pipelines/issues/new)\" view to create an item that you would love to have added to our open source project.\n\n***No request is too big or too small*** - get your thoughts created and we'll get back to you if we have questions!\n\n\n### By committing code\n\nWe welcome all contributions to Projen Pipelines! Here's how you can get started:\n\n1. **Fork the Repository**: Click the 'Fork' button at the top right of this page to duplicate this repository in your GitHub account.\n\n2. **Clone your Fork**: Clone the forked repository to your local machine.\n\n```bash\ngit clone https://github.com/<your_username>/projen-pipelines.git\n```\n\n3. **Create a Branch**: To keep your work organized, create a branch for your contribution.\n\n```bash\ngit checkout -b my-branch\n```\n\n4. **Make your Changes**: Make your changes, additions, or fixes to the codebase. Remember to follow the existing code style.\n\n5. **Test your Changes**: Before committing your changes, make sure to test them to ensure they work as expected and do not introduce bugs.\n\n6. **Commit your Changes**: Commit your changes with a descriptive commit message using conventional commit messages.\n\n```bash\ngit commit -m \"feat: Your descriptive commit message\"\n```\n\n7. **Push to your Fork**: Push your commits to the branch in your forked repository.\n\n```bash\ngit push origin my-branch\n```\n\n8. **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.\n\nYour pull request will be reviewed and hopefully merged quickly. Thanks for contributing!\n\n## Known issues\n\n### Environment variable not recognized during `npx projen`\n\nWhen attempting to run `npx projen`, users may encounter an error related to environment variable substitution within configuration files. Specifically, the `${GITHUB_TOKEN}` placeholder fails to be replaced.\n\n#### Solution\n\nTo resolve this issue, prefix the `npx projen` command with the `GITHUB_TOKEN=` environment variable:\n\n```bash\nGITHUB_TOKEN= npx projen\n```\n"
108
108
  },
109
109
  "repository": {
110
110
  "type": "git",
@@ -202,7 +202,7 @@
202
202
  "kind": "interface",
203
203
  "locationInModule": {
204
204
  "filename": "src/steps/step.ts",
205
- "line": 35
205
+ "line": 41
206
206
  },
207
207
  "name": "BashStepConfig",
208
208
  "properties": [
@@ -215,7 +215,7 @@
215
215
  "immutable": true,
216
216
  "locationInModule": {
217
217
  "filename": "src/steps/step.ts",
218
- "line": 38
218
+ "line": 44
219
219
  },
220
220
  "name": "commands",
221
221
  "type": {
@@ -1029,7 +1029,7 @@
1029
1029
  },
1030
1030
  "locationInModule": {
1031
1031
  "filename": "src/awscdk/github.ts",
1032
- "line": 173
1032
+ "line": 176
1033
1033
  },
1034
1034
  "name": "createAssetUpload"
1035
1035
  },
@@ -1040,7 +1040,7 @@
1040
1040
  },
1041
1041
  "locationInModule": {
1042
1042
  "filename": "src/awscdk/github.ts",
1043
- "line": 228
1043
+ "line": 232
1044
1044
  },
1045
1045
  "name": "createDeployment",
1046
1046
  "parameters": [
@@ -1287,10 +1287,31 @@
1287
1287
  "kind": "interface",
1288
1288
  "locationInModule": {
1289
1289
  "filename": "src/steps/step.ts",
1290
- "line": 23
1290
+ "line": 26
1291
1291
  },
1292
1292
  "name": "GithubStepConfig",
1293
1293
  "properties": [
1294
+ {
1295
+ "abstract": true,
1296
+ "docs": {
1297
+ "stability": "stable",
1298
+ "summary": "Additional environment variables to set for this step."
1299
+ },
1300
+ "immutable": true,
1301
+ "locationInModule": {
1302
+ "filename": "src/steps/step.ts",
1303
+ "line": 35
1304
+ },
1305
+ "name": "env",
1306
+ "type": {
1307
+ "collection": {
1308
+ "elementtype": {
1309
+ "primitive": "string"
1310
+ },
1311
+ "kind": "map"
1312
+ }
1313
+ }
1314
+ },
1294
1315
  {
1295
1316
  "abstract": true,
1296
1317
  "docs": {
@@ -1300,7 +1321,7 @@
1300
1321
  "immutable": true,
1301
1322
  "locationInModule": {
1302
1323
  "filename": "src/steps/step.ts",
1303
- "line": 26
1324
+ "line": 29
1304
1325
  },
1305
1326
  "name": "needs",
1306
1327
  "type": {
@@ -1321,7 +1342,7 @@
1321
1342
  "immutable": true,
1322
1343
  "locationInModule": {
1323
1344
  "filename": "src/steps/step.ts",
1324
- "line": 29
1345
+ "line": 32
1325
1346
  },
1326
1347
  "name": "steps",
1327
1348
  "type": {
@@ -1389,7 +1410,7 @@
1389
1410
  },
1390
1411
  "locationInModule": {
1391
1412
  "filename": "src/awscdk/gitlab.ts",
1392
- "line": 211
1413
+ "line": 216
1393
1414
  },
1394
1415
  "name": "createAssetUpload",
1395
1416
  "protected": true
@@ -1402,7 +1423,7 @@
1402
1423
  },
1403
1424
  "locationInModule": {
1404
1425
  "filename": "src/awscdk/gitlab.ts",
1405
- "line": 242
1426
+ "line": 250
1406
1427
  },
1407
1428
  "name": "createDeployment",
1408
1429
  "parameters": [
@@ -1437,7 +1458,7 @@
1437
1458
  },
1438
1459
  "locationInModule": {
1439
1460
  "filename": "src/awscdk/gitlab.ts",
1440
- "line": 294
1461
+ "line": 307
1441
1462
  },
1442
1463
  "name": "engineType",
1443
1464
  "overrides": "projen-pipelines.CDKPipeline",
@@ -1873,6 +1894,27 @@
1873
1894
  }
1874
1895
  }
1875
1896
  },
1897
+ {
1898
+ "abstract": true,
1899
+ "docs": {
1900
+ "stability": "stable",
1901
+ "summary": "Additional environment variables to set for this step."
1902
+ },
1903
+ "immutable": true,
1904
+ "locationInModule": {
1905
+ "filename": "src/steps/step.ts",
1906
+ "line": 20
1907
+ },
1908
+ "name": "env",
1909
+ "type": {
1910
+ "collection": {
1911
+ "elementtype": {
1912
+ "primitive": "string"
1913
+ },
1914
+ "kind": "map"
1915
+ }
1916
+ }
1917
+ },
1876
1918
  {
1877
1919
  "abstract": true,
1878
1920
  "docs": {
@@ -1972,7 +2014,7 @@
1972
2014
  },
1973
2015
  "locationInModule": {
1974
2016
  "filename": "src/steps/step.ts",
1975
- "line": 50
2017
+ "line": 56
1976
2018
  },
1977
2019
  "parameters": [
1978
2020
  {
@@ -1989,7 +2031,7 @@
1989
2031
  "kind": "class",
1990
2032
  "locationInModule": {
1991
2033
  "filename": "src/steps/step.ts",
1992
- "line": 44
2034
+ "line": 50
1993
2035
  },
1994
2036
  "methods": [
1995
2037
  {
@@ -2001,7 +2043,7 @@
2001
2043
  },
2002
2044
  "locationInModule": {
2003
2045
  "filename": "src/steps/step.ts",
2004
- "line": 67
2046
+ "line": 73
2005
2047
  },
2006
2048
  "name": "toBash",
2007
2049
  "returns": {
@@ -2019,7 +2061,7 @@
2019
2061
  },
2020
2062
  "locationInModule": {
2021
2063
  "filename": "src/steps/step.ts",
2022
- "line": 62
2064
+ "line": 68
2023
2065
  },
2024
2066
  "name": "toGithub",
2025
2067
  "returns": {
@@ -2037,7 +2079,7 @@
2037
2079
  },
2038
2080
  "locationInModule": {
2039
2081
  "filename": "src/steps/step.ts",
2040
- "line": 57
2082
+ "line": 63
2041
2083
  },
2042
2084
  "name": "toGitlab",
2043
2085
  "returns": {
@@ -2056,7 +2098,7 @@
2056
2098
  },
2057
2099
  "locationInModule": {
2058
2100
  "filename": "src/steps/step.ts",
2059
- "line": 50
2101
+ "line": 56
2060
2102
  },
2061
2103
  "name": "project",
2062
2104
  "protected": true,
@@ -2082,7 +2124,7 @@
2082
2124
  },
2083
2125
  "locationInModule": {
2084
2126
  "filename": "src/steps/step.ts",
2085
- "line": 80
2127
+ "line": 86
2086
2128
  },
2087
2129
  "parameters": [
2088
2130
  {
@@ -2113,7 +2155,7 @@
2113
2155
  "kind": "class",
2114
2156
  "locationInModule": {
2115
2157
  "filename": "src/steps/step.ts",
2116
- "line": 73
2158
+ "line": 79
2117
2159
  },
2118
2160
  "methods": [
2119
2161
  {
@@ -2123,7 +2165,7 @@
2123
2165
  },
2124
2166
  "locationInModule": {
2125
2167
  "filename": "src/steps/step.ts",
2126
- "line": 98
2168
+ "line": 105
2127
2169
  },
2128
2170
  "name": "toBash",
2129
2171
  "overrides": "projen-pipelines.PipelineStep",
@@ -2140,7 +2182,7 @@
2140
2182
  },
2141
2183
  "locationInModule": {
2142
2184
  "filename": "src/steps/step.ts",
2143
- "line": 107
2185
+ "line": 114
2144
2186
  },
2145
2187
  "name": "toGithub",
2146
2188
  "overrides": "projen-pipelines.PipelineStep",
@@ -2157,7 +2199,7 @@
2157
2199
  },
2158
2200
  "locationInModule": {
2159
2201
  "filename": "src/steps/step.ts",
2160
- "line": 87
2202
+ "line": 93
2161
2203
  },
2162
2204
  "name": "toGitlab",
2163
2205
  "overrides": "projen-pipelines.PipelineStep",
@@ -2177,7 +2219,7 @@
2177
2219
  },
2178
2220
  "locationInModule": {
2179
2221
  "filename": "src/steps/step.ts",
2180
- "line": 80
2222
+ "line": 86
2181
2223
  },
2182
2224
  "name": "commands",
2183
2225
  "protected": true,
@@ -2226,6 +2268,6 @@
2226
2268
  "symbolId": "src/awscdk/base:StageOptions"
2227
2269
  }
2228
2270
  },
2229
- "version": "0.0.60",
2230
- "fingerprint": "SQ2ZHTQAf/5a8DWsucvwtjrip1BKJ5bqithRcDB/zn0="
2271
+ "version": "0.0.62",
2272
+ "fingerprint": "VwACj32CEt2XzQA/vlHcQSnW1fwm+Q8prZUX1/SPEc4="
2231
2273
  }
package/API.md CHANGED
@@ -1677,11 +1677,24 @@ const githubStepConfig: GithubStepConfig = { ... }
1677
1677
 
1678
1678
  | **Name** | **Type** | **Description** |
1679
1679
  | --- | --- | --- |
1680
+ | <code><a href="#projen-pipelines.GithubStepConfig.property.env">env</a></code> | <code>{[ key: string ]: string}</code> | Additional environment variables to set for this step. |
1680
1681
  | <code><a href="#projen-pipelines.GithubStepConfig.property.needs">needs</a></code> | <code>string[]</code> | Dependencies which need to be completed before this step. |
1681
1682
  | <code><a href="#projen-pipelines.GithubStepConfig.property.steps">steps</a></code> | <code>projen.github.workflows.JobStep[]</code> | Commands wrapped as GitHub Action job steps. |
1682
1683
 
1683
1684
  ---
1684
1685
 
1686
+ ##### `env`<sup>Required</sup> <a name="env" id="projen-pipelines.GithubStepConfig.property.env"></a>
1687
+
1688
+ ```typescript
1689
+ public readonly env: {[ key: string ]: string};
1690
+ ```
1691
+
1692
+ - *Type:* {[ key: string ]: string}
1693
+
1694
+ Additional environment variables to set for this step.
1695
+
1696
+ ---
1697
+
1685
1698
  ##### `needs`<sup>Required</sup> <a name="needs" id="projen-pipelines.GithubStepConfig.property.needs"></a>
1686
1699
 
1687
1700
  ```typescript
@@ -2113,6 +2126,7 @@ const gitlabStepConfig: GitlabStepConfig = { ... }
2113
2126
  | **Name** | **Type** | **Description** |
2114
2127
  | --- | --- | --- |
2115
2128
  | <code><a href="#projen-pipelines.GitlabStepConfig.property.commands">commands</a></code> | <code>string[]</code> | Shell commands to execute in this step. |
2129
+ | <code><a href="#projen-pipelines.GitlabStepConfig.property.env">env</a></code> | <code>{[ key: string ]: string}</code> | Additional environment variables to set for this step. |
2116
2130
  | <code><a href="#projen-pipelines.GitlabStepConfig.property.extensions">extensions</a></code> | <code>string[]</code> | List of job extensions related to the step. |
2117
2131
  | <code><a href="#projen-pipelines.GitlabStepConfig.property.needs">needs</a></code> | <code>projen.gitlab.Need[]</code> | Dependencies which need to be completed before this step. |
2118
2132
 
@@ -2130,6 +2144,18 @@ Shell commands to execute in this step.
2130
2144
 
2131
2145
  ---
2132
2146
 
2147
+ ##### `env`<sup>Required</sup> <a name="env" id="projen-pipelines.GitlabStepConfig.property.env"></a>
2148
+
2149
+ ```typescript
2150
+ public readonly env: {[ key: string ]: string};
2151
+ ```
2152
+
2153
+ - *Type:* {[ key: string ]: string}
2154
+
2155
+ Additional environment variables to set for this step.
2156
+
2157
+ ---
2158
+
2133
2159
  ##### `extensions`<sup>Required</sup> <a name="extensions" id="projen-pipelines.GitlabStepConfig.property.extensions"></a>
2134
2160
 
2135
2161
  ```typescript
package/README.md CHANGED
@@ -20,16 +20,17 @@ We are considering to allow selecting multiple engines going forward - please le
20
20
 
21
21
  To install the package, add the package `projen-pipelines` to your projects devDeps in your projen configuration file.
22
22
 
23
-
24
23
  After installing the package, you can import and use the constructs to define your CDK Pipelines.
25
24
 
25
+ You will also have to setup an IAM role that can be used by GitHub Actions. You can find a tutorial on how set this up here: [Configuring OpenID Connect in Amazon Web Services](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/configuring-openid-connect-in-amazon-web-services)
26
+
26
27
  ### Usage
27
28
 
28
29
  You can start using the constructs provided by Projen Pipelines in your AWS CDK applications. Here's a brief example:
29
30
 
30
31
  ```typescript
31
32
  import { awscdk } from 'projen';
32
- import { CDKPipeline, CDKPipelineOptions } from 'projen-pipelines';
33
+ import { GithubCDKPipeline } from 'projen-pipelines';
33
34
 
34
35
  // Define your AWS CDK TypeScript App
35
36
  const app = new awscdk.AwsCdkTypeScriptApp({
@@ -41,10 +42,16 @@ const app = new awscdk.AwsCdkTypeScriptApp({
41
42
  ],
42
43
  });
43
44
 
45
+ project.package.addPackageResolutions('projen');
46
+
44
47
  // Create the pipeline
45
48
  new GithubCDKPipeline(app, {
46
49
  stackPrefix: 'MyApp',
50
+ iamRoleArns: {
51
+ default: 'arn:aws:iam::123456789012:role/GithubDeploymentRole',
52
+ },
47
53
  pkgNamespace: '@company-assemblies',
54
+ useGithubPackagesForAssembly: true,
48
55
  stages: [
49
56
  {
50
57
  name: 'dev',
@@ -92,6 +99,26 @@ const app = new PipelineApp({
92
99
  app.synth();
93
100
  ```
94
101
 
102
+ ### Setting Up Trust Relationships Between Accounts
103
+
104
+ When planning to manage multiple staging environments, you will need to establish trust relationships. This process centralizes deployment control, improving operational efficiency and security by consolidating deployment management through a singular, monitored channel. Here is a simplified diagram for the setup:
105
+
106
+ ![Trust relationship](documentation/trust.svg)
107
+
108
+ #### Step 1: Bootstrapping Each Account
109
+
110
+ Bootstrapping initializes the AWS CDK environment in each account. It prepares the account to work with AWS CDK apps deployed from other accounts. Use the `cdk bootstrap` command for this purpose. Replace `<deployment_account_id>` with the actual AWS account ID of your deployment account.
111
+
112
+ You can use the [CloudShell](https://aws.amazon.com/cloudshell/) to bootstrap each staging account:
113
+
114
+ ```bash
115
+ cdk bootstrap --trust <deployment_account_id> --cloudformation-execution-policies "arn:aws:iam::aws:policy/AdministratorAccess"
116
+ ```
117
+
118
+ **Note:**
119
+
120
+ While `AdministratorAccess` grants full access to all AWS services and resources, it's not recommended for production environments due to security risks. Instead, create custom IAM policies that grant only the necessary permissions required for deployment operations.
121
+
95
122
  ### Deployment
96
123
 
97
124
  The `<Engine>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.
@@ -124,7 +151,6 @@ Here's a brief description of each one:
124
151
 
125
152
  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.
126
153
 
127
-
128
154
  ## Contributing
129
155
  ### By raising feature requests or issues
130
156
  Use the Github integrated "[Issues](https://github.com/taimos/projen-pipelines/issues/new)" view to create an item that you would love to have added to our open source project.
@@ -169,3 +195,17 @@ git push origin my-branch
169
195
  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.
170
196
 
171
197
  Your pull request will be reviewed and hopefully merged quickly. Thanks for contributing!
198
+
199
+ ## Known issues
200
+
201
+ ### Environment variable not recognized during `npx projen`
202
+
203
+ When attempting to run `npx projen`, users may encounter an error related to environment variable substitution within configuration files. Specifically, the `${GITHUB_TOKEN}` placeholder fails to be replaced.
204
+
205
+ #### Solution
206
+
207
+ To resolve this issue, prefix the `npx projen` command with the `GITHUB_TOKEN=` environment variable:
208
+
209
+ ```bash
210
+ GITHUB_TOKEN= npx projen
211
+ ```
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!-- Do not edit this file with editors other than draw.io -->
3
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="454px" height="389px" viewBox="-0.5 -0.5 454 389" content="&lt;mxfile host=&quot;app.diagrams.net&quot; modified=&quot;2024-05-16T10:50:35.719Z&quot; agent=&quot;Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:125.0) Gecko/20100101 Firefox/125.0&quot; etag=&quot;fJ-csZqLiFqayop0vQ8I&quot; version=&quot;24.2.7&quot; type=&quot;device&quot; scale=&quot;1&quot; border=&quot;50&quot;&gt;&#xA; &lt;diagram name=&quot;Page-1&quot; id=&quot;dqhbQaRhFFh30BCf__Ux&quot;&gt;&#xA; &lt;mxGraphModel dx=&quot;1242&quot; dy=&quot;793&quot; grid=&quot;1&quot; gridSize=&quot;10&quot; guides=&quot;1&quot; tooltips=&quot;1&quot; connect=&quot;1&quot; arrows=&quot;1&quot; fold=&quot;1&quot; page=&quot;1&quot; pageScale=&quot;1&quot; pageWidth=&quot;850&quot; pageHeight=&quot;1100&quot; math=&quot;0&quot; shadow=&quot;0&quot;&gt;&#xA; &lt;root&gt;&#xA; &lt;mxCell id=&quot;0&quot; /&gt;&#xA; &lt;mxCell id=&quot;1&quot; parent=&quot;0&quot; /&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-1&quot; value=&quot;&amp;lt;div&amp;gt;Deployment&amp;lt;/div&amp;gt;&quot; style=&quot;sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#E7157B;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.organizations_account;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#xA; &lt;mxGeometry x=&quot;388&quot; y=&quot;260&quot; width=&quot;74&quot; height=&quot;78&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-14&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;sourcePerimeterSpacing=20;targetPerimeterSpacing=20;endArrow=block;endFill=1;strokeWidth=2;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;wuy6lWVbaLT-QBWF_xgm-2&quot; target=&quot;wuy6lWVbaLT-QBWF_xgm-1&quot;&gt;&#xA; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#xA; &lt;Array as=&quot;points&quot;&gt;&#xA; &lt;mxPoint x=&quot;557&quot; y=&quot;310&quot; /&gt;&#xA; &lt;/Array&gt;&#xA; &lt;/mxGeometry&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-17&quot; value=&quot;Trust&quot; style=&quot;edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];&quot; vertex=&quot;1&quot; connectable=&quot;0&quot; parent=&quot;wuy6lWVbaLT-QBWF_xgm-14&quot;&gt;&#xA; &lt;mxGeometry x=&quot;-0.3559&quot; y=&quot;1&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#xA; &lt;mxPoint x=&quot;1&quot; as=&quot;offset&quot; /&gt;&#xA; &lt;/mxGeometry&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-2&quot; value=&quot;Prod&quot; style=&quot;sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#E7157B;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.organizations_account;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#xA; &lt;mxGeometry x=&quot;520&quot; y=&quot;450&quot; width=&quot;74&quot; height=&quot;78&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-15&quot; style=&quot;edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;sourcePerimeterSpacing=20;targetPerimeterSpacing=20;endArrow=block;endFill=1;strokeWidth=2;&quot; edge=&quot;1&quot; parent=&quot;1&quot; source=&quot;wuy6lWVbaLT-QBWF_xgm-3&quot; target=&quot;wuy6lWVbaLT-QBWF_xgm-1&quot;&gt;&#xA; &lt;mxGeometry relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#xA; &lt;Array as=&quot;points&quot;&gt;&#xA; &lt;mxPoint x=&quot;277&quot; y=&quot;310&quot; /&gt;&#xA; &lt;/Array&gt;&#xA; &lt;/mxGeometry&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-16&quot; value=&quot;Trust&quot; style=&quot;edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];&quot; vertex=&quot;1&quot; connectable=&quot;0&quot; parent=&quot;wuy6lWVbaLT-QBWF_xgm-15&quot;&gt;&#xA; &lt;mxGeometry x=&quot;-0.392&quot; y=&quot;1&quot; relative=&quot;1&quot; as=&quot;geometry&quot;&gt;&#xA; &lt;mxPoint as=&quot;offset&quot; /&gt;&#xA; &lt;/mxGeometry&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;mxCell id=&quot;wuy6lWVbaLT-QBWF_xgm-3&quot; value=&quot;Dev&quot; style=&quot;sketch=0;outlineConnect=0;fontColor=#232F3E;gradientColor=none;fillColor=#E7157B;strokeColor=none;dashed=0;verticalLabelPosition=bottom;verticalAlign=top;align=center;html=1;fontSize=12;fontStyle=0;aspect=fixed;pointerEvents=1;shape=mxgraph.aws4.organizations_account;&quot; vertex=&quot;1&quot; parent=&quot;1&quot;&gt;&#xA; &lt;mxGeometry x=&quot;240&quot; y=&quot;450&quot; width=&quot;74&quot; height=&quot;78&quot; as=&quot;geometry&quot; /&gt;&#xA; &lt;/mxCell&gt;&#xA; &lt;/root&gt;&#xA; &lt;/mxGraphModel&gt;&#xA; &lt;/diagram&gt;&#xA;&lt;/mxfile&gt;&#xA;"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0"/><g><g><rect x="198" y="50" width="74" height="78" fill="none" stroke="none" pointer-events="all"/><path d="M 226.43 50.26 C 220.24 50.53 214.82 54.48 212.67 60.29 C 210.51 66.1 212.05 72.63 216.57 76.87 C 205.51 80.94 198.17 91.47 198.17 103.25 L 198.17 108.59 L 232.39 108.59 L 232.32 105.16 L 201.52 105.16 L 201.52 103.25 C 201.54 92.13 208.98 82.39 219.71 79.45 C 224.35 81.7 229.76 81.7 234.4 79.45 C 239.01 80.7 243.17 83.24 246.38 86.77 L 248.91 84.48 C 245.83 81.05 241.95 78.43 237.62 76.84 C 242.3 72.44 243.74 65.59 241.25 59.67 C 238.76 53.75 232.85 50 226.43 50.26 Z M 227.1 54.1 C 232.48 54.06 237.2 57.69 238.55 62.91 C 239.89 68.12 237.51 73.58 232.78 76.15 C 229.19 78.08 224.87 78.08 221.28 76.15 C 216.53 73.57 214.15 68.07 215.53 62.84 C 216.91 57.61 221.69 54 227.1 54.1 Z M 253.63 85.97 L 235.43 96.47 L 235.43 117.5 L 253.63 128 L 271.83 117.5 L 271.83 96.47 Z M 253.63 89.86 L 266.75 97.45 L 253.63 105.01 L 240.51 97.45 Z M 238.85 100.43 L 251.92 107.98 L 251.92 123.08 L 238.85 115.52 Z M 268.41 100.43 L 268.41 115.52 L 255.34 123.08 L 255.34 107.98 Z" fill="#e7157b" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 135px; margin-left: 235px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #232F3E; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;"><div>Deployment</div></div></div></div></foreignObject><image x="203" y="135.5" width="64" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g><g><path d="M 367.1 220 L 367.1 100 L 302.07 100" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 294.07 100 L 302.07 96 L 302.07 104 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 158px; margin-left: 368px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Trust</div></div></div></foreignObject><image x="355.5" y="152" width="25" height="18.5" xlink:href="data:image/png;base64,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"/></switch></g></g><g><rect x="330" y="240" width="74" height="78" fill="none" stroke="none" pointer-events="all"/><path d="M 358.43 240.26 C 352.24 240.53 346.82 244.48 344.67 250.29 C 342.51 256.1 344.05 262.63 348.57 266.87 C 337.51 270.94 330.17 281.47 330.17 293.25 L 330.17 298.59 L 364.39 298.59 L 364.32 295.16 L 333.52 295.16 L 333.52 293.25 C 333.54 282.13 340.98 272.39 351.71 269.45 C 356.35 271.7 361.76 271.7 366.4 269.45 C 371.01 270.7 375.17 273.24 378.38 276.77 L 380.91 274.48 C 377.83 271.05 373.95 268.43 369.62 266.84 C 374.3 262.44 375.74 255.59 373.25 249.67 C 370.76 243.75 364.85 240 358.43 240.26 Z M 359.1 244.1 C 364.48 244.06 369.2 247.69 370.55 252.91 C 371.89 258.12 369.51 263.58 364.78 266.15 C 361.19 268.08 356.87 268.08 353.28 266.15 C 348.53 263.57 346.15 258.07 347.53 252.84 C 348.91 247.61 353.69 244 359.1 244.1 Z M 385.63 275.97 L 367.43 286.47 L 367.43 307.5 L 385.63 318 L 403.83 307.5 L 403.83 286.47 Z M 385.63 279.86 L 398.75 287.45 L 385.63 295.01 L 372.51 287.45 Z M 370.85 290.43 L 383.92 297.98 L 383.92 313.08 L 370.85 305.52 Z M 400.41 290.43 L 400.41 305.52 L 387.34 313.08 L 387.34 297.98 Z" fill="#e7157b" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 325px; margin-left: 367px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #232F3E; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;">Prod</div></div></div></foreignObject><image x="354.5" y="325.5" width="25" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g><g><path d="M 87.1 220 L 87.1 100 L 167.93 100" fill="none" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 175.93 100 L 167.93 104 L 167.93 96 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-width="2" stroke-miterlimit="10" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 157px; margin-left: 87px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); "><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: all; background-color: rgb(255, 255, 255); white-space: nowrap;">Trust</div></div></div></foreignObject><image x="74.5" y="149.625" width="25" height="18.5" xlink:href="data:image/png;base64,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"/></switch></g></g><g><rect x="50" y="240" width="74" height="78" fill="none" stroke="none" pointer-events="all"/><path d="M 78.43 240.26 C 72.24 240.53 66.82 244.48 64.67 250.29 C 62.51 256.1 64.05 262.63 68.57 266.87 C 57.51 270.94 50.17 281.47 50.17 293.25 L 50.17 298.59 L 84.39 298.59 L 84.32 295.16 L 53.52 295.16 L 53.52 293.25 C 53.54 282.13 60.98 272.39 71.71 269.45 C 76.35 271.7 81.76 271.7 86.4 269.45 C 91.01 270.7 95.17 273.24 98.38 276.77 L 100.91 274.48 C 97.83 271.05 93.95 268.43 89.62 266.84 C 94.3 262.44 95.74 255.59 93.25 249.67 C 90.76 243.75 84.85 240 78.43 240.26 Z M 79.1 244.1 C 84.48 244.06 89.2 247.69 90.55 252.91 C 91.89 258.12 89.51 263.58 84.78 266.15 C 81.19 268.08 76.87 268.08 73.28 266.15 C 68.53 263.57 66.15 258.07 67.53 252.84 C 68.91 247.61 73.69 244 79.1 244.1 Z M 105.63 275.97 L 87.43 286.47 L 87.43 307.5 L 105.63 318 L 123.83 307.5 L 123.83 286.47 Z M 105.63 279.86 L 118.75 287.45 L 105.63 295.01 L 92.51 287.45 Z M 90.85 290.43 L 103.92 297.98 L 103.92 313.08 L 90.85 305.52 Z M 120.41 290.43 L 120.41 305.52 L 107.34 313.08 L 107.34 297.98 Z" fill="#e7157b" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 325px; margin-left: 87px;"><div style="box-sizing: border-box; font-size: 0px; text-align: center;" data-drawio-colors="color: #232F3E; "><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(35, 47, 62); line-height: 1.2; pointer-events: all; white-space: nowrap;">Dev</div></div></div></foreignObject><image x="76.5" y="325.5" width="21" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></svg>