@cloudsnorkel/cdk-github-runners 0.8.1 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (96) hide show
  1. package/.gitattributes +9 -0
  2. package/.jsii +447 -263
  3. package/API.md +1714 -500
  4. package/README.md +20 -3
  5. package/{lib/providers/docker-images/lambda/linux-x64 → assets/docker-images/lambda/linux-arm64}/runner.sh +6 -0
  6. package/{lib/providers/docker-images/lambda/linux-arm64 → assets/docker-images/lambda/linux-x64}/runner.sh +6 -0
  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 +10 -3
  57. package/lib/providers/codebuild.js +17 -9
  58. package/lib/providers/common.js +3 -3
  59. package/lib/providers/ec2.d.ts +11 -4
  60. package/lib/providers/ec2.js +14 -6
  61. package/lib/providers/fargate.d.ts +10 -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 +10 -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 +29 -13
  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
@@ -1,291 +0,0 @@
1
- <script lang="ts">
2
- const secret = 'INSERT_SECRET_ARN_HERE';
3
- const token = 'INSERT_TOKEN_HERE';
4
- let instance: undefined | 'github.com' | 'ghes';
5
- let domain = 'INSERT_DOMAIN_HERE';
6
- let auth: undefined | 'newApp' | 'existingApp' | 'pat';
7
- let appScope: 'user' | 'org' = 'user';
8
- let org = 'ORGANIZATION';
9
- let existingAppId: string = '';
10
- let existingAppPk: string = '';
11
- let pat: string = '';
12
- let success: boolean;
13
- let result: string | undefined;
14
-
15
- const manifest = {
16
- url: 'https://github.com/CloudSnorkel/cdk-github-runners',
17
- hook_attributes: {
18
- url: 'INSERT_WEBHOOK_URL_HERE',
19
- },
20
- redirect_url: `INSERT_BASE_URL_HERE/complete-new-app`,
21
- public: false,
22
- default_permissions: {
23
- actions: 'write',
24
- administration: 'write',
25
- },
26
- default_events: [
27
- 'workflow_job',
28
- ],
29
- };
30
-
31
- function isSubmitDisabled(instance, auth, existingAppId, existingAppPk, pat, success) {
32
- if (success) {
33
- return true;
34
- }
35
- if (instance === undefined || auth === undefined) {
36
- return true;
37
- }
38
- if (auth === 'newApp') {
39
- return false;
40
- }
41
- if (auth === 'existingApp') {
42
- return existingAppId === '' || existingAppPk === '';
43
- }
44
- if (auth === 'pat') {
45
- return pat === '';
46
- }
47
- console.error('Something is broken', instance, auth, existingAppId);
48
- return true;
49
- }
50
-
51
- function submitText(auth) {
52
- if (auth === 'newApp') {
53
- return 'Create GitHub App';
54
- }
55
- return 'Setup';
56
- }
57
-
58
- function postJson(url, data): Promise<string> {
59
- return new Promise<string>((resolve, reject) => {
60
- fetch(`${url}?token=${token}`, {
61
- method: 'POST',
62
- mode: 'same-origin',
63
- headers: {
64
- 'Content-Type': 'application/json',
65
- },
66
- body: JSON.stringify(data),
67
- redirect: 'error',
68
- })
69
- .then(response => {
70
- if (!response.ok) {
71
- response.text()
72
- .then(text => {
73
- reject(new Error(`${text} [${response.status}]`));
74
- })
75
- .catch(reject);
76
- } else {
77
- response.text()
78
- .then(resolve)
79
- .catch(reject);
80
- }
81
- })
82
- .catch(reject);
83
- });
84
- }
85
-
86
- function submit(ev) {
87
- ev.preventDefault();
88
-
89
- function promise(): Promise<string> {
90
- const rightDomain = instance === 'ghes' ? domain : 'github.com';
91
- switch (auth) {
92
- case 'newApp':
93
- return postJson('domain', { domain: rightDomain })
94
- .then(_ => {
95
- (document.getElementById('appform') as HTMLFormElement).submit();
96
- return Promise.resolve('Redirecting to GitHub...');
97
- });
98
- case 'existingApp':
99
- return postJson('app', {
100
- appid: existingAppId,
101
- pk: existingAppPk,
102
- domain: rightDomain,
103
- });
104
- case 'pat':
105
- return postJson('pat', {
106
- pat: pat,
107
- domain: rightDomain,
108
- });
109
- }
110
- }
111
-
112
- promise()
113
- .then(successText => {
114
- result = successText;
115
- success = true;
116
- })
117
- .catch(error => {
118
- result = `${error}`;
119
- success = false;
120
- });
121
- }
122
- </script>
123
-
124
- <main>
125
- <div class="container py-3 px-2">
126
- <div class="row">
127
- <form class="col" on:submit={submit}>
128
- <h1>Setup GitHub Runners</h1>
129
- <p>Answer all the questions on this page to automatically configure GitHub integration and get the
130
- runners working. This page will not be accessible once you complete this operation. If you ever want
131
- to access it again, edit <code>{secret}</code> and run the status function again.</p>
132
-
133
- <h3>Choose GitHub Instance</h3>
134
- <div class="px-3 py-3">
135
- <p>Are your repositories hosted on GitHub.com or are you using an on-premise installation of GitHub
136
- Enterprise Server?</p>
137
- <div class="form-check">
138
- <input class="form-check-input" type="radio" bind:group={instance} value="github.com"
139
- id="github.com">
140
- <label class="form-check-label" for="github.com">
141
- GitHub.com
142
- </label>
143
- </div>
144
- <div class="form-check">
145
- <input class="form-check-input" type="radio" bind:group={instance} value="ghes" id="ghes">
146
- <label class="form-check-label" for="ghes">
147
- GitHub Enterprise Server
148
- </label>
149
- </div>
150
- </div>
151
-
152
- {#if instance === 'ghes'}
153
- <h3>GitHub Enterprise Server Domain</h3>
154
- <div class="px-3 py-3">
155
- <p>Where is GitHub Enterprise Server hosted? Type in the domain without <code>https://</code>
156
- and without any path. It should look something like <code>github.mycompany.com</code>.</p>
157
- <input class="form-control" bind:value={domain}>
158
- </div>
159
- {/if}
160
-
161
- {#if instance}
162
- <h3>Authentication Type</h3>
163
- <div class="px-3 py-3">
164
- <p>You can choose between creating a new app that will provide authentication for specific
165
- repositories, or a personal access token that will provide access to all repositories
166
- available to you. Apps are easier to set up and provide more fine-grained access control. If
167
- you have previously created an app, you can choose to use an existing app.</p>
168
- <div class="form-check">
169
- <input class="form-check-input" type="radio" bind:group={auth} value="newApp" id="newApp">
170
- <label class="form-check-label" for="newApp">
171
- New GitHub App <b>(recommended)</b>
172
- </label>
173
- </div>
174
- <div class="form-check">
175
- <input class="form-check-input" type="radio" bind:group={auth} value="existingApp"
176
- id="existingApp">
177
- <label class="form-check-label" for="existingApp">
178
- Existing GitHub App
179
- </label>
180
- </div>
181
- <div class="form-check">
182
- <input class="form-check-input" type="radio" bind:group={auth} value="pat" id="pat">
183
- <label class="form-check-label" for="pat">
184
- Personal Authentication Token
185
- </label>
186
- </div>
187
- </div>
188
- {/if}
189
-
190
- {#if auth === 'newApp'}
191
- <h3>New App Settings</h3>
192
- <div class="px-3 py-3">
193
- <p>Choose whether to create a new personal app or organization app. A private personal app can
194
- only be used for repositories under your user. A private origination app can only be used
195
- for repositories under that organization.</p>
196
- <div class="form-check">
197
- <input class="form-check-input" type="radio" bind:group={appScope} value="user"
198
- id="userScope">
199
- <label class="form-check-label" for="userScope">
200
- User app
201
- </label>
202
- </div>
203
- <div class="form-check">
204
- <input class="form-check-input" type="radio" bind:group={appScope} value="org"
205
- id="orgScope">
206
- <label class="form-check-label" for="orgScope">
207
- Organization app
208
- </label>
209
- </div>
210
- {#if instance === 'ghes'}
211
- <p class="pt-2">If multiple organizations under the same GitHub Enterprise Server need to use the runners,
212
- you can make the app public.</p>
213
- <div class="form-check">
214
- <input class="form-check-input" type="checkbox" bind:checked={manifest.public} id="public">
215
- <label class="form-check-label" for="public">
216
- Public app
217
- </label>
218
- </div>
219
- {/if}
220
- </div>
221
-
222
- {#if appScope === 'org'}
223
- <h3>Organization name</h3>
224
- <div class="px-3 py-3">
225
- <p>What is the slug for your organization? If your repositories have a URL like
226
- <code>https://{domain}/MyOrg/my-repo</code>
227
- then your organization slug is <code>MyOrg</code>.</p>
228
- <input class="form-control" bind:value={org}>
229
- </div>
230
- {/if}
231
- {:else if auth === 'existingApp'}
232
- <h3>Existing App Details</h3>
233
- <div class="px-3 py-3">
234
- <p>Existing apps must have <code>actions</code> and <code>administration</code> write
235
- permissions. Don't forget to set up the webhook and its secret as described in <a
236
- href="https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md">SETUP_GITHUB.md</a>.
237
- </p>
238
- <div class="form-group row px-3 py-2">
239
- <label for="appid" class="col-sm-2 col-form-label">App Id</label>
240
- <div class="col-sm-10">
241
- <input type="number" class="form-control" id="appid" bind:value={existingAppId}>
242
- </div>
243
- </div>
244
- <div class="form-group row px-3 py-2">
245
- <label for="pk" class="col-sm-2 col-form-label">Private Key</label>
246
- <div class="col-sm-10">
247
- <textarea class="form-control" id="pk" bind:value={existingAppPk} rows="10"></textarea>
248
- </div>
249
- </div>
250
- </div>
251
- {:else if auth === 'pat'}
252
- <h2>Personal Access Token</h2>
253
- <div class="px-3 py-3">
254
- <p>The <a href="https://{domain}/settings/tokens">personal access token</a> must have the <code>repo</code>
255
- scope enabled. Don't forget to also create a webhook as described in <a
256
- href="https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md">SETUP_GITHUB.md</a>.
257
- </p>
258
- <input class="form-control" bind:value={pat}
259
- placeholder="Token e.g. ghp_abcdefghijklmnopqrstuvwxyz1234567890">
260
- </div>
261
- {/if}
262
-
263
- <h2>Finish Setup</h2>
264
- <div class="px-3 py-3">
265
- {#if result === undefined}
266
- <p>This button will be enabled once all the questions above are answered.</p>
267
- {:else}
268
- <div class="alert alert-{success ? 'success' : 'danger'}" role="alert">
269
- {result}
270
- </div>
271
- {/if}
272
- {#if manifest.public && auth === 'newApp'}
273
- <p><b class="text-danger">WARNING:</b> using a public app means anyone with access to <code>{domain}</code>
274
- can use the runners you're setting up now. Anyone can create a workflow that will run on those runners,
275
- have access to their instance profile, and be part of their security group. Consider the security
276
- implications before continuing.</p>
277
- {/if}
278
- <button type="submit" class="btn btn-success"
279
- disabled={isSubmitDisabled(instance, auth, existingAppId, existingAppPk, pat, success)}>
280
- {submitText(auth)}
281
- </button>
282
- </div>
283
- </form>
284
- </div>
285
- </div>
286
-
287
- <form action="https://{domain}/{appScope === 'org' ? `organizations/${org}/` : ''}settings/apps/new?state={token}"
288
- method="post" id="appform">
289
- <input type="hidden" name="manifest" value={JSON.stringify(manifest)}>
290
- </form>
291
- </main>
@@ -1,15 +0,0 @@
1
- @import "~bootstrap/scss/functions";
2
- @import "~bootstrap/scss/variables";
3
- @import "~bootstrap/scss/mixins";
4
- @import "~bootstrap/scss/maps";
5
- @import "~bootstrap/scss/utilities";
6
- @import "~bootstrap/scss/utilities/api";
7
-
8
- @import "~bootstrap/scss/root";
9
- @import "~bootstrap/scss/reboot";
10
- @import "~bootstrap/scss/type";
11
- @import "~bootstrap/scss/containers";
12
- @import "~bootstrap/scss/grid";
13
- @import "~bootstrap/scss/forms";
14
- @import "~bootstrap/scss/buttons";
15
- @import "~bootstrap/scss/alert";
package/setup/src/main.ts DELETED
@@ -1,8 +0,0 @@
1
- import './app.scss'
2
- import App from './App.svelte'
3
-
4
- const app = new App({
5
- target: document.getElementById('app')
6
- })
7
-
8
- export default app
@@ -1,2 +0,0 @@
1
- /// <reference types="svelte" />
2
- /// <reference types="vite/client" />
@@ -1,7 +0,0 @@
1
- import sveltePreprocess from 'svelte-preprocess'
2
-
3
- export default {
4
- // Consult https://github.com/sveltejs/svelte-preprocess
5
- // for more information about preprocessors
6
- preprocess: sveltePreprocess()
7
- }
@@ -1,21 +0,0 @@
1
- {
2
- "extends": "@tsconfig/svelte/tsconfig.json",
3
- "compilerOptions": {
4
- "target": "ESNext",
5
- "useDefineForClassFields": true,
6
- "module": "ESNext",
7
- "resolveJsonModule": true,
8
- "baseUrl": ".",
9
- /**
10
- * Typecheck JS in `.svelte` and `.js` files by default.
11
- * Disable checkJs if you'd like to use dynamic types in JS.
12
- * Note that setting allowJs false does not prevent the use
13
- * of JS in `.svelte` files.
14
- */
15
- "allowJs": true,
16
- "checkJs": true,
17
- "isolatedModules": true
18
- },
19
- "include": ["src/**/*.d.ts", "src/**/*.ts", "src/**/*.js", "src/**/*.svelte"],
20
- "references": [{ "path": "./tsconfig.node.json" }]
21
- }
@@ -1,8 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "composite": true,
4
- "module": "ESNext",
5
- "moduleResolution": "Node"
6
- },
7
- "include": ["vite.config.ts"]
8
- }
@@ -1,15 +0,0 @@
1
- import { defineConfig } from 'vite';
2
- import { svelte } from '@sveltejs/vite-plugin-svelte';
3
- import * as path from 'path';
4
- import { viteSingleFile } from 'vite-plugin-singlefile';
5
-
6
-
7
- // https://vitejs.dev/config/
8
- export default defineConfig({
9
- plugins: [svelte(), viteSingleFile()],
10
- resolve: {
11
- alias: {
12
- '~bootstrap': path.resolve(__dirname, '..', 'node_modules/bootstrap'),
13
- },
14
- },
15
- });