@cloudsnorkel/cdk-github-runners 0.8.1 → 0.8.2

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 (96) hide show
  1. package/.gitattributes +9 -0
  2. package/.jsii +368 -184
  3. package/API.md +1718 -512
  4. package/README.md +2 -2
  5. package/{lib/providers → assets}/docker-images/lambda/linux-arm64/runner.sh +1 -1
  6. package/{lib/providers → assets}/docker-images/lambda/linux-x64/runner.sh +1 -1
  7. package/{lib/lambdas/aws-image-builder-versioner → assets/lambdas/aws-image-builder-versioner.lambda}/index.js +5 -5
  8. package/{lib/lambdas/build-image → assets/lambdas/build-image.lambda}/index.js +5 -5
  9. package/{lib/lambdas/delete-ami → assets/lambdas/delete-ami.lambda}/index.js +2 -2
  10. package/{lib/lambdas/delete-runner → assets/lambdas/delete-runner.lambda}/index.js +1 -1
  11. package/{lib/lambdas/setup → assets/lambdas/setup.lambda}/index.js +2 -2
  12. package/{lib/lambdas/status → assets/lambdas/status.lambda}/index.js +2 -2
  13. package/{lib/lambdas/token-retriever → assets/lambdas/token-retriever.lambda}/index.js +1 -1
  14. package/{lib/lambdas/update-lambda → assets/lambdas/update-lambda.lambda}/index.js +4 -4
  15. package/{lib/lambdas/webhook-handler → assets/lambdas/webhook-handler.lambda}/index.js +2 -2
  16. package/lib/lambdas/aws-image-builder-versioner-function.d.ts +13 -0
  17. package/lib/lambdas/aws-image-builder-versioner-function.js +23 -0
  18. package/lib/lambdas/aws-image-builder-versioner.lambda.d.ts +2 -0
  19. package/lib/lambdas/aws-image-builder-versioner.lambda.js +80 -0
  20. package/lib/lambdas/build-image-function.d.ts +13 -0
  21. package/lib/lambdas/build-image-function.js +23 -0
  22. package/lib/lambdas/build-image.lambda.d.ts +2 -0
  23. package/lib/lambdas/build-image.lambda.js +92 -0
  24. package/lib/lambdas/delete-ami-function.d.ts +13 -0
  25. package/lib/lambdas/delete-ami-function.js +23 -0
  26. package/lib/lambdas/delete-ami.lambda.d.ts +1 -0
  27. package/lib/lambdas/delete-ami.lambda.js +87 -0
  28. package/lib/lambdas/delete-runner-function.d.ts +13 -0
  29. package/lib/lambdas/delete-runner-function.js +23 -0
  30. package/lib/lambdas/delete-runner.lambda.d.ts +1 -0
  31. package/lib/lambdas/delete-runner.lambda.js +69 -0
  32. package/lib/lambdas/github.d.ts +7 -0
  33. package/lib/lambdas/github.js +50 -0
  34. package/lib/lambdas/helpers.d.ts +12 -0
  35. package/lib/lambdas/helpers.js +66 -0
  36. package/lib/lambdas/setup-function.d.ts +13 -0
  37. package/lib/lambdas/setup-function.js +23 -0
  38. package/lib/lambdas/setup.lambda.d.ts +1 -0
  39. package/lib/lambdas/setup.lambda.js +148 -0
  40. package/lib/lambdas/status-function.d.ts +13 -0
  41. package/lib/lambdas/status-function.js +23 -0
  42. package/lib/lambdas/status.lambda.d.ts +1 -0
  43. package/lib/lambdas/status.lambda.js +285 -0
  44. package/lib/lambdas/token-retriever-function.d.ts +13 -0
  45. package/lib/lambdas/token-retriever-function.js +23 -0
  46. package/lib/lambdas/token-retriever.lambda.d.ts +1 -0
  47. package/lib/lambdas/token-retriever.lambda.js +15 -0
  48. package/lib/lambdas/update-lambda-function.d.ts +13 -0
  49. package/lib/lambdas/update-lambda-function.js +23 -0
  50. package/lib/lambdas/update-lambda.lambda.d.ts +7 -0
  51. package/lib/lambdas/update-lambda.lambda.js +34 -0
  52. package/lib/lambdas/webhook-handler-function.d.ts +13 -0
  53. package/lib/lambdas/webhook-handler-function.js +23 -0
  54. package/lib/lambdas/webhook-handler.lambda.d.ts +1 -0
  55. package/lib/lambdas/webhook-handler.lambda.js +107 -0
  56. package/lib/providers/codebuild.d.ts +8 -3
  57. package/lib/providers/codebuild.js +17 -9
  58. package/lib/providers/common.js +3 -3
  59. package/lib/providers/ec2.d.ts +9 -4
  60. package/lib/providers/ec2.js +14 -6
  61. package/lib/providers/fargate.d.ts +8 -3
  62. package/lib/providers/fargate.js +17 -9
  63. package/lib/providers/image-builders/ami.js +6 -3
  64. package/lib/providers/image-builders/codebuild.js +5 -3
  65. package/lib/providers/image-builders/common.js +5 -3
  66. package/lib/providers/image-builders/container.js +5 -3
  67. package/lib/providers/image-builders/linux-components.js +1 -1
  68. package/lib/providers/image-builders/static.js +3 -3
  69. package/lib/providers/image-builders/windows-components.js +1 -1
  70. package/lib/providers/lambda.d.ts +8 -3
  71. package/lib/providers/lambda.js +20 -10
  72. package/lib/runner.js +17 -10
  73. package/lib/secrets.js +1 -1
  74. package/lib/utils.d.ts +2 -6
  75. package/lib/utils.js +11 -26
  76. package/lib/webhook.d.ts +2 -2
  77. package/lib/webhook.js +5 -3
  78. package/package.json +28 -12
  79. package/setup/index.html +0 -12
  80. package/setup/src/App.svelte +0 -291
  81. package/setup/src/app.scss +0 -15
  82. package/setup/src/main.ts +0 -8
  83. package/setup/src/vite-env.d.ts +0 -2
  84. package/setup/svelte.config.mjs +0 -7
  85. package/setup/tsconfig.json +0 -21
  86. package/setup/tsconfig.node.json +0 -8
  87. package/setup/vite.config.ts +0 -15
  88. /package/{lib/providers → assets}/docker-images/codebuild/linux-arm64/Dockerfile +0 -0
  89. /package/{lib/providers → assets}/docker-images/codebuild/linux-x64/Dockerfile +0 -0
  90. /package/{lib/providers → assets}/docker-images/fargate/linux-arm64/Dockerfile +0 -0
  91. /package/{lib/providers → assets}/docker-images/fargate/linux-x64/Dockerfile +0 -0
  92. /package/{lib/providers → assets}/docker-images/lambda/linux-arm64/Dockerfile +0 -0
  93. /package/{lib/providers → assets}/docker-images/lambda/linux-arm64/runner.js +0 -0
  94. /package/{lib/providers → assets}/docker-images/lambda/linux-x64/Dockerfile +0 -0
  95. /package/{lib/providers → assets}/docker-images/lambda/linux-x64/runner.js +0 -0
  96. /package/{lib/lambdas/setup → assets/lambdas/setup.lambda}/index.html +0 -0
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StatusFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/lambdas/status.
9
+ */
10
+ class StatusFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/status.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/status.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.StatusFunction = StatusFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvc3RhdHVzLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxjQUFlLFNBQVEsTUFBTSxDQUFDLFFBQVE7SUFDakQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEyQjtRQUNuRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRTtZQUNmLFdBQVcsRUFBRSw4QkFBOEI7WUFDM0MsR0FBRyxLQUFLO1lBQ1IsT0FBTyxFQUFFLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7WUFDdEUsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLG9DQUFvQyxDQUFDLENBQUM7U0FDeEYsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxRixDQUFDO0NBQ0Y7QUFYRCx3Q0FXQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMuanMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBQcm9wcyBmb3IgU3RhdHVzRnVuY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGF0dXNGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvbGFtYmRhcy9zdGF0dXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGF0dXNGdW5jdGlvbiBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogU3RhdHVzRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzcmMvbGFtYmRhcy9zdGF0dXMubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMxNC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2xhbWJkYXMvc3RhdHVzLmxhbWJkYScpKSxcbiAgICB9KTtcbiAgICB0aGlzLmFkZEVudmlyb25tZW50KCdBV1NfTk9ERUpTX0NPTk5FQ1RJT05fUkVVU0VfRU5BQkxFRCcsICcxJywgeyByZW1vdmVJbkVkZ2U6IHRydWUgfSk7XG4gIH1cbn0iXX0=
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,285 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /* eslint-disable import/no-extraneous-dependencies */
4
+ const auth_app_1 = require("@octokit/auth-app");
5
+ const core_1 = require("@octokit/core");
6
+ const AWS = require("aws-sdk");
7
+ const github_1 = require("./github");
8
+ const helpers_1 = require("./helpers");
9
+ const cfn = new AWS.CloudFormation();
10
+ const ec2 = new AWS.EC2();
11
+ const ecr = new AWS.ECR();
12
+ const sf = new AWS.StepFunctions();
13
+ function secretArnToUrl(arn) {
14
+ const parts = arn.split(':'); // arn:aws:secretsmanager:us-east-1:12345678:secret:secret-name-REVISION
15
+ const region = parts[3];
16
+ const fullName = parts[6];
17
+ const name = fullName.slice(0, fullName.lastIndexOf('-'));
18
+ return `https://${region}.console.aws.amazon.com/secretsmanager/home?region=${region}#!/secret?name=${name}`;
19
+ }
20
+ function lambdaArnToUrl(arn) {
21
+ const parts = arn.split(':'); // arn:aws:lambda:us-east-1:12345678:function:name-XYZ
22
+ const region = parts[3];
23
+ const name = parts[6];
24
+ return `https://${region}.console.aws.amazon.com/lambda/home?region=${region}#/functions/${name}?tab=monitoring`;
25
+ }
26
+ function stepFunctionArnToUrl(arn) {
27
+ const parts = arn.split(':'); // arn:aws:states:us-east-1:12345678:stateMachine:name-XYZ
28
+ const region = parts[3];
29
+ return `https://${region}.console.aws.amazon.com/states/home?region=${region}#/statemachines/view/${arn}`;
30
+ }
31
+ async function generateProvidersStatus(stack, logicalId) {
32
+ const resource = await cfn.describeStackResource({ StackName: stack, LogicalResourceId: logicalId }).promise();
33
+ const providers = JSON.parse(resource.StackResourceDetail?.Metadata ?? '{}').providers;
34
+ if (!providers) {
35
+ return {};
36
+ }
37
+ return Promise.all(providers.map(async (p) => {
38
+ // add ECR data, if image is from ECR
39
+ if (p.image?.imageRepository?.match(/[0-9]+\.dkr\.ecr\.[a-z0-9\-]+\.amazonaws\.com\/.+/)) {
40
+ const tags = await ecr.describeImages({
41
+ repositoryName: p.image.imageRepository.split('/')[1],
42
+ filter: {
43
+ tagStatus: 'TAGGED',
44
+ },
45
+ maxResults: 1,
46
+ }).promise();
47
+ if (tags.imageDetails && tags.imageDetails?.length >= 1) {
48
+ p.image.latestImage = {
49
+ tags: tags.imageDetails[0].imageTags,
50
+ digest: tags.imageDetails[0].imageDigest,
51
+ date: tags.imageDetails[0].imagePushedAt,
52
+ };
53
+ }
54
+ }
55
+ // add AMI data, if image is AMI
56
+ if (p.ami?.launchTemplate) {
57
+ const versions = await ec2.describeLaunchTemplateVersions({
58
+ LaunchTemplateId: p.ami.launchTemplate,
59
+ Versions: ['$Default'],
60
+ }).promise();
61
+ if (versions.LaunchTemplateVersions && versions.LaunchTemplateVersions.length >= 1) {
62
+ p.ami.latestAmi = versions.LaunchTemplateVersions[0].LaunchTemplateData?.ImageId;
63
+ }
64
+ }
65
+ return p;
66
+ }));
67
+ }
68
+ exports.handler = async function () {
69
+ // confirm required environment variables
70
+ if (!process.env.WEBHOOK_SECRET_ARN || !process.env.GITHUB_SECRET_ARN || !process.env.GITHUB_PRIVATE_KEY_SECRET_ARN || !process.env.LOGICAL_ID ||
71
+ !process.env.WEBHOOK_HANDLER_ARN || !process.env.STEP_FUNCTION_ARN || !process.env.SETUP_SECRET_ARN || !process.env.SETUP_FUNCTION_URL ||
72
+ !process.env.STACK_NAME) {
73
+ throw new Error('Missing environment variables');
74
+ }
75
+ // base status
76
+ const status = {
77
+ github: {
78
+ setup: {
79
+ status: 'Unknown',
80
+ url: '',
81
+ secretArn: process.env.SETUP_SECRET_ARN,
82
+ secretUrl: secretArnToUrl(process.env.SETUP_SECRET_ARN),
83
+ },
84
+ domain: 'Unknown',
85
+ webhook: {
86
+ url: process.env.WEBHOOK_URL,
87
+ status: 'Unable to check',
88
+ secretArn: process.env.WEBHOOK_SECRET_ARN,
89
+ secretUrl: secretArnToUrl(process.env.WEBHOOK_SECRET_ARN),
90
+ },
91
+ auth: {
92
+ type: 'Unknown',
93
+ status: 'Unknown',
94
+ secretArn: process.env.GITHUB_SECRET_ARN,
95
+ secretUrl: secretArnToUrl(process.env.GITHUB_SECRET_ARN),
96
+ privateKeySecretArn: process.env.GITHUB_PRIVATE_KEY_SECRET_ARN,
97
+ privateKeySecretUrl: secretArnToUrl(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN),
98
+ app: {
99
+ id: '',
100
+ url: '',
101
+ installations: [],
102
+ },
103
+ personalAuthToken: '',
104
+ },
105
+ },
106
+ providers: await generateProvidersStatus(process.env.STACK_NAME, process.env.LOGICAL_ID),
107
+ troubleshooting: {
108
+ webhookHandlerArn: process.env.WEBHOOK_HANDLER_ARN,
109
+ webhookHandlerUrl: lambdaArnToUrl(process.env.WEBHOOK_HANDLER_ARN),
110
+ stepFunctionArn: process.env.STEP_FUNCTION_ARN,
111
+ stepFunctionUrl: stepFunctionArnToUrl(process.env.STEP_FUNCTION_ARN),
112
+ stepFunctionLogGroup: process.env.STEP_FUNCTION_LOG_GROUP,
113
+ recentRuns: [],
114
+ },
115
+ };
116
+ // setup url
117
+ const setupToken = (await helpers_1.getSecretJsonValue(process.env.SETUP_SECRET_ARN)).token;
118
+ if (setupToken) {
119
+ status.github.setup.status = 'Pending';
120
+ status.github.setup.url = `${process.env.SETUP_FUNCTION_URL}?token=${setupToken}`;
121
+ }
122
+ else {
123
+ status.github.setup.status = 'Complete';
124
+ }
125
+ // list last 10 executions and their status
126
+ try {
127
+ const executions = await sf.listExecutions({
128
+ stateMachineArn: process.env.STEP_FUNCTION_ARN,
129
+ maxResults: 10,
130
+ }).promise();
131
+ for (const execution of executions.executions) {
132
+ const executionDetails = await sf.describeExecution({
133
+ executionArn: execution.executionArn,
134
+ }).promise();
135
+ const input = JSON.parse(executionDetails.input || '{}');
136
+ status.troubleshooting.recentRuns.push({
137
+ executionArn: execution.executionArn,
138
+ status: execution.status,
139
+ owner: input.owner,
140
+ repo: input.repo,
141
+ runId: input.runId,
142
+ });
143
+ }
144
+ }
145
+ catch (e) {
146
+ status.troubleshooting.recentRuns.push({ status: `Error getting executions: ${e}` });
147
+ }
148
+ // get secrets
149
+ let githubSecrets;
150
+ try {
151
+ githubSecrets = await helpers_1.getSecretJsonValue(process.env.GITHUB_SECRET_ARN);
152
+ }
153
+ catch (e) {
154
+ status.github.auth.status = `Unable to read secret: ${e}`;
155
+ return status;
156
+ }
157
+ let privateKey;
158
+ try {
159
+ privateKey = await helpers_1.getSecretValue(process.env.GITHUB_PRIVATE_KEY_SECRET_ARN);
160
+ }
161
+ catch (e) {
162
+ status.github.auth.status = `Unable to read private key secret: ${e}`;
163
+ return status;
164
+ }
165
+ // calculate base url
166
+ let baseUrl = github_1.baseUrlFromDomain(githubSecrets.domain);
167
+ status.github.domain = githubSecrets.domain;
168
+ if (githubSecrets.personalAuthToken) {
169
+ // try authenticating with personal authentication token
170
+ status.github.auth.type = 'Personal Auth Token';
171
+ status.github.auth.personalAuthToken = '*redacted*';
172
+ let octokit;
173
+ try {
174
+ octokit = new core_1.Octokit({ baseUrl, auth: githubSecrets.personalAuthToken });
175
+ }
176
+ catch (e) {
177
+ status.github.auth.status = `Unable to authenticate using personal auth token: ${e}`;
178
+ return status;
179
+ }
180
+ try {
181
+ const user = await octokit.request('GET /user');
182
+ status.github.auth.personalAuthToken = `username: ${user.data.login}`;
183
+ }
184
+ catch (e) {
185
+ status.github.auth.status = `Unable to call /user with personal auth token: ${e}`;
186
+ return status;
187
+ }
188
+ status.github.auth.status = 'OK';
189
+ status.github.webhook.status = 'Unable to verify automatically';
190
+ }
191
+ else {
192
+ // try authenticating with GitHub app
193
+ status.github.auth.type = 'GitHub App';
194
+ status.github.auth.app.id = githubSecrets.appId;
195
+ let appOctokit;
196
+ try {
197
+ appOctokit = new core_1.Octokit({
198
+ baseUrl,
199
+ authStrategy: auth_app_1.createAppAuth,
200
+ auth: {
201
+ appId: githubSecrets.appId,
202
+ privateKey: privateKey,
203
+ },
204
+ });
205
+ }
206
+ catch (e) {
207
+ status.github.auth.status = `Unable to authenticate app: ${e}`;
208
+ return status;
209
+ }
210
+ // get app url
211
+ try {
212
+ const app = (await appOctokit.request('GET /app')).data;
213
+ status.github.auth.app.url = app.html_url;
214
+ }
215
+ catch (e) {
216
+ status.github.auth.status = `Unable to get app details: ${e}`;
217
+ return status;
218
+ }
219
+ // list all app installations
220
+ try {
221
+ const installations = (await appOctokit.request('GET /app/installations')).data;
222
+ for (const installation of installations) {
223
+ let installationDetails = {
224
+ id: installation.id,
225
+ url: installation.html_url,
226
+ status: 'Unable to query',
227
+ repositories: [],
228
+ };
229
+ let token;
230
+ try {
231
+ token = (await appOctokit.auth({
232
+ type: 'installation',
233
+ installationId: installation.id,
234
+ })).token;
235
+ }
236
+ catch (e) {
237
+ installationDetails.status = `Unable to authenticate app installation: ${e}`;
238
+ continue;
239
+ }
240
+ let octokit;
241
+ try {
242
+ octokit = new core_1.Octokit({ baseUrl, auth: token });
243
+ }
244
+ catch (e) {
245
+ installationDetails.status = `Unable to authenticate using app: ${e}`;
246
+ continue;
247
+ }
248
+ try {
249
+ const repositories = (await octokit.request('GET /installation/repositories')).data.repositories;
250
+ for (const repo of repositories) {
251
+ installationDetails.repositories.push(repo.full_name);
252
+ }
253
+ }
254
+ catch (e) {
255
+ installationDetails.status = `Unable to authenticate using installation token: ${e}`;
256
+ continue;
257
+ }
258
+ installationDetails.status = 'OK';
259
+ status.github.auth.app.installations.push(installationDetails);
260
+ }
261
+ }
262
+ catch (e) {
263
+ status.github.auth.status = 'Unable to list app installations';
264
+ return status;
265
+ }
266
+ status.github.auth.status = 'OK';
267
+ // check webhook config
268
+ try {
269
+ const response = await appOctokit.request('GET /app/hook/config', {});
270
+ if (response.data.url !== process.env.WEBHOOK_URL) {
271
+ status.github.webhook.status = 'GitHub has wrong webhook URL configured';
272
+ }
273
+ else {
274
+ // TODO check secret by doing a dummy delivery? force apply secret?
275
+ status.github.webhook.status = 'OK (note that secret cannot be checked automatically)';
276
+ }
277
+ }
278
+ catch (e) {
279
+ status.github.webhook.status = `Unable to check app configuration: ${e}`;
280
+ return status;
281
+ }
282
+ }
283
+ return status;
284
+ };
285
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHVzLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3N0YXR1cy5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzREFBc0Q7QUFDdEQsZ0RBQWtEO0FBQ2xELHdDQUF3QztBQUN4QywrQkFBK0I7QUFDL0IscUNBQTZDO0FBQzdDLHVDQUErRDtBQUUvRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxjQUFjLEVBQUUsQ0FBQztBQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztBQUVuQyxTQUFTLGNBQWMsQ0FBQyxHQUFXO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyx3RUFBd0U7SUFDdEcsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFMUQsT0FBTyxXQUFXLE1BQU0sc0RBQXNELE1BQU0sa0JBQWtCLElBQUksRUFBRSxDQUFDO0FBQy9HLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxHQUFXO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxzREFBc0Q7SUFDcEYsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1B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LEdBQUcsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyx5Q0FBeUMsQ0FBQzthQUMxRTtpQkFBTTtnQkFDTCxtRUFBbUU7Z0JBQ25FLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyx1REFBdUQsQ0FBQzthQUN4RjtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsc0NBQXNDLENBQUMsRUFBRSxDQUFDO1lBQ3pFLE9BQU8sTUFBTSxDQUFDO1NBQ2Y7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgY3JlYXRlQXBwQXV0aCB9IGZyb20gJ0BvY3Rva2l0L2F1dGgtYXBwJztcbmltcG9ydCB7IE9jdG9raXQgfSBmcm9tICdAb2N0b2tpdC9jb3JlJztcbmltcG9ydCAqIGFzIEFXUyBmcm9tICdhd3Mtc2RrJztcbmltcG9ydCB7IGJhc2VVcmxGcm9tRG9tYWluIH0gZnJvbSAnLi9naXRodWInO1xuaW1wb3J0IHsgZ2V0U2VjcmV0SnNvblZhbHVlLCBnZXRTZWNyZXRWYWx1ZSB9IGZyb20gJy4vaGVscGVycyc7XG5cbmNvbnN0IGNmbiA9IG5ldyBBV1MuQ2xvdWRGb3JtYXRpb24oKTtcbmNvbnN0IGVjMiA9IG5ldyBBV1MuRUMyKCk7XG5jb25zdCBlY3IgPSBuZXcgQVdTLkVDUigpO1xuY29uc3Qgc2YgPSBuZXcgQVdTLlN0ZXBGdW5jdGlvbnMoKTtcblxuZnVuY3Rpb24gc2VjcmV0QXJuVG9VcmwoYXJuOiBzdHJpbmcpIHtcbiAgY29uc3QgcGFydHMgPSBhcm4uc3BsaXQoJzonKTsgLy8gYXJuOmF3czpzZWNyZXRzbWFuYWdlcjp1cy1lYXN0LTE6MTIzNDU2Nzg6c2VjcmV0OnNlY3JldC1uYW1lLVJFVklTSU9OXG4gIGNvbnN0IHJlZ2lvbiA9IHBhcnRzWzNdO1xuICBjb25zdCBmdWxsTmFtZSA9IHBhcnRzWzZdO1xuICBjb25zdCBuYW1lID0gZnVsbE5hbWUuc2xpY2UoMCwgZnVsbE5hbWUubGFzdEluZGV4T2YoJy0nKSk7XG5cbiAgcmV0dXJuIGBodHRwczovLyR7cmVnaW9ufS5jb25zb2xlLmF3cy5hbWF6b24uY29tL3NlY3JldHNtYW5hZ2VyL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMhL3NlY3JldD9uYW1lPSR7bmFtZX1gO1xufVxuXG5mdW5jdGlvbiBsYW1iZGFBcm5Ub1VybChhcm46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGFybi5zcGxpdCgnOicpOyAvLyBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg6ZnVuY3Rpb246bmFtZS1YWVpcbiAgY29uc3QgcmVnaW9uID0gcGFydHNbM107XG4gIGNvbnN0IG5hbWUgPSBwYXJ0c1s2XTtcblxuICByZXR1cm4gYGh0dHBzOi8vJHtyZWdpb259LmNvbnNvbGUuYXdzLmFtYXpvbi5jb20vbGFtYmRhL2hvbWU/cmVnaW9uPSR7cmVnaW9ufSMvZnVuY3Rpb25zLyR7bmFtZX0/dGFiPW1vbml0b3JpbmdgO1xufVxuXG5mdW5jdGlvbiBzdGVwRnVuY3Rpb25Bcm5Ub1VybChhcm46IHN0cmluZykge1xuICBjb25zdCBwYXJ0cyA9IGFybi5zcGxpdCgnOicpOyAvLyBhcm46YXdzOnN0YXRlczp1cy1lYXN0LTE6MTIzNDU2Nzg6c3RhdGVNYWNoaW5lOm5hbWUtWFlaXG4gIGNvbnN0IHJlZ2lvbiA9IHBhcnRzWzNdO1xuXG4gIHJldHVybiBgaHR0cHM6Ly8ke3JlZ2lvbn0uY29uc29sZS5hd3MuYW1hem9uLmNvbS9zdGF0ZXMvaG9tZT9yZWdpb249JHtyZWdpb259Iy9zdGF0ZW1hY2hpbmVzL3ZpZXcvJHthcm59YDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVQcm92aWRlcnNTdGF0dXMoc3RhY2s6IHN0cmluZywgbG9naWNhbElkOiBzdHJpbmcpIHtcbiAgY29uc3QgcmVzb3VyY2UgPSBhd2FpdCBjZm4uZGVzY3JpYmVTdGFja1Jlc291cmNlKHsgU3RhY2tOYW1lOiBzdGFjaywgTG9naWNhbFJlc291cmNlSWQ6IGxvZ2ljYWxJZCB9KS5wcm9taXNlKCk7XG4gIGNvbnN0IHByb3ZpZGVycyA9IEpTT04ucGFyc2UocmVzb3VyY2UuU3RhY2tSZXNvdXJjZURldGFpbD8uTWV0YWRhdGEgPz8gJ3t9JykucHJvdmlkZXJzIGFzIGFueVtdIHwgdW5kZWZpbmVkO1xuXG4gIGlmICghcHJvdmlkZXJzKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb3ZpZGVycy5tYXAoYXN5bmMgKHApID0+IHtcbiAgICAvLyBhZGQgRUNSIGRhdGEsIGlmIGltYWdlIGlzIGZyb20gRUNSXG4gICAgaWYgKHAuaW1hZ2U/LmltYWdlUmVwb3NpdG9yeT8ubWF0Y2goL1swLTldK1xcLmRrclxcLmVjclxcLlthLXowLTlcXC1dK1xcLmFtYXpvbmF3c1xcLmNvbVxcLy4rLykpIHtcbiAgICAgIGNvbnN0IHRhZ3MgPSBhd2FpdCBlY3IuZGVzY3JpYmVJbWFnZXMoe1xuICAgICAgICByZXBvc2l0b3J5TmFtZTogcC5pbWFnZS5pbWFnZVJlcG9zaXRvcnkuc3BsaXQoJy8nKVsxXSxcbiAgICAgICAgZmlsdGVyOiB7XG4gICAgICAgICAgdGFnU3RhdHVzOiAnVEFHR0VEJyxcbiAgICAgICAgfSxcbiAgICAgICAgbWF4UmVzdWx0czogMSxcbiAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIGlmICh0YWdzLmltYWdlRGV0YWlscyAmJiB0YWdzLmltYWdlRGV0YWlscz8ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgcC5pbWFnZS5sYXRlc3RJbWFnZSA9IHtcbiAgICAgICAgICB0YWdzOiB0YWdzLmltYWdlRGV0YWlsc1swXS5pbWFnZVRhZ3MsXG4gICAgICAgICAgZGlnZXN0OiB0YWdzLmltYWdlRGV0YWlsc1swXS5pbWFnZURpZ2VzdCxcbiAgICAgICAgICBkYXRlOiB0YWdzLmltYWdlRGV0YWlsc1swXS5pbWFnZVB1c2hlZEF0LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBhZGQgQU1JIGRhdGEsIGlmIGltYWdlIGlzIEFNSVxuICAgIGlmIChwLmFtaT8ubGF1bmNoVGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IHZlcnNpb25zID0gYXdhaXQgZWMyLmRlc2NyaWJlTGF1bmNoVGVtcGxhdGVWZXJzaW9ucyh7XG4gICAgICAgIExhdW5jaFRlbXBsYXRlSWQ6IHAuYW1pLmxhdW5jaFRlbXBsYXRlLFxuICAgICAgICBWZXJzaW9uczogWyckRGVmYXVsdCddLFxuICAgICAgfSkucHJvbWlzZSgpO1xuICAgICAgaWYgKHZlcnNpb25zLkxhdW5jaFRlbXBsYXRlVmVyc2lvbnMgJiYgdmVyc2lvbnMuTGF1bmNoVGVtcGxhdGVWZXJzaW9ucy5sZW5ndGggPj0gMSkge1xuICAgICAgICBwLmFtaS5sYXRlc3RBbWkgPSB2ZXJzaW9ucy5MYXVuY2hUZW1wbGF0ZVZlcnNpb25zWzBdLkxhdW5jaFRlbXBsYXRlRGF0YT8uSW1hZ2VJZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHA7XG4gIH0pKTtcbn1cblxuaW50ZXJmYWNlIEFwcEluc3RhbGxhdGlvbiB7XG4gIHJlYWRvbmx5IGlkOiBudW1iZXI7XG4gIHJlYWRvbmx5IHVybDogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVwb3NpdG9yaWVzOiBzdHJpbmdbXTtcbn1cblxuaW50ZXJmYWNlIFJlY2VudFJ1biB7XG4gIHJlYWRvbmx5IG93bmVyPzogc3RyaW5nO1xuICByZWFkb25seSByZXBvPzogc3RyaW5nO1xuICByZWFkb25seSBydW5JZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZXhlY3V0aW9uQXJuPzogc3RyaW5nO1xuICByZWFkb25seSBzdGF0dXM6IHN0cmluZztcbn1cblxuZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKCkge1xuICAvLyBjb25maXJtIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICBpZiAoIXByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTiB8fCAhcHJvY2Vzcy5lbnYuR0lUSFVCX1NFQ1JFVF9BUk4gfHwgIXByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOIHx8ICFwcm9jZXNzLmVudi5MT0dJQ0FMX0lEIHx8XG4gICAgICAhcHJvY2Vzcy5lbnYuV0VCSE9PS19IQU5ETEVSX0FSTiB8fCAhcHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4gfHwgIXByb2Nlc3MuZW52LlNFVFVQX1NFQ1JFVF9BUk4gfHwgIXByb2Nlc3MuZW52LlNFVFVQX0ZVTkNUSU9OX1VSTCB8fFxuICAgICAgIXByb2Nlc3MuZW52LlNUQUNLX05BTUUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzJyk7XG4gIH1cblxuICAvLyBiYXNlIHN0YXR1c1xuICBjb25zdCBzdGF0dXMgPSB7XG4gICAgZ2l0aHViOiB7XG4gICAgICBzZXR1cDoge1xuICAgICAgICBzdGF0dXM6ICdVbmtub3duJyxcbiAgICAgICAgdXJsOiAnJyxcbiAgICAgICAgc2VjcmV0QXJuOiBwcm9jZXNzLmVudi5TRVRVUF9TRUNSRVRfQVJOLFxuICAgICAgICBzZWNyZXRVcmw6IHNlY3JldEFyblRvVXJsKHByb2Nlc3MuZW52LlNFVFVQX1NFQ1JFVF9BUk4pLFxuICAgICAgfSxcbiAgICAgIGRvbWFpbjogJ1Vua25vd24nLFxuICAgICAgd2ViaG9vazoge1xuICAgICAgICB1cmw6IHByb2Nlc3MuZW52LldFQkhPT0tfVVJMLFxuICAgICAgICBzdGF0dXM6ICdVbmFibGUgdG8gY2hlY2snLFxuICAgICAgICBzZWNyZXRBcm46IHByb2Nlc3MuZW52LldFQkhPT0tfU0VDUkVUX0FSTixcbiAgICAgICAgc2VjcmV0VXJsOiBzZWNyZXRBcm5Ub1VybChwcm9jZXNzLmVudi5XRUJIT09LX1NFQ1JFVF9BUk4pLFxuICAgICAgfSxcbiAgICAgIGF1dGg6IHtcbiAgICAgICAgdHlwZTogJ1Vua25vd24nLFxuICAgICAgICBzdGF0dXM6ICdVbmtub3duJyxcbiAgICAgICAgc2VjcmV0QXJuOiBwcm9jZXNzLmVudi5HSVRIVUJfU0VDUkVUX0FSTixcbiAgICAgICAgc2VjcmV0VXJsOiBzZWNyZXRBcm5Ub1VybChwcm9jZXNzLmVudi5HSVRIVUJfU0VDUkVUX0FSTiksXG4gICAgICAgIHByaXZhdGVLZXlTZWNyZXRBcm46IHByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOLFxuICAgICAgICBwcml2YXRlS2V5U2VjcmV0VXJsOiBzZWNyZXRBcm5Ub1VybChwcm9jZXNzLmVudi5HSVRIVUJfUFJJVkFURV9LRVlfU0VDUkVUX0FSTiksXG4gICAgICAgIGFwcDoge1xuICAgICAgICAgIGlkOiAnJyxcbiAgICAgICAgICB1cmw6ICcnLFxuICAgICAgICAgIGluc3RhbGxhdGlvbnM6IFtdIGFzIEFwcEluc3RhbGxhdGlvbltdLFxuICAgICAgICB9LFxuICAgICAgICBwZXJzb25hbEF1dGhUb2tlbjogJycsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBhd2FpdCBnZW5lcmF0ZVByb3ZpZGVyc1N0YXR1cyhwcm9jZXNzLmVudi5TVEFDS19OQU1FLCBwcm9jZXNzLmVudi5MT0dJQ0FMX0lEKSxcbiAgICB0cm91Ymxlc2hvb3Rpbmc6IHtcbiAgICAgIHdlYmhvb2tIYW5kbGVyQXJuOiBwcm9jZXNzLmVudi5XRUJIT09LX0hBTkRMRVJfQVJOLFxuICAgICAgd2ViaG9va0hhbmRsZXJVcmw6IGxhbWJkYUFyblRvVXJsKHByb2Nlc3MuZW52LldFQkhPT0tfSEFORExFUl9BUk4pLFxuICAgICAgc3RlcEZ1bmN0aW9uQXJuOiBwcm9jZXNzLmVudi5TVEVQX0ZVTkNUSU9OX0FSTixcbiAgICAgIHN0ZXBGdW5jdGlvblVybDogc3RlcEZ1bmN0aW9uQXJuVG9VcmwocHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4pLFxuICAgICAgc3RlcEZ1bmN0aW9uTG9nR3JvdXA6IHByb2Nlc3MuZW52LlNURVBfRlVOQ1RJT05fTE9HX0dST1VQLFxuICAgICAgcmVjZW50UnVuczogW10gYXMgUmVjZW50UnVuW10sXG4gICAgfSxcbiAgfTtcblxuICAvLyBzZXR1cCB1cmxcbiAgY29uc3Qgc2V0dXBUb2tlbiA9IChhd2FpdCBnZXRTZWNyZXRKc29uVmFsdWUocHJvY2Vzcy5lbnYuU0VUVVBfU0VDUkVUX0FSTikpLnRva2VuO1xuICBpZiAoc2V0dXBUb2tlbikge1xuICAgIHN0YXR1cy5naXRodWIuc2V0dXAuc3RhdHVzID0gJ1BlbmRpbmcnO1xuICAgIHN0YXR1cy5naXRodWIuc2V0dXAudXJsID0gYCR7cHJvY2Vzcy5lbnYuU0VUVVBfRlVOQ1RJT05fVVJMfT90b2tlbj0ke3NldHVwVG9rZW59YDtcbiAgfSBlbHNlIHtcbiAgICBzdGF0dXMuZ2l0aHViLnNldHVwLnN0YXR1cyA9ICdDb21wbGV0ZSc7XG4gIH1cblxuICAvLyBsaXN0IGxhc3QgMTAgZXhlY3V0aW9ucyBhbmQgdGhlaXIgc3RhdHVzXG4gIHRyeSB7XG4gICAgY29uc3QgZXhlY3V0aW9ucyA9IGF3YWl0IHNmLmxpc3RFeGVjdXRpb25zKHtcbiAgICAgIHN0YXRlTWFjaGluZUFybjogcHJvY2Vzcy5lbnYuU1RFUF9GVU5DVElPTl9BUk4sXG4gICAgICBtYXhSZXN1bHRzOiAxMCxcbiAgICB9KS5wcm9taXNlKCk7XG4gICAgZm9yIChjb25zdCBleGVjdXRpb24gb2YgZXhlY3V0aW9ucy5leGVjdXRpb25zKSB7XG4gICAgICBjb25zdCBleGVjdXRpb25EZXRhaWxzID0gYXdhaXQgc2YuZGVzY3JpYmVFeGVjdXRpb24oe1xuICAgICAgICBleGVjdXRpb25Bcm46IGV4ZWN1dGlvbi5leGVjdXRpb25Bcm4sXG4gICAgICB9KS5wcm9taXNlKCk7XG4gICAgICBjb25zdCBpbnB1dCA9IEpTT04ucGFyc2UoZXhlY3V0aW9uRGV0YWlscy5pbnB1dCB8fCAne30nKTtcblxuICAgICAgc3RhdHVzLnRyb3VibGVzaG9vdGluZy5yZWNlbnRSdW5zLnB1c2goe1xuICAgICAgICBleGVjdXRpb25Bcm46IGV4ZWN1dGlvbi5leGVjdXRpb25Bcm4sXG4gICAgICAgIHN0YXR1czogZXhlY3V0aW9uLnN0YXR1cyxcbiAgICAgICAgb3duZXI6IGlucHV0Lm93bmVyLFxuICAgICAgICByZXBvOiBpbnB1dC5yZXBvLFxuICAgICAgICBydW5JZDogaW5wdXQucnVuSWQsXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBzdGF0dXMudHJvdWJsZXNob290aW5nLnJlY2VudFJ1bnMucHVzaCh7IHN0YXR1czogYEVycm9yIGdldHRpbmcgZXhlY3V0aW9uczogJHtlfWAgfSk7XG4gIH1cblxuICAvLyBnZXQgc2VjcmV0c1xuICBsZXQgZ2l0aHViU2VjcmV0cztcbiAgdHJ5IHtcbiAgICBnaXRodWJTZWNyZXRzID0gYXdhaXQgZ2V0U2VjcmV0SnNvblZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9TRUNSRVRfQVJOKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIHJlYWQgc2VjcmV0OiAke2V9YDtcbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgbGV0IHByaXZhdGVLZXk7XG4gIHRyeSB7XG4gICAgcHJpdmF0ZUtleSA9IGF3YWl0IGdldFNlY3JldFZhbHVlKHByb2Nlc3MuZW52LkdJVEhVQl9QUklWQVRFX0tFWV9TRUNSRVRfQVJOKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIHJlYWQgcHJpdmF0ZSBrZXkgc2VjcmV0OiAke2V9YDtcbiAgICByZXR1cm4gc3RhdHVzO1xuICB9XG5cbiAgLy8gY2FsY3VsYXRlIGJhc2UgdXJsXG4gIGxldCBiYXNlVXJsID0gYmFzZVVybEZyb21Eb21haW4oZ2l0aHViU2VjcmV0cy5kb21haW4pO1xuICBzdGF0dXMuZ2l0aHViLmRvbWFpbiA9IGdpdGh1YlNlY3JldHMuZG9tYWluO1xuXG4gIGlmIChnaXRodWJTZWNyZXRzLnBlcnNvbmFsQXV0aFRva2VuKSB7XG4gICAgLy8gdHJ5IGF1dGhlbnRpY2F0aW5nIHdpdGggcGVyc29uYWwgYXV0aGVudGljYXRpb24gdG9rZW5cbiAgICBzdGF0dXMuZ2l0aHViLmF1dGgudHlwZSA9ICdQZXJzb25hbCBBdXRoIFRva2VuJztcbiAgICBzdGF0dXMuZ2l0aHViLmF1dGgucGVyc29uYWxBdXRoVG9rZW4gPSAnKnJlZGFjdGVkKic7XG5cbiAgICBsZXQgb2N0b2tpdDtcbiAgICB0cnkge1xuICAgICAgb2N0b2tpdCA9IG5ldyBPY3Rva2l0KHsgYmFzZVVybCwgYXV0aDogZ2l0aHViU2VjcmV0cy5wZXJzb25hbEF1dGhUb2tlbiB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNpbmcgcGVyc29uYWwgYXV0aCB0b2tlbjogJHtlfWA7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB1c2VyID0gYXdhaXQgb2N0b2tpdC5yZXF1ZXN0KCdHRVQgL3VzZXInKTtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5wZXJzb25hbEF1dGhUb2tlbiA9IGB1c2VybmFtZTogJHt1c2VyLmRhdGEubG9naW59YDtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gYFVuYWJsZSB0byBjYWxsIC91c2VyIHdpdGggcGVyc29uYWwgYXV0aCB0b2tlbjogJHtlfWA7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSAnT0snO1xuICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSAnVW5hYmxlIHRvIHZlcmlmeSBhdXRvbWF0aWNhbGx5JztcbiAgfSBlbHNlIHtcbiAgICAvLyB0cnkgYXV0aGVudGljYXRpbmcgd2l0aCBHaXRIdWIgYXBwXG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnR5cGUgPSAnR2l0SHViIEFwcCc7XG4gICAgc3RhdHVzLmdpdGh1Yi5hdXRoLmFwcC5pZCA9IGdpdGh1YlNlY3JldHMuYXBwSWQ7XG5cbiAgICBsZXQgYXBwT2N0b2tpdDtcbiAgICB0cnkge1xuICAgICAgYXBwT2N0b2tpdCA9IG5ldyBPY3Rva2l0KHtcbiAgICAgICAgYmFzZVVybCxcbiAgICAgICAgYXV0aFN0cmF0ZWd5OiBjcmVhdGVBcHBBdXRoLFxuICAgICAgICBhdXRoOiB7XG4gICAgICAgICAgYXBwSWQ6IGdpdGh1YlNlY3JldHMuYXBwSWQsXG4gICAgICAgICAgcHJpdmF0ZUtleTogcHJpdmF0ZUtleSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSBgVW5hYmxlIHRvIGF1dGhlbnRpY2F0ZSBhcHA6ICR7ZX1gO1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG5cbiAgICAvLyBnZXQgYXBwIHVybFxuICAgIHRyeSB7XG4gICAgICBjb25zdCBhcHAgPSAoYXdhaXQgYXBwT2N0b2tpdC5yZXF1ZXN0KCdHRVQgL2FwcCcpKS5kYXRhO1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLmFwcC51cmwgPSBhcHAuaHRtbF91cmw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgc3RhdHVzLmdpdGh1Yi5hdXRoLnN0YXR1cyA9IGBVbmFibGUgdG8gZ2V0IGFwcCBkZXRhaWxzOiAke2V9YDtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuXG4gICAgLy8gbGlzdCBhbGwgYXBwIGluc3RhbGxhdGlvbnNcbiAgICB0cnkge1xuICAgICAgY29uc3QgaW5zdGFsbGF0aW9ucyA9IChhd2FpdCBhcHBPY3Rva2l0LnJlcXVlc3QoJ0dFVCAvYXBwL2luc3RhbGxhdGlvbnMnKSkuZGF0YTtcbiAgICAgIGZvciAoY29uc3QgaW5zdGFsbGF0aW9uIG9mIGluc3RhbGxhdGlvbnMpIHtcbiAgICAgICAgbGV0IGluc3RhbGxhdGlvbkRldGFpbHMgPSB7XG4gICAgICAgICAgaWQ6IGluc3RhbGxhdGlvbi5pZCxcbiAgICAgICAgICB1cmw6IGluc3RhbGxhdGlvbi5odG1sX3VybCxcbiAgICAgICAgICBzdGF0dXM6ICdVbmFibGUgdG8gcXVlcnknLFxuICAgICAgICAgIHJlcG9zaXRvcmllczogW10gYXMgc3RyaW5nW10sXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRva2VuO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRva2VuID0gKGF3YWl0IGFwcE9jdG9raXQuYXV0aCh7XG4gICAgICAgICAgICB0eXBlOiAnaW5zdGFsbGF0aW9uJyxcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbklkOiBpbnN0YWxsYXRpb24uaWQsXG4gICAgICAgICAgfSkgYXMgYW55KS50b2tlbjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMuc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgYXBwIGluc3RhbGxhdGlvbjogJHtlfWA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb2N0b2tpdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBvY3Rva2l0ID0gbmV3IE9jdG9raXQoeyBiYXNlVXJsLCBhdXRoOiB0b2tlbiB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMuc3RhdHVzID0gYFVuYWJsZSB0byBhdXRoZW50aWNhdGUgdXNpbmcgYXBwOiAke2V9YDtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcmVwb3NpdG9yaWVzID0gKGF3YWl0IG9jdG9raXQucmVxdWVzdCgnR0VUIC9pbnN0YWxsYXRpb24vcmVwb3NpdG9yaWVzJykpLmRhdGEucmVwb3NpdG9yaWVzO1xuICAgICAgICAgIGZvciAoY29uc3QgcmVwbyBvZiByZXBvc2l0b3JpZXMpIHtcbiAgICAgICAgICAgIGluc3RhbGxhdGlvbkRldGFpbHMucmVwb3NpdG9yaWVzLnB1c2gocmVwby5mdWxsX25hbWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpbnN0YWxsYXRpb25EZXRhaWxzLnN0YXR1cyA9IGBVbmFibGUgdG8gYXV0aGVudGljYXRlIHVzaW5nIGluc3RhbGxhdGlvbiB0b2tlbjogJHtlfWA7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpbnN0YWxsYXRpb25EZXRhaWxzLnN0YXR1cyA9ICdPSyc7XG4gICAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5hcHAuaW5zdGFsbGF0aW9ucy5wdXNoKGluc3RhbGxhdGlvbkRldGFpbHMpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIuYXV0aC5zdGF0dXMgPSAnVW5hYmxlIHRvIGxpc3QgYXBwIGluc3RhbGxhdGlvbnMnO1xuICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICB9XG5cbiAgICBzdGF0dXMuZ2l0aHViLmF1dGguc3RhdHVzID0gJ09LJztcblxuICAgIC8vIGNoZWNrIHdlYmhvb2sgY29uZmlnXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgYXBwT2N0b2tpdC5yZXF1ZXN0KCdHRVQgL2FwcC9ob29rL2NvbmZpZycsIHt9KTtcblxuICAgICAgaWYgKHJlc3BvbnNlLmRhdGEudXJsICE9PSBwcm9jZXNzLmVudi5XRUJIT09LX1VSTCkge1xuICAgICAgICBzdGF0dXMuZ2l0aHViLndlYmhvb2suc3RhdHVzID0gJ0dpdEh1YiBoYXMgd3Jvbmcgd2ViaG9vayBVUkwgY29uZmlndXJlZCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUT0RPIGNoZWNrIHNlY3JldCBieSBkb2luZyBhIGR1bW15IGRlbGl2ZXJ5PyBmb3JjZSBhcHBseSBzZWNyZXQ/XG4gICAgICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSAnT0sgKG5vdGUgdGhhdCBzZWNyZXQgY2Fubm90IGJlIGNoZWNrZWQgYXV0b21hdGljYWxseSknO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHN0YXR1cy5naXRodWIud2ViaG9vay5zdGF0dXMgPSBgVW5hYmxlIHRvIGNoZWNrIGFwcCBjb25maWd1cmF0aW9uOiAke2V9YDtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHN0YXR1cztcbn07XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for TokenRetrieverFunction
5
+ */
6
+ export interface TokenRetrieverFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/token-retriever.
10
+ */
11
+ export declare class TokenRetrieverFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: TokenRetrieverFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenRetrieverFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/lambdas/token-retriever.
9
+ */
10
+ class TokenRetrieverFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/token-retriever.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/token-retriever.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.TokenRetrieverFunction = TokenRetrieverFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV0cmlldmVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvdG9rZW4tcmV0cmlldmVyLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUN6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztTQUNqRyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELHdEQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy5qcyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBUb2tlblJldHJpZXZlckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9rZW5SZXRyaWV2ZXJGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvbGFtYmRhcy90b2tlbi1yZXRyaWV2ZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBUb2tlblJldHJpZXZlckZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBUb2tlblJldHJpZXZlckZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2xhbWJkYXMvdG9rZW4tcmV0cmlldmVyLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTQueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Fzc2V0cy9sYW1iZGFzL3Rva2VuLXJldHJpZXZlci5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const github_1 = require("./github");
4
+ exports.handler = async function (event) {
5
+ const { githubSecrets, octokit } = await github_1.getOctokit(event.installationId);
6
+ const response = await octokit.rest.actions.createRegistrationTokenForRepo({
7
+ owner: event.owner,
8
+ repo: event.repo,
9
+ });
10
+ return {
11
+ domain: githubSecrets.domain,
12
+ token: response.data.token,
13
+ };
14
+ };
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tcmV0cmlldmVyLmxhbWJkYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3Rva2VuLXJldHJpZXZlci5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBc0M7QUFHdEMsT0FBTyxDQUFDLE9BQU8sR0FBRyxLQUFLLFdBQVcsS0FBOEI7SUFDOUQsTUFBTSxFQUFFLGFBQWEsRUFBRSxPQUFPLEVBQUUsR0FBRyxNQUFNLG1CQUFVLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sUUFBUSxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUM7UUFDekUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO1FBQ2xCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtLQUNqQixDQUFDLENBQUM7SUFFSCxPQUFPO1FBQ0wsTUFBTSxFQUFFLGFBQWEsQ0FBQyxNQUFNO1FBQzVCLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUs7S0FDM0IsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldE9jdG9raXQgfSBmcm9tICcuL2dpdGh1Yic7XG5pbXBvcnQgeyBTdGVwRnVuY3Rpb25MYW1iZGFJbnB1dCB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydHMuaGFuZGxlciA9IGFzeW5jIGZ1bmN0aW9uIChldmVudDogU3RlcEZ1bmN0aW9uTGFtYmRhSW5wdXQpIHtcbiAgY29uc3QgeyBnaXRodWJTZWNyZXRzLCBvY3Rva2l0IH0gPSBhd2FpdCBnZXRPY3Rva2l0KGV2ZW50Lmluc3RhbGxhdGlvbklkKTtcblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IG9jdG9raXQucmVzdC5hY3Rpb25zLmNyZWF0ZVJlZ2lzdHJhdGlvblRva2VuRm9yUmVwbyh7XG4gICAgb3duZXI6IGV2ZW50Lm93bmVyLFxuICAgIHJlcG86IGV2ZW50LnJlcG8sXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgZG9tYWluOiBnaXRodWJTZWNyZXRzLmRvbWFpbixcbiAgICB0b2tlbjogcmVzcG9uc2UuZGF0YS50b2tlbixcbiAgfTtcbn07XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for UpdateLambdaFunction
5
+ */
6
+ export interface UpdateLambdaFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/update-lambda.
10
+ */
11
+ export declare class UpdateLambdaFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: UpdateLambdaFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateLambdaFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/lambdas/update-lambda.
9
+ */
10
+ class UpdateLambdaFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/update-lambda.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/update-lambda.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.UpdateLambdaFunction = UpdateLambdaFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWxhbWJkYS1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYW1iZGFzL3VwZGF0ZS1sYW1iZGEtZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkVBQTZFO0FBQzdFLDZCQUE2QjtBQUM3QixpREFBaUQ7QUFTakQ7O0dBRUc7QUFDSCxNQUFhLG9CQUFxQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ3ZELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUscUNBQXFDO1lBQ2xELEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwyQ0FBMkMsQ0FBQyxDQUFDO1NBQy9GLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsb0RBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLmpzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIFVwZGF0ZUxhbWJkYUZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlTGFtYmRhRnVuY3Rpb25Qcm9wcyBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMge1xufVxuXG4vKipcbiAqIEFuIEFXUyBMYW1iZGEgZnVuY3Rpb24gd2hpY2ggZXhlY3V0ZXMgc3JjL2xhbWJkYXMvdXBkYXRlLWxhbWJkYS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVwZGF0ZUxhbWJkYUZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBVcGRhdGVMYW1iZGFGdW5jdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NyYy9sYW1iZGFzL3VwZGF0ZS1sYW1iZGEubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMxNC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vYXNzZXRzL2xhbWJkYXMvdXBkYXRlLWxhbWJkYS5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -0,0 +1,7 @@
1
+ interface Input {
2
+ readonly lambdaName: string;
3
+ readonly repositoryUri: string;
4
+ readonly repositoryTag: string;
5
+ }
6
+ export declare function handler(event: Input): Promise<void>;
7
+ export {};
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ /* eslint-disable-next-line import/no-extraneous-dependencies */
5
+ const AWS = require("aws-sdk");
6
+ const lambda = new AWS.Lambda();
7
+ function sleep(ms) {
8
+ return new Promise(resolve => setTimeout(resolve, ms));
9
+ }
10
+ async function handler(event) {
11
+ console.log(JSON.stringify(event));
12
+ while (true) {
13
+ try {
14
+ await lambda.updateFunctionCode({
15
+ FunctionName: event.lambdaName,
16
+ ImageUri: `${event.repositoryUri}:${event.repositoryTag}`,
17
+ Publish: true,
18
+ }).promise();
19
+ break;
20
+ }
21
+ catch (e) {
22
+ if (e.code == 'ResourceConflictException') {
23
+ // keep trying if function is already being updated by CloudFormation
24
+ // this can happen if we update some settings on the function and the image code at the same time
25
+ await sleep(10000);
26
+ }
27
+ else {
28
+ throw e;
29
+ }
30
+ }
31
+ }
32
+ }
33
+ exports.handler = handler;
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLWxhbWJkYS5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGFtYmRhcy91cGRhdGUtbGFtYmRhLmxhbWJkYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnRUFBZ0U7QUFDaEUsK0JBQStCO0FBSS9CLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO0FBUWhDLFNBQVMsS0FBSyxDQUFDLEVBQVU7SUFDdkIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRU0sS0FBSyxVQUFVLE9BQU8sQ0FBQyxLQUFZO0lBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBRW5DLE9BQU8sSUFBSSxFQUFFO1FBQ1gsSUFBSTtZQUNGLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDO2dCQUM5QixZQUFZLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzlCLFFBQVEsRUFBRSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUksS0FBSyxDQUFDLGFBQWEsRUFBRTtnQkFDekQsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixNQUFNO1NBQ1A7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLElBQWUsQ0FBRSxDQUFDLElBQUksSUFBSSwyQkFBMkIsRUFBRTtnQkFDckQscUVBQXFFO2dCQUNyRSxpR0FBaUc7Z0JBQ2pHLE1BQU0sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxDQUFDO2FBQ1Q7U0FDRjtLQUNGO0FBQ0gsQ0FBQztBQXJCRCwwQkFxQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgKiBhcyBBV1MgZnJvbSAnYXdzLXNkayc7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBBV1NFcnJvciB9IGZyb20gJ2F3cy1zZGsvbGliL2Vycm9yJztcblxuY29uc3QgbGFtYmRhID0gbmV3IEFXUy5MYW1iZGEoKTtcblxuaW50ZXJmYWNlIElucHV0IHtcbiAgcmVhZG9ubHkgbGFtYmRhTmFtZTogc3RyaW5nO1xuICByZWFkb25seSByZXBvc2l0b3J5VXJpOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHJlcG9zaXRvcnlUYWc6IHN0cmluZztcbn1cblxuZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoYW5kbGVyKGV2ZW50OiBJbnB1dCkge1xuICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShldmVudCkpO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGxhbWJkYS51cGRhdGVGdW5jdGlvbkNvZGUoe1xuICAgICAgICBGdW5jdGlvbk5hbWU6IGV2ZW50LmxhbWJkYU5hbWUsXG4gICAgICAgIEltYWdlVXJpOiBgJHtldmVudC5yZXBvc2l0b3J5VXJpfToke2V2ZW50LnJlcG9zaXRvcnlUYWd9YCxcbiAgICAgICAgUHVibGlzaDogdHJ1ZSxcbiAgICAgIH0pLnByb21pc2UoKTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmICgoPEFXU0Vycm9yPmUpLmNvZGUgPT0gJ1Jlc291cmNlQ29uZmxpY3RFeGNlcHRpb24nKSB7XG4gICAgICAgIC8vIGtlZXAgdHJ5aW5nIGlmIGZ1bmN0aW9uIGlzIGFscmVhZHkgYmVpbmcgdXBkYXRlZCBieSBDbG91ZEZvcm1hdGlvblxuICAgICAgICAvLyB0aGlzIGNhbiBoYXBwZW4gaWYgd2UgdXBkYXRlIHNvbWUgc2V0dGluZ3Mgb24gdGhlIGZ1bmN0aW9uIGFuZCB0aGUgaW1hZ2UgY29kZSBhdCB0aGUgc2FtZSB0aW1lXG4gICAgICAgIGF3YWl0IHNsZWVwKDEwMDAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for WebhookHandlerFunction
5
+ */
6
+ export interface WebhookHandlerFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/lambdas/webhook-handler.
10
+ */
11
+ export declare class WebhookHandlerFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: WebhookHandlerFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebhookHandlerFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/lambdas/webhook-handler.
9
+ */
10
+ class WebhookHandlerFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/lambdas/webhook-handler.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs14.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../../assets/lambdas/webhook-handler.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.WebhookHandlerFunction = WebhookHandlerFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xhbWJkYXMvd2ViaG9vay1oYW5kbGVyLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSxNQUFNLENBQUMsUUFBUTtJQUN6RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQ2YsV0FBVyxFQUFFLHVDQUF1QztZQUNwRCxHQUFHLEtBQUs7WUFDUixPQUFPLEVBQUUsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztZQUN0RSxPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsNkNBQTZDLENBQUMsQ0FBQztTQUNqRyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsY0FBYyxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLENBQUM7Q0FDRjtBQVhELHdEQVdDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gfn4gR2VuZXJhdGVkIGJ5IHByb2plbi4gVG8gbW9kaWZ5LCBlZGl0IC5wcm9qZW5yYy5qcyBhbmQgcnVuIFwibnB4IHByb2plblwiLlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuXG4vKipcbiAqIFByb3BzIGZvciBXZWJob29rSGFuZGxlckZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va0hhbmRsZXJGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvbGFtYmRhcy93ZWJob29rLWhhbmRsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBXZWJob29rSGFuZGxlckZ1bmN0aW9uIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBXZWJob29rSGFuZGxlckZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2xhbWJkYXMvd2ViaG9vay1oYW5kbGVyLmxhbWJkYS50cycsXG4gICAgICAuLi5wcm9wcyxcbiAgICAgIHJ1bnRpbWU6IG5ldyBsYW1iZGEuUnVudGltZSgnbm9kZWpzMTQueCcsIGxhbWJkYS5SdW50aW1lRmFtaWx5Lk5PREVKUyksXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgJy4uLy4uL2Fzc2V0cy9sYW1iZGFzL3dlYmhvb2staGFuZGxlci5sYW1iZGEnKSksXG4gICAgfSk7XG4gICAgdGhpcy5hZGRFbnZpcm9ubWVudCgnQVdTX05PREVKU19DT05ORUNUSU9OX1JFVVNFX0VOQUJMRUQnLCAnMScsIHsgcmVtb3ZlSW5FZGdlOiB0cnVlIH0pO1xuICB9XG59Il19
@@ -0,0 +1 @@
1
+ export {};