@cloudsnorkel/cdk-github-runners 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/.gitattributes +6 -1
  2. package/.jsii +1225 -174
  3. package/API.md +1047 -64
  4. package/README.md +54 -44
  5. package/lib/index.d.ts +3 -1
  6. package/lib/index.js +7 -1
  7. package/lib/lambdas/build-image/index.js +121 -0
  8. package/lib/lambdas/setup/index.js +2 -2
  9. package/lib/lambdas/update-lambda/index.js +55 -0
  10. package/lib/providers/codebuild.d.ts +31 -1
  11. package/lib/providers/codebuild.js +57 -13
  12. package/lib/providers/common.d.ts +87 -6
  13. package/lib/providers/common.js +64 -4
  14. package/lib/providers/docker-images/codebuild/linux-arm64/Dockerfile +59 -0
  15. package/lib/providers/docker-images/codebuild/{Dockerfile → linux-x64/Dockerfile} +10 -5
  16. package/lib/providers/docker-images/fargate/linux-arm64/Dockerfile +41 -0
  17. package/lib/providers/docker-images/fargate/{runner.sh → linux-arm64/runner.sh} +0 -0
  18. package/lib/providers/docker-images/fargate/{Dockerfile → linux-x64/Dockerfile} +10 -5
  19. package/lib/providers/docker-images/fargate/linux-x64/runner.sh +5 -0
  20. package/lib/providers/docker-images/lambda/linux-arm64/Dockerfile +32 -0
  21. package/lib/providers/docker-images/lambda/{runner.js → linux-arm64/runner.js} +0 -0
  22. package/lib/providers/docker-images/lambda/{runner.sh → linux-arm64/runner.sh} +0 -0
  23. package/lib/providers/docker-images/lambda/linux-x64/Dockerfile +31 -0
  24. package/lib/providers/docker-images/lambda/linux-x64/runner.js +29 -0
  25. package/lib/providers/docker-images/lambda/linux-x64/runner.sh +12 -0
  26. package/lib/providers/fargate.d.ts +33 -1
  27. package/lib/providers/fargate.js +39 -8
  28. package/lib/providers/image-builders/codebuild.d.ts +170 -0
  29. package/lib/providers/image-builders/codebuild.js +340 -0
  30. package/lib/providers/image-builders/static.d.ts +29 -0
  31. package/lib/providers/image-builders/static.js +58 -0
  32. package/lib/providers/lambda.d.ts +27 -1
  33. package/lib/providers/lambda.js +88 -9
  34. package/lib/runner.d.ts +2 -2
  35. package/lib/runner.js +7 -3
  36. package/lib/secrets.js +1 -1
  37. package/lib/utils.d.ts +2 -1
  38. package/lib/utils.js +14 -3
  39. package/lib/webhook.js +2 -1
  40. package/package.json +8 -7
  41. package/lib/providers/docker-images/lambda/Dockerfile +0 -27
@@ -1,4 +1,4 @@
1
- import { aws_ec2 as ec2, aws_iam as iam, aws_logs as logs, aws_stepfunctions as stepfunctions } from 'aws-cdk-lib';
1
+ import { aws_ec2 as ec2, aws_ecr as ecr, aws_iam as iam, aws_logs as logs, aws_stepfunctions as stepfunctions } from 'aws-cdk-lib';
2
2
  /**
3
3
  * Defines desired GitHub Actions runner version.
4
4
  */
@@ -19,15 +19,96 @@ export declare class RunnerVersion {
19
19
  protected constructor(version: string);
20
20
  }
21
21
  /**
22
- * Common properties for all runner providers.
22
+ * CPU architecture enum for an image.
23
23
  */
24
- export interface RunnerProviderProps {
24
+ export declare class Architecture {
25
+ readonly name: string;
26
+ /**
27
+ * ARM64
28
+ */
29
+ static readonly ARM64: Architecture;
30
+ /**
31
+ * X86_64
32
+ */
33
+ static readonly X86_64: Architecture;
34
+ private static of;
35
+ private constructor();
36
+ /**
37
+ * Checks if the given architecture is the same as this one.
38
+ *
39
+ * @param arch architecture to compare
40
+ */
41
+ is(arch: Architecture): boolean;
42
+ }
43
+ /**
44
+ * OS enum for an image.
45
+ */
46
+ export declare class Os {
47
+ readonly name: string;
25
48
  /**
26
- * Version of GitHub Runners to install.
49
+ * Linux
50
+ */
51
+ static readonly LINUX: Os;
52
+ /**
53
+ * Windows
54
+ */
55
+ static readonly WINDOWS: Os;
56
+ private static of;
57
+ private constructor();
58
+ /**
59
+ * Checks if the given OS is the same as this one.
60
+ *
61
+ * @param os OS to compare
62
+ */
63
+ is(os: Os): boolean;
64
+ }
65
+ export interface RunnerImage {
66
+ /**
67
+ * ECR repository containing the image.
68
+ */
69
+ readonly imageRepository: ecr.IRepository;
70
+ /**
71
+ * Static image tag where the image will be pushed.
72
+ */
73
+ readonly imageTag: string;
74
+ /**
75
+ * Image digest for providers that need to know the digest like Lambda.
27
76
  *
28
- * @default latest version available
77
+ * WARNING: the digest might change when the builder automatically rebuilds the image on a schedule. Do not expect for this digest to stay the same between deploys.
29
78
  */
30
- readonly runnerVersion?: RunnerVersion;
79
+ readonly imageDigest: string;
80
+ /**
81
+ * Architecture of the image.
82
+ */
83
+ readonly architecture: Architecture;
84
+ /**
85
+ * OS type of the image.
86
+ */
87
+ readonly os: Os;
88
+ }
89
+ /**
90
+ * Interface for constructs that build an image that can be used in {@link IRunnerProvider}.
91
+ *
92
+ * Anything that ends up with an ECR repository containing a Docker image that runs GitHub self-hosted runners can be used. A simple implementation could even point to an existing image and nothing else.
93
+ *
94
+ * It's important that the specified image tag be available at the time the repository is available. Providers usually assume the image is ready and will fail if it's not.
95
+ *
96
+ * The image can be further updated over time manually or using a schedule as long as it is always written to the same tag.
97
+ */
98
+ export interface IImageBuilder {
99
+ /**
100
+ * ECR repository containing the image.
101
+ *
102
+ * This method can be called multiple times if the image is bound to multiple providers. Make sure you cache the image when implementing or return an error if this builder doesn't support reusing images.
103
+ *
104
+ * @return image
105
+ */
106
+ bind(): RunnerImage;
107
+ }
108
+ /**
109
+ * Common properties for all runner providers.
110
+ */
111
+ export interface RunnerProviderProps {
31
112
  /**
32
113
  * The number of days log events are kept in CloudWatch Logs. When updating
33
114
  * this property, unsetting it doesn't remove the log retention policy. To
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- var _a;
2
+ var _a, _b, _c;
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.RunnerVersion = void 0;
4
+ exports.Os = exports.Architecture = exports.RunnerVersion = void 0;
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  /**
7
7
  * Defines desired GitHub Actions runner version.
@@ -29,5 +29,65 @@ class RunnerVersion {
29
29
  }
30
30
  exports.RunnerVersion = RunnerVersion;
31
31
  _a = JSII_RTTI_SYMBOL_1;
32
- RunnerVersion[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerVersion", version: "0.2.0" };
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQWEsYUFBYTtJQW1CeEIsWUFBK0IsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFDOUMsQ0FBQztJQW5CRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxNQUFNO1FBQ2xCLE9BQU8sSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBZTtRQUNwQyxPQUFPLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O0FBakJILHNDQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGF3c19lYzIgYXMgZWMyLCBhd3NfaWFtIGFzIGlhbSwgYXdzX2xvZ3MgYXMgbG9ncywgYXdzX3N0ZXBmdW5jdGlvbnMgYXMgc3RlcGZ1bmN0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcblxuLyoqXG4gKiBEZWZpbmVzIGRlc2lyZWQgR2l0SHViIEFjdGlvbnMgcnVubmVyIHZlcnNpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW5uZXJWZXJzaW9uIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgbGF0ZXN0IHZlcnNpb24gYXZhaWxhYmxlIGF0IHRoZSB0aW1lIHRoZSBydW5uZXIgcHJvdmlkZXIgaW1hZ2UgaXMgYnVpbHQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGxhdGVzdCgpOiBSdW5uZXJWZXJzaW9uIHtcbiAgICByZXR1cm4gbmV3IFJ1bm5lclZlcnNpb24oJ2xhdGVzdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVzZSBhIHNwZWNpZmljIHZlcnNpb24uXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FjdGlvbnMvcnVubmVyL3JlbGVhc2VzXG4gICAqXG4gICAqIEBwYXJhbSB2ZXJzaW9uIEdpdEh1YiBSdW5uZXIgdmVyc2lvblxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzcGVjaWZpYyh2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFJ1bm5lclZlcnNpb24odmVyc2lvbik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nKSB7XG4gIH1cbn1cblxuLyoqXG4gKiBDb21tb24gcHJvcGVydGllcyBmb3IgYWxsIHJ1bm5lciBwcm92aWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVyUHJvdmlkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBWZXJzaW9uIG9mIEdpdEh1YiBSdW5uZXJzIHRvIGluc3RhbGwuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxhdGVzdCB2ZXJzaW9uIGF2YWlsYWJsZVxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmVyVmVyc2lvbj86IFJ1bm5lclZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgZGF5cyBsb2cgZXZlbnRzIGFyZSBrZXB0IGluIENsb3VkV2F0Y2ggTG9ncy4gV2hlbiB1cGRhdGluZ1xuICAgKiB0aGlzIHByb3BlcnR5LCB1bnNldHRpbmcgaXQgZG9lc24ndCByZW1vdmUgdGhlIGxvZyByZXRlbnRpb24gcG9saWN5LiBUb1xuICAgKiByZW1vdmUgdGhlIHJldGVudGlvbiBwb2xpY3ksIHNldCB0aGUgdmFsdWUgdG8gYElORklOSVRFYC5cbiAgICpcbiAgICogQGRlZmF1bHQgbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USFxuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xufVxuXG4vKipcbiAqIFdvcmtmbG93IGpvYiBwYXJhbWV0ZXJzIGFzIHBhcnNlZCBmcm9tIHRoZSB3ZWJob29rIGV2ZW50LiBQYXNzIHRoZXNlIGludG8geW91ciBydW5uZXIgZXhlY3V0b3IgYW5kIHJ1biBzb21ldGhpbmcgbGlrZTpcbiAqXG4gKiBgYGBzaFxuICogLi9jb25maWcuc2ggLS11bmF0dGVuZGVkIC0tdXJsIFwiaHR0cHM6Ly8ke0dJVEhVQl9ET01BSU59LyR7T1dORVJ9LyR7UkVQT31cIiAtLXRva2VuIFwiJHtSVU5ORVJfVE9LRU59XCIgLS1lcGhlbWVyYWwgLS13b3JrIF93b3JrIC0tbGFiZWxzIFwiJHtSVU5ORVJfTEFCRUx9XCIgLS1uYW1lIFwiJHtSVU5ORVJfTkFNRX1cIiAtLWRpc2FibGV1cGRhdGVcbiAqIGBgYFxuICpcbiAqIEFsbCBwYXJhbWV0ZXJzIGFyZSBzcGVjaWZpZWQgYXMgc3RlcCBmdW5jdGlvbiBwYXRocyBhbmQgdGhlcmVmb3JlIG11c3QgYmUgdXNlZCBvbmx5IGluIHN0ZXAgZnVuY3Rpb24gdGFzayBwYXJhbWV0ZXJzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJ1bm5lclJ1bnRpbWVQYXJhbWV0ZXJzIHtcbiAgLyoqXG4gICAqIFBhdGggdG8gcnVubmVyIHRva2VuIHVzZWQgdG8gcmVnaXN0ZXIgdG9rZW4uXG4gICAqL1xuICByZWFkb25seSBydW5uZXJUb2tlblBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogUGF0aCB0byBkZXNpcmVkIHJ1bm5lciBuYW1lLiBXZSBzcGVjaWZpY2FsbHkgc2V0IHRoZSBuYW1lIHRvIG1ha2UgdHJvdWJsZXNob290aW5nIGVhc2llci5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bm5lck5hbWVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gR2l0SHViIGRvbWFpbi4gTW9zdCBvZiB0aGUgdGltZSB0aGlzIHdpbGwgYmUgZ2l0aHViLmNvbSBidXQgZm9yIHNlbGYtaG9zdGVkIEdpdEh1YiBpbnN0YW5jZXMsIHRoaXMgd2lsbCBiZSBkaWZmZXJlbnQuXG4gICAqL1xuICByZWFkb25seSBnaXRodWJEb21haW5QYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gcmVwb3N0aXJveSBvd25lciBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZXJQYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gcmVwb3NpdG9yeSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVwb1BhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGFsbCBydW5uZXIgcHJvdmlkZXJzLiBJbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGFsbCByZXF1aXJlZCByZXNvdXJjZXMgYW5kIHJldHVybiBhIHN0ZXAgZnVuY3Rpb24gdGFzayB0aGF0IHN0YXJ0cyB0aG9zZSByZXNvdXJjZXMgZnJvbSB7QGxpbmsgZ2V0U3RlcEZ1bmN0aW9uVGFza30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVJ1bm5lclByb3ZpZGVyIGV4dGVuZHMgZWMyLklDb25uZWN0YWJsZSwgaWFtLklHcmFudGFibGUge1xuICAvKipcbiAgICogR2l0SHViIEFjdGlvbnMgbGFiZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcnVubmVyIHByb3ZpZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogVlBDIG5ldHdvcmsgaW4gd2hpY2ggcnVubmVycyB3aWxsIGJlIHBsYWNlZC5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBTZWN1cml0eSBncm91cCBhc3NvY2lhdGVkIHdpdGggcnVubmVycy5cbiAgICovXG4gIHJlYWRvbmx5IHNlY3VyaXR5R3JvdXA/OiBlYzIuSVNlY3VyaXR5R3JvdXA7XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN0ZXAgZnVuY3Rpb24gdGFza3MgdGhhdCBleGVjdXRlIHRoZSBydW5uZXIuXG4gICAqXG4gICAqIENhbGxlZCBieSBHaXRodWJSdW5uZXJzIGFuZCBzaG91bGRuJ3QgYmUgY2FsbGVkIG1hbnVhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1ldGVycyBzcGVjaWZpYyBidWlsZCBwYXJhbWV0ZXJzXG4gICAqL1xuICBnZXRTdGVwRnVuY3Rpb25UYXNrKHBhcmFtZXRlcnM6IFJ1bm5lclJ1bnRpbWVQYXJhbWV0ZXJzKTogc3RlcGZ1bmN0aW9ucy5JQ2hhaW5hYmxlO1xufVxuIl19
32
+ RunnerVersion[_a] = { fqn: "@cloudsnorkel/cdk-github-runners.RunnerVersion", version: "0.3.0" };
33
+ /**
34
+ * CPU architecture enum for an image.
35
+ */
36
+ class Architecture {
37
+ constructor(name) {
38
+ this.name = name;
39
+ }
40
+ static of(architecture) {
41
+ return new Architecture(architecture);
42
+ }
43
+ /**
44
+ * Checks if the given architecture is the same as this one.
45
+ *
46
+ * @param arch architecture to compare
47
+ */
48
+ is(arch) {
49
+ return arch.name == this.name;
50
+ }
51
+ }
52
+ exports.Architecture = Architecture;
53
+ _b = JSII_RTTI_SYMBOL_1;
54
+ Architecture[_b] = { fqn: "@cloudsnorkel/cdk-github-runners.Architecture", version: "0.3.0" };
55
+ /**
56
+ * ARM64
57
+ */
58
+ Architecture.ARM64 = Architecture.of('ARM64');
59
+ /**
60
+ * X86_64
61
+ */
62
+ Architecture.X86_64 = Architecture.of('X86_64');
63
+ /**
64
+ * OS enum for an image.
65
+ */
66
+ class Os {
67
+ constructor(name) {
68
+ this.name = name;
69
+ }
70
+ static of(os) {
71
+ return new Os(os);
72
+ }
73
+ /**
74
+ * Checks if the given OS is the same as this one.
75
+ *
76
+ * @param os OS to compare
77
+ */
78
+ is(os) {
79
+ return os.name == this.name;
80
+ }
81
+ }
82
+ exports.Os = Os;
83
+ _c = JSII_RTTI_SYMBOL_1;
84
+ Os[_c] = { fqn: "@cloudsnorkel/cdk-github-runners.Os", version: "0.3.0" };
85
+ /**
86
+ * Linux
87
+ */
88
+ Os.LINUX = Os.of('Linux');
89
+ /**
90
+ * Windows
91
+ */
92
+ Os.WINDOWS = Os.of('Windows');
93
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3ZpZGVycy9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQTs7R0FFRztBQUNILE1BQWEsYUFBYTtJQW1CeEIsWUFBK0IsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7SUFDOUMsQ0FBQztJQW5CRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxNQUFNO1FBQ2xCLE9BQU8sSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBZTtRQUNwQyxPQUFPLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7O0FBakJILHNDQXFCQzs7O0FBRUQ7O0dBRUc7QUFDSCxNQUFhLFlBQVk7SUFldkIsWUFBb0MsSUFBWTtRQUFaLFNBQUksR0FBSixJQUFJLENBQVE7SUFDaEQsQ0FBQztJQUxPLE1BQU0sQ0FBQyxFQUFFLENBQUMsWUFBb0I7UUFDcEMsT0FBTyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBS0Q7Ozs7TUFJRTtJQUNLLEVBQUUsQ0FBQyxJQUFrQjtRQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDOztBQXpCSCxvQ0EwQkM7OztBQXpCQzs7R0FFRztBQUNvQixrQkFBSyxHQUFHLFlBQVksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFeEQ7O0dBRUc7QUFDb0IsbUJBQU0sR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBbUI1RDs7R0FFRztBQUNILE1BQWEsRUFBRTtJQWViLFlBQW9DLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO0lBQ2hELENBQUM7SUFMTyxNQUFNLENBQUMsRUFBRSxDQUFDLEVBQVU7UUFDMUIsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBS0Q7Ozs7TUFJRTtJQUNLLEVBQUUsQ0FBQyxFQUFNO1FBQ2QsT0FBTyxFQUFFLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDOUIsQ0FBQzs7QUF6QkgsZ0JBMEJDOzs7QUF6QkM7O0VBRUU7QUFDcUIsUUFBSyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFOUM7O0VBRUU7QUFDcUIsVUFBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhd3NfZWMyIGFzIGVjMiwgYXdzX2VjciBhcyBlY3IsIGF3c19pYW0gYXMgaWFtLCBhd3NfbG9ncyBhcyBsb2dzLCBhd3Nfc3RlcGZ1bmN0aW9ucyBhcyBzdGVwZnVuY3Rpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuXG4vKipcbiAqIERlZmluZXMgZGVzaXJlZCBHaXRIdWIgQWN0aW9ucyBydW5uZXIgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJ1bm5lclZlcnNpb24ge1xuICAvKipcbiAgICogVXNlIHRoZSBsYXRlc3QgdmVyc2lvbiBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIHJ1bm5lciBwcm92aWRlciBpbWFnZSBpcyBidWlsdC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbGF0ZXN0KCk6IFJ1bm5lclZlcnNpb24ge1xuICAgIHJldHVybiBuZXcgUnVubmVyVmVyc2lvbignbGF0ZXN0Jyk7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgc3BlY2lmaWMgdmVyc2lvbi5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYWN0aW9ucy9ydW5uZXIvcmVsZWFzZXNcbiAgICpcbiAgICogQHBhcmFtIHZlcnNpb24gR2l0SHViIFJ1bm5lciB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNwZWNpZmljKHZlcnNpb246IHN0cmluZykge1xuICAgIHJldHVybiBuZXcgUnVubmVyVmVyc2lvbih2ZXJzaW9uKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihyZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgfVxufVxuXG4vKipcbiAqIENQVSBhcmNoaXRlY3R1cmUgZW51bSBmb3IgYW4gaW1hZ2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBBcmNoaXRlY3R1cmUge1xuICAvKipcbiAgICogQVJNNjRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQVJNNjQgPSBBcmNoaXRlY3R1cmUub2YoJ0FSTTY0Jyk7XG5cbiAgLyoqXG4gICAqIFg4Nl82NFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBYODZfNjQgPSBBcmNoaXRlY3R1cmUub2YoJ1g4Nl82NCcpO1xuXG4gIHByaXZhdGUgc3RhdGljIG9mKGFyY2hpdGVjdHVyZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBBcmNoaXRlY3R1cmUoYXJjaGl0ZWN0dXJlKTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZykge1xuICB9XG5cbiAgLyoqXG4gICogQ2hlY2tzIGlmIHRoZSBnaXZlbiBhcmNoaXRlY3R1cmUgaXMgdGhlIHNhbWUgYXMgdGhpcyBvbmUuXG4gICpcbiAgKiBAcGFyYW0gYXJjaCBhcmNoaXRlY3R1cmUgdG8gY29tcGFyZVxuICAqL1xuICBwdWJsaWMgaXMoYXJjaDogQXJjaGl0ZWN0dXJlKSB7XG4gICAgcmV0dXJuIGFyY2gubmFtZSA9PSB0aGlzLm5hbWU7XG4gIH1cbn1cblxuLyoqXG4gKiBPUyBlbnVtIGZvciBhbiBpbWFnZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9zIHtcbiAgLyoqXG4gICogTGludXhcbiAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMSU5VWCA9IE9zLm9mKCdMaW51eCcpO1xuXG4gIC8qKlxuICAqIFdpbmRvd3NcbiAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBXSU5ET1dTID0gT3Mub2YoJ1dpbmRvd3MnKTtcblxuICBwcml2YXRlIHN0YXRpYyBvZihvczogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBPcyhvcyk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcpIHtcbiAgfVxuXG4gIC8qKlxuICAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gT1MgaXMgdGhlIHNhbWUgYXMgdGhpcyBvbmUuXG4gICpcbiAgKiBAcGFyYW0gb3MgT1MgdG8gY29tcGFyZVxuICAqL1xuICBwdWJsaWMgaXMob3M6IE9zKSB7XG4gICAgcmV0dXJuIG9zLm5hbWUgPT0gdGhpcy5uYW1lO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVySW1hZ2Uge1xuICAvKipcbiAgICogRUNSIHJlcG9zaXRvcnkgY29udGFpbmluZyB0aGUgaW1hZ2UuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVJlcG9zaXRvcnk6IGVjci5JUmVwb3NpdG9yeTtcblxuICAvKipcbiAgICogU3RhdGljIGltYWdlIHRhZyB3aGVyZSB0aGUgaW1hZ2Ugd2lsbCBiZSBwdXNoZWQuXG4gICAqL1xuICByZWFkb25seSBpbWFnZVRhZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBkaWdlc3QgZm9yIHByb3ZpZGVycyB0aGF0IG5lZWQgdG8ga25vdyB0aGUgZGlnZXN0IGxpa2UgTGFtYmRhLlxuICAgKlxuICAgKiBXQVJOSU5HOiB0aGUgZGlnZXN0IG1pZ2h0IGNoYW5nZSB3aGVuIHRoZSBidWlsZGVyIGF1dG9tYXRpY2FsbHkgcmVidWlsZHMgdGhlIGltYWdlIG9uIGEgc2NoZWR1bGUuIERvIG5vdCBleHBlY3QgZm9yIHRoaXMgZGlnZXN0IHRvIHN0YXkgdGhlIHNhbWUgYmV0d2VlbiBkZXBsb3lzLlxuICAgKi9cbiAgcmVhZG9ubHkgaW1hZ2VEaWdlc3Q6IHN0cmluZztcblxuICAvKipcbiAgICogQXJjaGl0ZWN0dXJlIG9mIHRoZSBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IGFyY2hpdGVjdHVyZTogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBPUyB0eXBlIG9mIHRoZSBpbWFnZS5cbiAgICovXG4gIHJlYWRvbmx5IG9zOiBPcztcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbnN0cnVjdHMgdGhhdCBidWlsZCBhbiBpbWFnZSB0aGF0IGNhbiBiZSB1c2VkIGluIHtAbGluayBJUnVubmVyUHJvdmlkZXJ9LlxuICpcbiAqIEFueXRoaW5nIHRoYXQgZW5kcyB1cCB3aXRoIGFuIEVDUiByZXBvc2l0b3J5IGNvbnRhaW5pbmcgYSBEb2NrZXIgaW1hZ2UgdGhhdCBydW5zIEdpdEh1YiBzZWxmLWhvc3RlZCBydW5uZXJzIGNhbiBiZSB1c2VkLiBBIHNpbXBsZSBpbXBsZW1lbnRhdGlvbiBjb3VsZCBldmVuIHBvaW50IHRvIGFuIGV4aXN0aW5nIGltYWdlIGFuZCBub3RoaW5nIGVsc2UuXG4gKlxuICogSXQncyBpbXBvcnRhbnQgdGhhdCB0aGUgc3BlY2lmaWVkIGltYWdlIHRhZyBiZSBhdmFpbGFibGUgYXQgdGhlIHRpbWUgdGhlIHJlcG9zaXRvcnkgaXMgYXZhaWxhYmxlLiBQcm92aWRlcnMgdXN1YWxseSBhc3N1bWUgdGhlIGltYWdlIGlzIHJlYWR5IGFuZCB3aWxsIGZhaWwgaWYgaXQncyBub3QuXG4gKlxuICogVGhlIGltYWdlIGNhbiBiZSBmdXJ0aGVyIHVwZGF0ZWQgb3ZlciB0aW1lIG1hbnVhbGx5IG9yIHVzaW5nIGEgc2NoZWR1bGUgYXMgbG9uZyBhcyBpdCBpcyBhbHdheXMgd3JpdHRlbiB0byB0aGUgc2FtZSB0YWcuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUltYWdlQnVpbGRlciB7XG4gIC8qKlxuICAgKiBFQ1IgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBpbWFnZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBpZiB0aGUgaW1hZ2UgaXMgYm91bmQgdG8gbXVsdGlwbGUgcHJvdmlkZXJzLiBNYWtlIHN1cmUgeW91IGNhY2hlIHRoZSBpbWFnZSB3aGVuIGltcGxlbWVudGluZyBvciByZXR1cm4gYW4gZXJyb3IgaWYgdGhpcyBidWlsZGVyIGRvZXNuJ3Qgc3VwcG9ydCByZXVzaW5nIGltYWdlcy5cbiAgICpcbiAgICogQHJldHVybiBpbWFnZVxuICAgKi9cbiAgYmluZCgpOiBSdW5uZXJJbWFnZTtcbn1cblxuLyoqXG4gKiBDb21tb24gcHJvcGVydGllcyBmb3IgYWxsIHJ1bm5lciBwcm92aWRlcnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVubmVyUHJvdmlkZXJQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgbG9nIGV2ZW50cyBhcmUga2VwdCBpbiBDbG91ZFdhdGNoIExvZ3MuIFdoZW4gdXBkYXRpbmdcbiAgICogdGhpcyBwcm9wZXJ0eSwgdW5zZXR0aW5nIGl0IGRvZXNuJ3QgcmVtb3ZlIHRoZSBsb2cgcmV0ZW50aW9uIHBvbGljeS4gVG9cbiAgICogcmVtb3ZlIHRoZSByZXRlbnRpb24gcG9saWN5LCBzZXQgdGhlIHZhbHVlIHRvIGBJTkZJTklURWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEhcbiAgICovXG4gIHJlYWRvbmx5IGxvZ1JldGVudGlvbj86IGxvZ3MuUmV0ZW50aW9uRGF5cztcbn1cblxuLyoqXG4gKiBXb3JrZmxvdyBqb2IgcGFyYW1ldGVycyBhcyBwYXJzZWQgZnJvbSB0aGUgd2ViaG9vayBldmVudC4gUGFzcyB0aGVzZSBpbnRvIHlvdXIgcnVubmVyIGV4ZWN1dG9yIGFuZCBydW4gc29tZXRoaW5nIGxpa2U6XG4gKlxuICogYGBgc2hcbiAqIC4vY29uZmlnLnNoIC0tdW5hdHRlbmRlZCAtLXVybCBcImh0dHBzOi8vJHtHSVRIVUJfRE9NQUlOfS8ke09XTkVSfS8ke1JFUE99XCIgLS10b2tlbiBcIiR7UlVOTkVSX1RPS0VOfVwiIC0tZXBoZW1lcmFsIC0td29yayBfd29yayAtLWxhYmVscyBcIiR7UlVOTkVSX0xBQkVMfVwiIC0tbmFtZSBcIiR7UlVOTkVSX05BTUV9XCIgLS1kaXNhYmxldXBkYXRlXG4gKiBgYGBcbiAqXG4gKiBBbGwgcGFyYW1ldGVycyBhcmUgc3BlY2lmaWVkIGFzIHN0ZXAgZnVuY3Rpb24gcGF0aHMgYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHVzZWQgb25seSBpbiBzdGVwIGZ1bmN0aW9uIHRhc2sgcGFyYW1ldGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5uZXJSdW50aW1lUGFyYW1ldGVycyB7XG4gIC8qKlxuICAgKiBQYXRoIHRvIHJ1bm5lciB0b2tlbiB1c2VkIHRvIHJlZ2lzdGVyIHRva2VuLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVubmVyVG9rZW5QYXRoOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gZGVzaXJlZCBydW5uZXIgbmFtZS4gV2Ugc3BlY2lmaWNhbGx5IHNldCB0aGUgbmFtZSB0byBtYWtlIHRyb3VibGVzaG9vdGluZyBlYXNpZXIuXG4gICAqL1xuICByZWFkb25seSBydW5uZXJOYW1lUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIEdpdEh1YiBkb21haW4uIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyB3aWxsIGJlIGdpdGh1Yi5jb20gYnV0IGZvciBzZWxmLWhvc3RlZCBHaXRIdWIgaW5zdGFuY2VzLCB0aGlzIHdpbGwgYmUgZGlmZmVyZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZ2l0aHViRG9tYWluUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHJlcG9zdGlyb3kgb3duZXIgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVyUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBQYXRoIHRvIHJlcG9zaXRvcnkgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG9QYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBhbGwgcnVubmVyIHByb3ZpZGVycy4gSW1wbGVtZW50YXRpb25zIGNyZWF0ZSBhbGwgcmVxdWlyZWQgcmVzb3VyY2VzIGFuZCByZXR1cm4gYSBzdGVwIGZ1bmN0aW9uIHRhc2sgdGhhdCBzdGFydHMgdGhvc2UgcmVzb3VyY2VzIGZyb20ge0BsaW5rIGdldFN0ZXBGdW5jdGlvblRhc2t9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElSdW5uZXJQcm92aWRlciBleHRlbmRzIGVjMi5JQ29ubmVjdGFibGUsIGlhbS5JR3JhbnRhYmxlIHtcbiAgLyoqXG4gICAqIEdpdEh1YiBBY3Rpb25zIGxhYmVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJ1bm5lciBwcm92aWRlci5cbiAgICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFZQQyBuZXR3b3JrIGluIHdoaWNoIHJ1bm5lcnMgd2lsbCBiZSBwbGFjZWQuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBlYzIuSVZwYztcblxuICAvKipcbiAgICogU2VjdXJpdHkgZ3JvdXAgYXNzb2NpYXRlZCB3aXRoIHJ1bm5lcnMuXG4gICAqL1xuICByZWFkb25seSBzZWN1cml0eUdyb3VwPzogZWMyLklTZWN1cml0eUdyb3VwO1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBzdGVwIGZ1bmN0aW9uIHRhc2tzIHRoYXQgZXhlY3V0ZSB0aGUgcnVubmVyLlxuICAgKlxuICAgKiBDYWxsZWQgYnkgR2l0aHViUnVubmVycyBhbmQgc2hvdWxkbid0IGJlIGNhbGxlZCBtYW51YWxseS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtZXRlcnMgc3BlY2lmaWMgYnVpbGQgcGFyYW1ldGVyc1xuICAgKi9cbiAgZ2V0U3RlcEZ1bmN0aW9uVGFzayhwYXJhbWV0ZXJzOiBSdW5uZXJSdW50aW1lUGFyYW1ldGVycyk6IHN0ZXBmdW5jdGlvbnMuSUNoYWluYWJsZTtcbn1cbiJdfQ==
@@ -0,0 +1,59 @@
1
+ ARG BASE_IMAGE="public.ecr.aws/lts/ubuntu:20.04"
2
+ FROM $BASE_IMAGE
3
+
4
+ # setup user
5
+ RUN addgroup runner && adduser --system --disabled-password --home /home/runner --ingroup runner runner
6
+
7
+ # add dependencies and sudo
8
+ ARG EXTRA_PACKAGES=""
9
+ RUN apt-get update && apt-get upgrade -y && apt-get install -y curl sudo jq bash zip unzip iptables software-properties-common $EXTRA_PACKAGES && \
10
+ usermod -aG sudo runner && \
11
+ echo "%sudo ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/runner
12
+
13
+ # add latest git
14
+ RUN add-apt-repository ppa:git-core/ppa && apt update && apt-get install -y git
15
+
16
+ # add awscli
17
+ RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o awscliv2.zip && \
18
+ unzip -q awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws
19
+
20
+ # add ghcli
21
+ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \
22
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \
23
+ apt update && \
24
+ apt install -y gh
25
+
26
+ # setup working directory
27
+ WORKDIR /home/runner
28
+
29
+ # add runner without github's api which is rate limited
30
+ ARG RUNNER_VERSION=latest
31
+ RUN if [ "$RUNNER_VERSION" = "latest" ]; then RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`; fi && \
32
+ curl -fsSLO "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz" && \
33
+ tar xzf "actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz" && \
34
+ rm actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz && \
35
+ ./bin/installdependencies.sh
36
+
37
+ # docker-in-docker
38
+ ARG DOCKER_CHANNEL="stable"
39
+ ARG DIND_COMMIT="42b1175eda071c0e9121e1d64345928384a93df1"
40
+ ARG DOCKER_VERSION="20.10.16"
41
+ ARG DOCKER_COMPOSE_VERSION="2.5.1"
42
+
43
+ RUN curl -fsSL "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/aarch64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz && \
44
+ tar --strip-components 1 -C /usr/local/bin/ -xzf docker.tgz && \
45
+ rm docker.tgz && \
46
+ # set up subuid/subgid so that "--userns-remap=default" works out-of-the-box
47
+ addgroup dockremap && \
48
+ useradd -g dockremap dockremap && \
49
+ echo 'dockremap:165536:65536' >> /etc/subuid && \
50
+ echo 'dockremap:165536:65536' >> /etc/subgid && \
51
+ curl -fsSL "https://raw.githubusercontent.com/docker/docker/${DIND_COMMIT}/hack/dind" -o /usr/local/bin/dind && \
52
+ curl -fsSL https://github.com/docker/compose/releases/download/v${DOCKER_COMPOSE_VERSION}/docker-compose-linux-aarch64 -o /usr/local/bin/docker-compose && \
53
+ chmod +x /usr/local/bin/dind /usr/local/bin/docker-compose && \
54
+ addgroup docker && usermod -aG docker runner
55
+
56
+ VOLUME /var/lib/docker
57
+
58
+ # configure runner
59
+ USER runner
@@ -1,13 +1,18 @@
1
- FROM public.ecr.aws/lts/ubuntu:18.04
1
+ ARG BASE_IMAGE="public.ecr.aws/lts/ubuntu:20.04"
2
+ FROM $BASE_IMAGE
2
3
 
3
4
  # setup user
4
5
  RUN addgroup runner && adduser --system --disabled-password --home /home/runner --ingroup runner runner
5
6
 
6
7
  # add dependencies and sudo
7
- RUN apt-get update && apt-get upgrade -y && apt-get install -y curl sudo jq bash git zip unzip iptables && \
8
+ ARG EXTRA_PACKAGES=""
9
+ RUN apt-get update && apt-get upgrade -y && apt-get install -y curl sudo jq bash zip unzip iptables software-properties-common $EXTRA_PACKAGES && \
8
10
  usermod -aG sudo runner && \
9
11
  echo "%sudo ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/runner
10
12
 
13
+ # add latest git
14
+ RUN add-apt-repository ppa:git-core/ppa && apt update && apt-get install -y git
15
+
11
16
  # add awscli
12
17
  RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip && \
13
18
  unzip -q awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws
@@ -21,9 +26,9 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | s
21
26
  # setup working directory
22
27
  WORKDIR /home/runner
23
28
 
24
- # add runner
25
- ARG RUNNER_VERSION
26
- RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -fsSL https://api.github.com/repos/actions/runner/releases/latest | jq -r .tag_name | cut -c2-`; fi && \
29
+ # add runner without github's api which is rate limited
30
+ ARG RUNNER_VERSION=latest
31
+ RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`; fi && \
27
32
  curl -fsSLO "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz" && \
28
33
  tar xzf "actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz" && \
29
34
  rm actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz && \
@@ -0,0 +1,41 @@
1
+ ARG BASE_IMAGE="public.ecr.aws/lts/ubuntu:20.04"
2
+ FROM $BASE_IMAGE
3
+
4
+ # setup user
5
+ RUN addgroup runner && adduser --system --disabled-password --home /home/runner --ingroup runner runner
6
+
7
+ # add dependencies and sudo
8
+ ARG EXTRA_PACKAGES=""
9
+ RUN apt-get update && apt-get upgrade -y && apt-get install -y curl sudo jq bash zip unzip software-properties-common $EXTRA_PACKAGES && \
10
+ usermod -aG sudo runner && \
11
+ echo "%sudo ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/runner
12
+
13
+ # add latest git
14
+ RUN add-apt-repository ppa:git-core/ppa && apt update && apt-get install -y git
15
+
16
+ # add awscli
17
+ RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o awscliv2.zip && \
18
+ unzip -q awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws
19
+
20
+ # add ghcli
21
+ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg && \
22
+ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null && \
23
+ apt update && \
24
+ apt install -y gh
25
+
26
+ # setup working directory
27
+ WORKDIR /home/runner
28
+
29
+ # add runner without github's api which is rate limited
30
+ ARG RUNNER_VERSION=latest
31
+ RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`; fi && \
32
+ curl -fsSLO "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz" && \
33
+ tar xzf "actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz" && \
34
+ rm actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz && \
35
+ ./bin/installdependencies.sh
36
+
37
+ # configure runner
38
+ USER runner
39
+
40
+ ADD runner.sh .
41
+ CMD ["bash", "/home/runner/runner.sh"]
@@ -1,13 +1,18 @@
1
- FROM public.ecr.aws/lts/ubuntu:18.04
1
+ ARG BASE_IMAGE="public.ecr.aws/lts/ubuntu:20.04"
2
+ FROM $BASE_IMAGE
2
3
 
3
4
  # setup user
4
5
  RUN addgroup runner && adduser --system --disabled-password --home /home/runner --ingroup runner runner
5
6
 
6
7
  # add dependencies and sudo
7
- RUN apt-get update && apt-get upgrade -y && apt-get install -y curl sudo jq bash git zip unzip && \
8
+ ARG EXTRA_PACKAGES=""
9
+ RUN apt-get update && apt-get upgrade -y && apt-get install -y curl sudo jq bash zip unzip software-properties-common $EXTRA_PACKAGES && \
8
10
  usermod -aG sudo runner && \
9
11
  echo "%sudo ALL=(ALL:ALL) NOPASSWD: ALL" > /etc/sudoers.d/runner
10
12
 
13
+ # add latest git
14
+ RUN add-apt-repository ppa:git-core/ppa && apt update && apt-get install -y git
15
+
11
16
  # add awscli
12
17
  RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip && \
13
18
  unzip -q awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws
@@ -21,9 +26,9 @@ RUN curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | s
21
26
  # setup working directory
22
27
  WORKDIR /home/runner
23
28
 
24
- # add runner
25
- ARG RUNNER_VERSION
26
- RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -fsSL https://api.github.com/repos/actions/runner/releases/latest | jq -r .tag_name | cut -c2-`; fi && \
29
+ # add runner without github's api which is rate limited
30
+ ARG RUNNER_VERSION=latest
31
+ RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`; fi && \
27
32
  curl -fsSLO "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz" && \
28
33
  tar xzf "actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz" && \
29
34
  rm actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz && \
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+ set -e -u -o pipefail
3
+
4
+ /home/runner/config.sh --unattended --url "https://${GITHUB_DOMAIN}/${OWNER}/${REPO}" --token "${RUNNER_TOKEN}" --ephemeral --work _work --labels "${RUNNER_LABEL}" --disableupdate --name "${RUNNER_NAME}"
5
+ /home/runner/run.sh
@@ -0,0 +1,32 @@
1
+ # https://docs.aws.amazon.com/lambda/latest/dg/images-create.html
2
+
3
+ ARG BASE_IMAGE="public.ecr.aws/lambda/nodejs:14-arm64"
4
+ FROM $BASE_IMAGE
5
+
6
+ WORKDIR /runner
7
+
8
+ # add dependencies
9
+ ARG EXTRA_PACKAGES=""
10
+ RUN yum update -y && yum install -y jq tar gzip bzip2 which binutils git zip unzip $EXTRA_PACKAGES
11
+
12
+ # add awscli
13
+ RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o awscliv2.zip && \
14
+ unzip -q awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws
15
+
16
+ # add ghcli
17
+ RUN curl -fsSSL https://cli.github.com/packages/rpm/gh-cli.repo -o /etc/yum.repos.d/gh-cli.repo && \
18
+ yum install -y gh
19
+
20
+ # add runner without github's api which is rate limited
21
+ ARG RUNNER_VERSION=latest
22
+ RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`; fi && \
23
+ curl -fsSLO "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz" && \
24
+ tar xzf "actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz" && \
25
+ rm actions-runner-linux-arm64-${RUNNER_VERSION}.tar.gz && \
26
+ yum install -y openssl-libs krb5-libs zlib libicu60
27
+ # doesn't work on CentOS - RUN ./bin/installdependencies.sh
28
+
29
+ # prepare for execution
30
+ WORKDIR ${LAMBDA_TASK_ROOT}
31
+ COPY runner.js runner.sh ${LAMBDA_TASK_ROOT}/
32
+ CMD ["runner.handler"]
@@ -0,0 +1,31 @@
1
+ # https://docs.aws.amazon.com/lambda/latest/dg/images-create.html
2
+
3
+ ARG BASE_IMAGE="public.ecr.aws/lambda/nodejs:14-x86_64"
4
+ FROM $BASE_IMAGE
5
+
6
+ WORKDIR /runner
7
+
8
+ # add dependencies
9
+ ARG EXTRA_PACKAGES=""
10
+ RUN yum update -y && yum install -y jq tar gzip bzip2 which binutils git zip unzip $EXTRA_PACKAGES
11
+
12
+ # add awscli
13
+ RUN curl -fsSL "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o awscliv2.zip && \
14
+ unzip -q awscliv2.zip && ./aws/install && rm -rf awscliv2.zip aws
15
+
16
+ # add ghcli
17
+ RUN curl -fsSSL https://cli.github.com/packages/rpm/gh-cli.repo -o /etc/yum.repos.d/gh-cli.repo && \
18
+ yum install -y gh
19
+
20
+ # add runner without github's api which is rate limited
21
+ ARG RUNNER_VERSION=latest
22
+ RUN if [ "${RUNNER_VERSION}" = "latest" ]; then RUNNER_VERSION=`curl -w "%{redirect_url}" -fsS https://github.com/actions/runner/releases/latest | grep -oE "[^/v]+$"`; fi && \
23
+ curl -fsSLO "https://github.com/actions/runner/releases/download/v${RUNNER_VERSION}/actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz" && \
24
+ tar xzf "actions-runner-linux-x64-${RUNNER_VERSION}.tar.gz" && \
25
+ rm -f actions-runner-linux-x64-*.tar.gz && \
26
+ yum install -y openssl-libs krb5-libs zlib libicu60
27
+
28
+ # prepare for execution
29
+ WORKDIR ${LAMBDA_TASK_ROOT}
30
+ COPY runner.js runner.sh ${LAMBDA_TASK_ROOT}/
31
+ CMD ["runner.handler"]
@@ -0,0 +1,29 @@
1
+ const exec = require('child_process').exec;
2
+
3
+ exports.handler = async (event, context) => {
4
+ await new Promise((resolve, reject) => {
5
+ const shellScript = exec('sh runner.sh', {
6
+ env: {
7
+ OWNER: event.owner,
8
+ REPO: event.repo,
9
+ GITHUB_DOMAIN: event.githubDomain,
10
+ RUNNER_TOKEN: event.token,
11
+ RUNNER_NAME: event.runnerName,
12
+ RUNNER_LABEL: event.label,
13
+ },
14
+ });
15
+ shellScript.stdout.on('data', (data) => {
16
+ console.log(data);
17
+ });
18
+ shellScript.stderr.on('data', (data) => {
19
+ console.error(data);
20
+ });
21
+ shellScript.on('exit', (code) => {
22
+ if (code) {
23
+ reject(new Error(`Runner failed with exit code ${code}`));
24
+ } else {
25
+ resolve();
26
+ }
27
+ });
28
+ });
29
+ }
@@ -0,0 +1,12 @@
1
+ #!/bin/bash
2
+
3
+ set -e -u -o pipefail
4
+
5
+ cp -r /runner /tmp/
6
+ cd /tmp/runner
7
+
8
+ export PATH=/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin
9
+ ./config.sh --unattended --url "https://${GITHUB_DOMAIN}/${OWNER}/${REPO}" --token "${RUNNER_TOKEN}" --ephemeral --work _work --labels "${RUNNER_LABEL}" --name "${RUNNER_NAME}" --disableupdate
10
+ echo Config done
11
+ ./run.sh
12
+ echo Run done
@@ -1,10 +1,26 @@
1
1
  import { aws_ec2 as ec2, aws_ecs as ecs, aws_iam as iam, aws_stepfunctions as stepfunctions } from 'aws-cdk-lib';
2
2
  import { Construct } from 'constructs';
3
- import { IRunnerProvider, RunnerProviderProps, RunnerRuntimeParameters } from './common';
3
+ import { IImageBuilder, IRunnerProvider, RunnerProviderProps, RunnerRuntimeParameters } from './common';
4
4
  /**
5
5
  * Properties for FargateRunner.
6
6
  */
7
7
  export interface FargateRunnerProps extends RunnerProviderProps {
8
+ /**
9
+ * Provider running an image to run inside CodeBuild with GitHub runner pre-configured. A user named `runner` is expected to exist.
10
+ *
11
+ * The entry point should start GitHub runner. For example:
12
+ *
13
+ * ```
14
+ * #!/bin/bash
15
+ * set -e -u -o pipefail
16
+ *
17
+ * /home/runner/config.sh --unattended --url "https://${GITHUB_DOMAIN}/${OWNER}/${REPO}" --token "${RUNNER_TOKEN}" --ephemeral --work _work --labels "${RUNNER_LABEL}" --disableupdate --name "${RUNNER_NAME}"
18
+ * /home/runner/run.sh
19
+ * ```
20
+ *
21
+ * @default image builder with `FargateRunner.LINUX_X64_DOCKERFILE_PATH` as Dockerfile
22
+ */
23
+ readonly imageBuilder?: IImageBuilder;
8
24
  /**
9
25
  * GitHub Actions label used for this provider.
10
26
  *
@@ -98,6 +114,22 @@ export interface FargateRunnerProps extends RunnerProviderProps {
98
114
  * This construct is not meant to be used by itself. It should be passed in the providers property for GitHubRunners.
99
115
  */
100
116
  export declare class FargateRunner extends Construct implements IRunnerProvider {
117
+ /**
118
+ * Path to Dockerfile for Linux x64 with all the requirement for Fargate runner. Use this Dockerfile unless you need to customize it further than allowed by hooks.
119
+ *
120
+ * Available build arguments that can be set in the image builder:
121
+ * * `BASE_IMAGE` sets the `FROM` line. This should be an Ubuntu compatible image.
122
+ * * `EXTRA_PACKAGES` can be used to install additional packages.
123
+ */
124
+ static readonly LINUX_X64_DOCKERFILE_PATH: string;
125
+ /**
126
+ * Path to Dockerfile for Linux ARM64 with all the requirement for Fargate runner. Use this Dockerfile unless you need to customize it further than allowed by hooks.
127
+ *
128
+ * Available build arguments that can be set in the image builder:
129
+ * * `BASE_IMAGE` sets the `FROM` line. This should be an Ubuntu compatible image.
130
+ * * `EXTRA_PACKAGES` can be used to install additional packages.
131
+ */
132
+ static readonly LINUX_ARM64_DOCKERFILE_PATH: string;
101
133
  /**
102
134
  * Cluster hosting the task hosting the runner.
103
135
  */