@cloudsnorkel/cdk-github-runners 0.14.18 β†’ 0.14.19

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 (44) hide show
  1. package/.jsii +626 -140
  2. package/API.md +426 -17
  3. package/README.md +32 -2
  4. package/assets/providers/ami-root-device.lambda/index.js +11 -0
  5. package/lib/access.js +1 -1
  6. package/lib/image-builders/api.js +1 -1
  7. package/lib/image-builders/aws-image-builder/ami.d.ts +3 -2
  8. package/lib/image-builders/aws-image-builder/ami.js +9 -34
  9. package/lib/image-builders/aws-image-builder/base-image.d.ts +118 -0
  10. package/lib/image-builders/aws-image-builder/base-image.js +130 -0
  11. package/lib/image-builders/aws-image-builder/builder.js +17 -5
  12. package/lib/image-builders/aws-image-builder/container.d.ts +2 -1
  13. package/lib/image-builders/aws-image-builder/container.js +7 -6
  14. package/lib/image-builders/aws-image-builder/deprecated/ami.js +1 -1
  15. package/lib/image-builders/aws-image-builder/deprecated/container.js +1 -1
  16. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +1 -1
  17. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +1 -1
  18. package/lib/image-builders/aws-image-builder/index.d.ts +1 -0
  19. package/lib/image-builders/aws-image-builder/index.js +2 -1
  20. package/lib/image-builders/codebuild-deprecated.js +1 -1
  21. package/lib/image-builders/codebuild.js +15 -4
  22. package/lib/image-builders/common.d.ts +22 -3
  23. package/lib/image-builders/common.js +1 -1
  24. package/lib/image-builders/components.d.ts +1 -1
  25. package/lib/image-builders/components.js +31 -21
  26. package/lib/image-builders/static.js +4 -3
  27. package/lib/providers/ami-root-device.lambda.js +12 -1
  28. package/lib/providers/codebuild.js +4 -4
  29. package/lib/providers/common.js +3 -3
  30. package/lib/providers/composite.js +5 -5
  31. package/lib/providers/ec2.js +5 -5
  32. package/lib/providers/ecs.js +3 -3
  33. package/lib/providers/fargate.js +4 -4
  34. package/lib/providers/lambda.js +4 -4
  35. package/lib/runner.d.ts +24 -5
  36. package/lib/runner.js +46 -9
  37. package/lib/secrets.js +1 -1
  38. package/lib/utils.d.ts +13 -0
  39. package/lib/utils.js +47 -1
  40. package/lib/webhook-redelivery.d.ts +11 -0
  41. package/lib/webhook-redelivery.js +3 -1
  42. package/lib/webhook.d.ts +10 -0
  43. package/lib/webhook.js +3 -1
  44. package/package.json +1 -1
package/.jsii CHANGED
@@ -3858,7 +3858,7 @@
3858
3858
  },
3859
3859
  "name": "@cloudsnorkel/cdk-github-runners",
3860
3860
  "readme": {
3861
- "markdown": "# GitHub Self-Hosted Runners CDK Constructs\n\n[![NPM](https://img.shields.io/npm/v/@cloudsnorkel/cdk-github-runners?label=npm&logo=npm)][7]\n[![PyPI](https://img.shields.io/pypi/v/cloudsnorkel.cdk-github-runners?label=pypi&logo=pypi)][6]\n[![Maven Central](https://img.shields.io/maven-central/v/com.cloudsnorkel/cdk.github.runners.svg?label=Maven%20Central&logo=apachemaven)][8]\n[![Go](https://img.shields.io/github/v/tag/CloudSnorkel/cdk-github-runners?color=red&label=go&logo=go)][11]\n[![Nuget](https://img.shields.io/nuget/v/CloudSnorkel.Cdk.Github.Runners?color=red&&logo=nuget)][12]\n[![Release](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml/badge.svg)](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/CloudSnorkel/cdk-github-runners/blob/main/LICENSE)\n\nUse this CDK construct to create ephemeral [self-hosted GitHub runners][1] on-demand inside your AWS account.\n\n* 🧩 Easy to configure GitHub integration with a web-based interface\n* 🧠 Customizable runners with decent defaults\n* πŸƒπŸ» Multiple runner configurations controlled by labels\n* πŸ” Everything fully hosted in your account\n* πŸ”ƒ Automatically updated build environment with latest runner version\n\nSelf-hosted runners in AWS are useful when:\n\n* You need easy access to internal resources in your actions\n* You want to pre-install some software for your actions\n* You want to provide some basic AWS API access (but [aws-actions/configure-aws-credentials][2] has more security controls)\n* You are using GitHub Enterprise Server\n\nEphemeral (or on-demand) runners are the [recommended way by GitHub][14] for auto-scaling, and they make sure all jobs run with a clean image. Runners are started on-demand. You don't pay unless a job is running.\n\n## API\n\nThe best way to browse API documentation is on [Constructs Hub][13]. It is available in all supported programming languages.\n\n## Providers\n\nA runner provider creates compute resources on-demand and uses [actions/runner][5] to start a runner.\n\n| | EC2 | CodeBuild | Fargate | ECS | Lambda |\n|------------------|-------------------|----------------------------|----------------|----------------|---------------|\n| **Time limit** | Unlimited | 8 hours | Unlimited | Unlimited | 15 minutes |\n| **vCPUs** | Unlimited | 2, 4, 8, or 72 | 0.25 to 4 | Unlimited | 1 to 6 |\n| **RAM** | Unlimited | 3gb, 7gb, 15gb, or 145gb | 512mb to 30gb | Unlimited | 128mb to 10gb |\n| **Storage** | Unlimited | 50gb to 824gb | 20gb to 200gb | Unlimited | Up to 10gb |\n| **Architecture** | x86_64, ARM64 | x86_64, ARM64 | x86_64, ARM64 | x86_64, ARM64 | x86_64, ARM64 |\n| **sudo** | βœ” | βœ” | βœ” | βœ” | ❌ |\n| **Docker** | βœ” | βœ” (Linux only) | ❌ | βœ” | ❌ |\n| **Spot pricing** | βœ” | ❌ | βœ” | βœ” | ❌ |\n| **OS** | Linux, Windows | Linux, Windows | Linux, Windows | Linux, Windows | Linux |\n\nThe best provider to use mostly depends on your current infrastructure. When in doubt, CodeBuild is always a good choice. Execution history and logs are easy to view, and it has no restrictive limits unless you need to run for more than 8 hours.\n\n* EC2 is useful when you want runners to have complete access to the host\n* ECS is useful when you want to control the infrastructure, like leaving the runner host running for faster startups\n* Lambda is useful for short jobs that can work within time, size and readonly system constraints\n\nYou can also create your own provider by implementing `IRunnerProvider`.\n\n## Installation\n\n1. Install and use the appropriate package\n <details><summary>Python</summary>\n\n ### Install\n Available on [PyPI][6].\n ```bash\n pip install cloudsnorkel.cdk-github-runners\n ```\n ### Use\n ```python\n from aws_cdk import App, Stack\n from cloudsnorkel.cdk_github_runners import GitHubRunners\n\n app = App()\n stack = Stack(app, \"github-runners\")\n GitHubRunners(stack, \"runners\")\n\n app.synth()\n ```\n </details>\n <details><summary>TypeScript or JavaScript</summary>\n\n ### Install\n Available on [npm][7].\n ```bash\n npm i @cloudsnorkel/cdk-github-runners\n ```\n ### Use\n ```typescript\n import { App, Stack } from 'aws-cdk-lib';\n import { GitHubRunners } from '@cloudsnorkel/cdk-github-runners';\n\n const app = new App();\n const stack = new Stack(app, 'github-runners');\n new GitHubRunners(stack, 'runners');\n\n app.synth();\n ```\n </details>\n <details><summary>Java</summary>\n\n ### Install\n Available on [Maven][8].\n ```xml\n <dependency>\n <groupId>com.cloudsnorkel</groupId>\n <artifactId>cdk.github.runners</artifactId>\n </dependency>\n ```\n ### Use\n ```java\n import software.amazon.awscdk.App;\n import software.amazon.awscdk.Stack;\n import com.cloudsnorkel.cdk.github.runners.GitHubRunners;\n\n public class Example {\n public static void main(String[] args){\n App app = new App();\n Stack stack = new Stack(app, \"github-runners\");\n GitHubRunners.Builder.create(stack, \"runners\").build();\n\n app.synth();\n }\n }\n ```\n </details>\n <details><summary>Go</summary>\n\n ### Install\n Available on [GitHub][11].\n ```bash\n go get github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners\n ```\n ### Use\n ```go\n package main\n\n import (\n \"github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners\"\n \"github.com/aws/aws-cdk-go/awscdk/v2\"\n \"github.com/aws/jsii-runtime-go\"\n )\n\n func main() {\n app := awscdk.NewApp(nil)\n stack := awscdk.NewStack(app, jsii.String(\"github-runners\"), &awscdk.StackProps{})\n cloudsnorkelcdkgithubrunners.NewGitHubRunners(stack, jsii.String(\"runners\"), &cloudsnorkelcdkgithubrunners.GitHubRunnersProps{})\n\n app.Synth(nil)\n }\n ```\n </details>\n <details><summary>.NET</summary>\n\n ### Install\n Available on [Nuget][12].\n ```bash\n dotnet add package CloudSnorkel.Cdk.Github.Runners\n ```\n ### Use\n ```csharp\n using Amazon.CDK;\n using CloudSnorkel;\n\n namespace Example\n {\n sealed class Program\n {\n public static void Main(string[] args)\n {\n var app = new App();\n var stack = new Stack(app, \"github-runners\");\n new GitHubRunners(stack, \"runners\");\n app.Synth();\n }\n }\n }\n ```\n </details>\n2. Use `GitHubRunners` construct in your code (starting with default arguments is fine)\n3. Deploy your stack\n4. Look for the status command output similar to `aws --region us-east-1 lambda invoke --function-name status-XYZ123 status.json`\n ```\n βœ… github-runners-test\n\n ✨ Deployment time: 260.01s\n\n Outputs:\n github-runners-test.runnersstatuscommand4A30F0F5 = aws --region us-east-1 lambda invoke --function-name github-runners-test-runnersstatus1A5771C0-mvttg8oPQnQS status.json\n ```\n5. Execute the status command (you may need to specify `--profile` too) and open the resulting `status.json` file\n6. Open the URL in `github.setup.url` from `status.json` or [manually setup GitHub](SETUP_GITHUB.md) integration as an app or with personal access token\n7. Run status command again to confirm `github.auth.status` and `github.webhook.status` are OK\n8. Trigger a GitHub action that has a `self-hosted` label with `runs-on: [self-hosted, codebuild]` (or non-default labels you set in step 2)\n9. If the action is not successful, see [troubleshooting](#Troubleshooting)\n\n[![Demo](demo-thumbnail.jpg)](https://youtu.be/wlyv_3V8lIw)\n\n## Customizing\n\nThe default providers configured by `GitHubRunners` are useful for testing but probably not too much for actual production work. They run in the default VPC or no VPC and have no added IAM permissions. You would usually want to configure the providers yourself.\n\nFor example:\n\n```typescript\nlet vpc: ec2.Vpc;\nlet runnerSg: ec2.SecurityGroup;\nlet dbSg: ec2.SecurityGroup;\nlet bucket: s3.Bucket;\n\n// create a custom CodeBuild provider\nconst myProvider = new CodeBuildRunnerProvider(this, 'codebuild runner', {\n labels: ['my-codebuild'],\n vpc: vpc,\n securityGroups: [runnerSg],\n});\n// grant some permissions to the provider\nbucket.grantReadWrite(myProvider);\ndbSg.connections.allowFrom(runnerSg, ec2.Port.tcp(3306), 'allow runners to connect to MySQL database');\n\n// create the runner infrastructure\nnew GitHubRunners(this, 'runners', {\n providers: [myProvider],\n});\n```\n\nAnother way to customize runners is by modifying the image used to spin them up. The image contains the [runner][5], any required dependencies, and integration code with the provider. You may choose to customize this image by adding more packages, for example.\n\n```typescript\nconst myBuilder = FargateRunnerProvider.imageBuilder(this, 'image builder');\nmyBuilder.addComponent(\n RunnerImageComponent.custom({ commands: ['apt install -y nginx xz-utils'] }),\n);\n\nconst myProvider = new FargateRunnerProvider(this, 'fargate runner', {\n labels: ['customized-fargate'],\n imageBuilder: myBuilder,\n});\n\n// create the runner infrastructure\nnew GitHubRunners(this, 'runners', {\n providers: [myProvider],\n});\n```\n\nYour workflow will then look like:\n\n```yaml\nname: self-hosted example\non: push\njobs:\n self-hosted:\n runs-on: [self-hosted, customized-fargate]\n steps:\n - run: echo hello world\n```\n\nWindows images can also be customized the same way.\n\n```typescript\nconst myWindowsBuilder = FargateRunnerProvider.imageBuilder(this, 'Windows image builder', {\n architecture: Architecture.X86_64,\n os: Os.WINDOWS,\n});\nmyWindowsBuilder.addComponent(\n RunnerImageComponent.custom({\n name: 'Ninja',\n commands: [\n 'Invoke-WebRequest -UseBasicParsing -Uri \"https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-win.zip\" -OutFile ninja.zip',\n 'Expand-Archive ninja.zip -DestinationPath C:\\\\actions',\n 'del ninja.zip',\n ],\n }),\n);\n\nconst myProvider = new FargateRunnerProvider(this, 'fargate runner', {\n labels: ['customized-windows-fargate'],\n imageBuilder: myWindowsBuilder,\n});\n\nnew GitHubRunners(this, 'runners', {\n providers: [myProvider],\n});\n```\n\nThe runner OS and architecture is determined by the image it is set to use. For example, to create a Fargate runner provider for ARM64 set the `architecture` property for the image builder to `Architecture.ARM64` in the image builder properties.\n\n```typescript\nnew GitHubRunners(this, 'runners', {\n providers: [\n new FargateRunnerProvider(this, 'fargate runner', {\n labels: ['arm64', 'fargate'],\n imageBuilder: FargateRunnerProvider.imageBuilder(this, 'image builder', {\n architecture: Architecture.ARM64,\n os: Os.LINUX_UBUNTU,\n }),\n }),\n ],\n});\n```\n\n### Composite Providers\n\nComposite providers allow you to combine multiple runner providers with different strategies. There are two types:\n\n**Fallback Strategy**: Try providers in order until one succeeds. Useful for trying spot instances first, then falling back to on-demand if spot capacity is unavailable.\n\n```typescript\n// Try spot instances first, fall back to on-demand if spot is unavailable\nconst ecsFallback = CompositeProvider.fallback(this, 'ECS Fallback', [\n new EcsRunnerProvider(this, 'ECS Spot', {\n labels: ['ecs', 'linux', 'x64'],\n spot: true,\n // ... other config\n }),\n new EcsRunnerProvider(this, 'ECS On-Demand', {\n labels: ['ecs', 'linux', 'x64'],\n spot: false,\n // ... other config\n }),\n]);\n\nnew GitHubRunners(this, 'runners', {\n providers: [ecsFallback],\n});\n```\n\n**Weighted Distribution Strategy**: Randomly select a provider based on weights. Useful for distributing load across multiple availability zones or instance types.\n\n```typescript\n// Distribute 60% of traffic to AZ-1, 40% to AZ-2\nconst distributedProvider = CompositeProvider.distribute(this, 'Fargate Distribution', [\n {\n weight: 3, // 3/(3+2) = 60%\n provider: new FargateRunnerProvider(this, 'Fargate AZ-1', {\n labels: ['fargate', 'linux', 'x64'],\n subnetSelection: vpc.selectSubnets({\n availabilityZones: [vpc.availabilityZones[0]],\n }),\n // ... other config\n }),\n },\n {\n weight: 2, // 2/(3+2) = 40%\n provider: new FargateRunnerProvider(this, 'Fargate AZ-2', {\n labels: ['fargate', 'linux', 'x64'],\n subnetSelection: vpc.selectSubnets({\n availabilityZones: [vpc.availabilityZones[1]],\n }),\n // ... other config\n }),\n },\n]);\n\nnew GitHubRunners(this, 'runners', {\n providers: [distributedProvider],\n});\n```\n\n**Important**: All providers in a composite must have the exact same labels. This ensures any provisioned runner can match the labels requested by the GitHub workflow job.\n\n### Custom Provider Selection\n\nBy default, providers are selected based on label matching: the first provider that has all the labels requested by the job is selected. You can customize this behavior using a provider selector Lambda function to:\n\n* Filter out certain jobs (prevent runner provisioning)\n* Dynamically select a provider based on job characteristics (repository, branch, time of day, etc.)\n* Customize labels for the runner (add, remove, or modify labels dynamically)\n\nThe selector function receives the full GitHub webhook payload, a map of all available providers and their labels, and the default provider/labels that would have been selected. It returns the provider to use (or `undefined` to skip runner creation) and the labels to assign to the runner.\n\n**Example: Route jobs to different providers based on repository**\n\n```typescript\nimport { ComputeType } from 'aws-cdk-lib/aws-codebuild';\nimport { Function, Code, Runtime } from 'aws-cdk-lib/aws-lambda';\nimport { GitHubRunners, CodeBuildRunnerProvider } from '@cloudsnorkel/cdk-github-runners';\n\nconst defaultProvider = new CodeBuildRunnerProvider(this, 'default', {\n labels: ['custom-runner', 'default'],\n});\nconst productionProvider = new CodeBuildRunnerProvider(this, 'production', {\n labels: ['custom-runner', 'production'],\n computeType: ComputeType.LARGE,\n});\n\nconst providerSelector = new Function(this, 'provider-selector', {\n runtime: Runtime.NODEJS_LATEST,\n handler: 'index.handler',\n code: Code.fromInline(`\n exports.handler = async (event) => {\n const { payload, providers, defaultProvider, defaultLabels } = event;\n\n // Route production repos to dedicated provider\n if (payload.repository.name.includes('prod')) {\n return {\n provider: '${productionProvider.node.path}',\n labels: ['custom-runner', 'production', 'modified-via-selector'],\n };\n }\n\n // Filter out draft PRs\n if (payload.workflow_job.head_branch?.startsWith('draft/')) {\n return { provider: undefined }; // Skip runner provisioning\n }\n\n // Use default for everything else\n return {\n provider: defaultProvider,\n labels: defaultLabels,\n };\n };\n `),\n});\n\nnew GitHubRunners(this, 'runners', {\n providers: [defaultProvider, productionProvider],\n providerSelector: providerSelector,\n});\n```\n\n**Example: Add dynamic labels based on job metadata**\n\n```typescript\nconst providerSelector = new Function(this, 'provider-selector', {\n runtime: Runtime.NODEJS_LATEST,\n handler: 'index.handler',\n code: Code.fromInline(`\n exports.handler = async (event) => {\n const { payload, defaultProvider, defaultLabels } = event;\n\n // Add branch name as a label\n const branch = payload.workflow_job.head_branch || 'unknown';\n const labels = [...(defaultLabels || []), 'branch:' + branch];\n\n return {\n provider: defaultProvider,\n labels: labels,\n };\n };\n `),\n});\n```\n\n**Important considerations:**\n\n* ⚠️ **Label matching responsibility**: You are responsible for ensuring the selected provider's labels match what the job requires. If labels don't match, the runner will be provisioned but GitHub Actions won't assign the job to it.\n* ⚠️ **No guarantee of assignment**: Provider selection only determines which provider will provision a runner. GitHub Actions may still route the job to any available runner with matching labels. For reliable provider assignment, consider repo-level runner registration (the default).\n* ⚑ **Performance**: The selector runs synchronously during webhook processing. Keep it fast and efficientβ€”the webhook has a 30-second timeout total.\n\n## Examples\n\nBeyond the code snippets above, the fullest example available is the [integration test](test/default.integ.ts).\n\nIf you have more to share, please open a PR adding them to the `examples` folder.\n\n## Architecture\n\n![Architecture diagram](architecture.svg)\n\n## Troubleshooting\n\nRunners are started in response to a webhook coming in from GitHub. If there are any issues starting the runner like missing capacity or transient API issues, the provider will keep retrying for 24 hours. Configuration issue related errors like pointing to a missing AMI will not be retried. GitHub itself will cancel the job if it can't find a runner for 24 hours. If your jobs don't start, follow the steps below to examine all parts of this workflow.\n\n1. Always start with the status function, make sure no errors are reported, and confirm all status codes are OK\n2. Make sure `runs-on` in the workflow matches the expected labels set in the runner provider\n3. Diagnose relevant executions of the orchestrator step function by visiting the URL in `troubleshooting.stepFunctionUrl` from `status.json`\n 1. If the execution failed, check your runner provider configuration for errors\n 2. If the execution is still running for a long time, check the execution events to see why runner starting is being retried\n 3. If there are no relevant executions, move to the next step\n4. Confirm the webhook Lambda was called by visiting the URL in `troubleshooting.webhookHandlerUrl` from `status.json`\n 1. If it's not called or logs errors, confirm the webhook settings on the GitHub side\n 2. If you see too many errors, make sure you're only sending `workflow_job` events\n5. When using GitHub app, make sure there are active installations in `github.auth.app.installations`\n\nAll logs are saved in CloudWatch.\n* Log group names can be found in `status.json` for each provider, image builder, and other parts of the system\n* Some useful Logs Insights queries can be enabled with `GitHubRunners.createLogsInsightsQueries()`\n\nTo get `status.json`, check out the CloudFormation stack output for a command that generates it. The command looks like:\n\n```\naws --region us-east-1 lambda invoke --function-name status-XYZ123 status.json\n```\n\n## Monitoring\n\nThere are two important ways to monitor your runners:\n\n1. Make sure runners don't fail to start. When that happens, jobs may sit and wait. Use `GitHubRunners.metricFailed()` to get a metric for the number of failed runner starts. You should use this metric to trigger an alarm.\n2. Make sure runner images don't fail to build. Failed runner image builds mean you will get stuck with out-of-date software on your runners. It may lead to security vulnerabilities, or it may lead to slower runner start-ups as the runner software itself needs to be updated. Use `GitHubRunners.failedImageBuildsTopic()` to get SNS topic that gets notified of failed runner image builds. You should subscribe to this topic.\n\nOther useful metrics to track:\n\n1. Use `GitHubRunners.metricJobCompleted()` to get a metric for the number of completed jobs broken down by labels and job success.\n2. Use `GitHubRunners.metricTime()` to get a metric for the total time a runner is running. This includes the overhead of starting the runner.\n\n## Contributing\n\nIf you use and love this project, please consider contributing.\n\n1. πŸͺ³ If you see something, say something. [Issues][16] help improve the quality of the project.\n * Include relevant logs and package versions for bugs.\n * When possible, describe the use-case behind feature requests.\n1. πŸ› οΈ [Pull requests][17] are welcome.\n * Run `npm run build` before submitting to make sure all tests pass.\n * Allow edits from maintainers so small adjustments can be made easily.\n1. πŸ’΅ Consider [sponsoring][15] the project to show your support and optionally get your name listed below.\n\n## Other Options\n\n1. [philips-labs/terraform-aws-github-runner][3] if you're using Terraform\n2. [actions/actions-runner-controller][4] if you're using Kubernetes\n\n\n[1]: https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners\n[2]: https://github.com/marketplace/actions/configure-aws-credentials-action-for-github-actions\n[3]: https://github.com/philips-labs/terraform-aws-github-runner\n[4]: https://github.com/actions/actions-runner-controller\n[5]: https://github.com/actions/runner\n[6]: https://pypi.org/project/cloudsnorkel.cdk-github-runners\n[7]: https://www.npmjs.com/package/@cloudsnorkel/cdk-github-runners\n[8]: https://central.sonatype.com/artifact/com.cloudsnorkel/cdk.github.runners/\n[9]: https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps\n[10]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token\n[11]: https://pkg.go.dev/github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners\n[12]: https://www.nuget.org/packages/CloudSnorkel.Cdk.Github.Runners/\n[13]: https://constructs.dev/packages/@cloudsnorkel/cdk-github-runners/\n[14]: https://docs.github.com/en/actions/hosting-your-own-runners/autoscaling-with-self-hosted-runners#using-ephemeral-runners-for-autoscaling\n[15]: https://github.com/sponsors/CloudSnorkel\n[16]: https://github.com/CloudSnorkel/cdk-github-runners/issues\n[17]: https://github.com/CloudSnorkel/cdk-github-runners/pulls\n"
3861
+ "markdown": "# GitHub Self-Hosted Runners CDK Constructs\n\n[![NPM](https://img.shields.io/npm/v/@cloudsnorkel/cdk-github-runners?label=npm&logo=npm)][7]\n[![PyPI](https://img.shields.io/pypi/v/cloudsnorkel.cdk-github-runners?label=pypi&logo=pypi)][6]\n[![Maven Central](https://img.shields.io/maven-central/v/com.cloudsnorkel/cdk.github.runners.svg?label=Maven%20Central&logo=apachemaven)][8]\n[![Go](https://img.shields.io/github/v/tag/CloudSnorkel/cdk-github-runners?color=red&label=go&logo=go)][11]\n[![Nuget](https://img.shields.io/nuget/v/CloudSnorkel.Cdk.Github.Runners?color=red&&logo=nuget)][12]\n[![Release](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml/badge.svg)](https://github.com/CloudSnorkel/cdk-github-runners/actions/workflows/release.yml)\n[![License](https://img.shields.io/badge/license-Apache--2.0-blue)](https://github.com/CloudSnorkel/cdk-github-runners/blob/main/LICENSE)\n\nUse this CDK construct to create ephemeral [self-hosted GitHub runners][1] on-demand inside your AWS account.\n\n* 🧩 Easy to configure GitHub integration with a web-based interface\n* 🧠 Customizable runners with decent defaults\n* πŸƒπŸ» Multiple runner configurations controlled by labels\n* πŸ” Everything fully hosted in your account\n* πŸ”ƒ Automatically updated build environment with latest runner version\n\nSelf-hosted runners in AWS are useful when:\n\n* You need easy access to internal resources in your actions\n* You want to pre-install some software for your actions\n* You want to provide some basic AWS API access (but [aws-actions/configure-aws-credentials][2] has more security controls)\n* You are using GitHub Enterprise Server\n\nEphemeral (or on-demand) runners are the [recommended way by GitHub][14] for auto-scaling, and they make sure all jobs run with a clean image. Runners are started on-demand. You don't pay unless a job is running.\n\n## API\n\nThe best way to browse API documentation is on [Constructs Hub][13]. It is available in all supported programming languages.\n\n## Providers\n\nA runner provider creates compute resources on-demand and uses [actions/runner][5] to start a runner.\n\n| | EC2 | CodeBuild | Fargate | ECS | Lambda |\n|------------------|-------------------|----------------------------|----------------|----------------|---------------|\n| **Time limit** | Unlimited | 8 hours | Unlimited | Unlimited | 15 minutes |\n| **vCPUs** | Unlimited | 2, 4, 8, or 72 | 0.25 to 4 | Unlimited | 1 to 6 |\n| **RAM** | Unlimited | 3gb, 7gb, 15gb, or 145gb | 512mb to 30gb | Unlimited | 128mb to 10gb |\n| **Storage** | Unlimited | 50gb to 824gb | 20gb to 200gb | Unlimited | Up to 10gb |\n| **Architecture** | x86_64, ARM64 | x86_64, ARM64 | x86_64, ARM64 | x86_64, ARM64 | x86_64, ARM64 |\n| **sudo** | βœ” | βœ” | βœ” | βœ” | ❌ |\n| **Docker** | βœ” | βœ” (Linux only) | ❌ | βœ” | ❌ |\n| **Spot pricing** | βœ” | ❌ | βœ” | βœ” | ❌ |\n| **OS** | Linux, Windows | Linux, Windows | Linux, Windows | Linux, Windows | Linux |\n\nThe best provider to use mostly depends on your current infrastructure. When in doubt, CodeBuild is always a good choice. Execution history and logs are easy to view, and it has no restrictive limits unless you need to run for more than 8 hours.\n\n* EC2 is useful when you want runners to have complete access to the host\n* ECS is useful when you want to control the infrastructure, like leaving the runner host running for faster startups\n* Lambda is useful for short jobs that can work within time, size and readonly system constraints\n\nYou can also create your own provider by implementing `IRunnerProvider`.\n\n## Installation\n\n1. Install and use the appropriate package\n <details><summary>Python</summary>\n\n ### Install\n Available on [PyPI][6].\n ```bash\n pip install cloudsnorkel.cdk-github-runners\n ```\n ### Use\n ```python\n from aws_cdk import App, Stack\n from cloudsnorkel.cdk_github_runners import GitHubRunners\n\n app = App()\n stack = Stack(app, \"github-runners\")\n GitHubRunners(stack, \"runners\")\n\n app.synth()\n ```\n </details>\n <details><summary>TypeScript or JavaScript</summary>\n\n ### Install\n Available on [npm][7].\n ```bash\n npm i @cloudsnorkel/cdk-github-runners\n ```\n ### Use\n ```typescript\n import { App, Stack } from 'aws-cdk-lib';\n import { GitHubRunners } from '@cloudsnorkel/cdk-github-runners';\n\n const app = new App();\n const stack = new Stack(app, 'github-runners');\n new GitHubRunners(stack, 'runners');\n\n app.synth();\n ```\n </details>\n <details><summary>Java</summary>\n\n ### Install\n Available on [Maven][8].\n ```xml\n <dependency>\n <groupId>com.cloudsnorkel</groupId>\n <artifactId>cdk.github.runners</artifactId>\n </dependency>\n ```\n ### Use\n ```java\n import software.amazon.awscdk.App;\n import software.amazon.awscdk.Stack;\n import com.cloudsnorkel.cdk.github.runners.GitHubRunners;\n\n public class Example {\n public static void main(String[] args){\n App app = new App();\n Stack stack = new Stack(app, \"github-runners\");\n GitHubRunners.Builder.create(stack, \"runners\").build();\n\n app.synth();\n }\n }\n ```\n </details>\n <details><summary>Go</summary>\n\n ### Install\n Available on [GitHub][11].\n ```bash\n go get github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners\n ```\n ### Use\n ```go\n package main\n\n import (\n \"github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners\"\n \"github.com/aws/aws-cdk-go/awscdk/v2\"\n \"github.com/aws/jsii-runtime-go\"\n )\n\n func main() {\n app := awscdk.NewApp(nil)\n stack := awscdk.NewStack(app, jsii.String(\"github-runners\"), &awscdk.StackProps{})\n cloudsnorkelcdkgithubrunners.NewGitHubRunners(stack, jsii.String(\"runners\"), &cloudsnorkelcdkgithubrunners.GitHubRunnersProps{})\n\n app.Synth(nil)\n }\n ```\n </details>\n <details><summary>.NET</summary>\n\n ### Install\n Available on [Nuget][12].\n ```bash\n dotnet add package CloudSnorkel.Cdk.Github.Runners\n ```\n ### Use\n ```csharp\n using Amazon.CDK;\n using CloudSnorkel;\n\n namespace Example\n {\n sealed class Program\n {\n public static void Main(string[] args)\n {\n var app = new App();\n var stack = new Stack(app, \"github-runners\");\n new GitHubRunners(stack, \"runners\");\n app.Synth();\n }\n }\n }\n ```\n </details>\n2. Use `GitHubRunners` construct in your code (starting with default arguments is fine)\n3. Deploy your stack\n4. Look for the status command output similar to `aws --region us-east-1 lambda invoke --function-name status-XYZ123 status.json`\n ```\n βœ… github-runners-test\n\n ✨ Deployment time: 260.01s\n\n Outputs:\n github-runners-test.runnersstatuscommand4A30F0F5 = aws --region us-east-1 lambda invoke --function-name github-runners-test-runnersstatus1A5771C0-mvttg8oPQnQS status.json\n ```\n5. Execute the status command (you may need to specify `--profile` too) and open the resulting `status.json` file\n6. Open the URL in `github.setup.url` from `status.json` or [manually setup GitHub](SETUP_GITHUB.md) integration as an app or with personal access token\n7. Run status command again to confirm `github.auth.status` and `github.webhook.status` are OK\n8. Trigger a GitHub action that has a `self-hosted` label with `runs-on: [self-hosted, codebuild]` (or non-default labels you set in step 2)\n9. If the action is not successful, see [troubleshooting](#Troubleshooting)\n\n[![Demo](demo-thumbnail.jpg)](https://youtu.be/wlyv_3V8lIw)\n\n## Customizing\n\nThe default providers configured by `GitHubRunners` are useful for testing but probably not too much for actual production work. They run in the default VPC or no VPC and have no added IAM permissions. You would usually want to configure the providers yourself.\n\nFor example:\n\n```typescript\nlet vpc: ec2.Vpc;\nlet runnerSg: ec2.SecurityGroup;\nlet dbSg: ec2.SecurityGroup;\nlet bucket: s3.Bucket;\n\n// create a custom CodeBuild provider\nconst myProvider = new CodeBuildRunnerProvider(this, 'codebuild runner', {\n labels: ['my-codebuild'],\n vpc: vpc,\n securityGroups: [runnerSg],\n});\n// grant some permissions to the provider\nbucket.grantReadWrite(myProvider);\ndbSg.connections.allowFrom(runnerSg, ec2.Port.tcp(3306), 'allow runners to connect to MySQL database');\n\n// create the runner infrastructure\nnew GitHubRunners(this, 'runners', {\n providers: [myProvider],\n});\n```\n\nAnother way to customize runners is by modifying the image used to spin them up. The image contains the [runner][5], any required dependencies, and integration code with the provider. You may choose to customize this image by adding more packages, for example.\n\n```typescript\nconst myBuilder = FargateRunnerProvider.imageBuilder(this, 'image builder');\nmyBuilder.addComponent(\n RunnerImageComponent.custom({ commands: ['apt install -y nginx xz-utils'] }),\n);\n\nconst myProvider = new FargateRunnerProvider(this, 'fargate runner', {\n labels: ['customized-fargate'],\n imageBuilder: myBuilder,\n});\n\n// create the runner infrastructure\nnew GitHubRunners(this, 'runners', {\n providers: [myProvider],\n});\n```\n\nYour workflow will then look like:\n\n```yaml\nname: self-hosted example\non: push\njobs:\n self-hosted:\n runs-on: [self-hosted, customized-fargate]\n steps:\n - run: echo hello world\n```\n\nWindows images can also be customized the same way.\n\n```typescript\nconst myWindowsBuilder = FargateRunnerProvider.imageBuilder(this, 'Windows image builder', {\n architecture: Architecture.X86_64,\n os: Os.WINDOWS,\n});\nmyWindowsBuilder.addComponent(\n RunnerImageComponent.custom({\n name: 'Ninja',\n commands: [\n 'Invoke-WebRequest -UseBasicParsing -Uri \"https://github.com/ninja-build/ninja/releases/download/v1.11.1/ninja-win.zip\" -OutFile ninja.zip',\n 'Expand-Archive ninja.zip -DestinationPath C:\\\\actions',\n 'del ninja.zip',\n ],\n }),\n);\n\nconst myProvider = new FargateRunnerProvider(this, 'fargate runner', {\n labels: ['customized-windows-fargate'],\n imageBuilder: myWindowsBuilder,\n});\n\nnew GitHubRunners(this, 'runners', {\n providers: [myProvider],\n});\n```\n\nThe runner OS and architecture is determined by the image it is set to use. For example, to create a Fargate runner provider for ARM64 set the `architecture` property for the image builder to `Architecture.ARM64` in the image builder properties.\n\n```typescript\nnew GitHubRunners(this, 'runners', {\n providers: [\n new FargateRunnerProvider(this, 'fargate runner', {\n labels: ['arm64', 'fargate'],\n imageBuilder: FargateRunnerProvider.imageBuilder(this, 'image builder', {\n architecture: Architecture.ARM64,\n os: Os.LINUX_UBUNTU,\n }),\n }),\n ],\n});\n```\n\n### Composite Providers\n\nComposite providers allow you to combine multiple runner providers with different strategies. There are two types:\n\n**Fallback Strategy**: Try providers in order until one succeeds. Useful for trying spot instances first, then falling back to on-demand if spot capacity is unavailable.\n\n```typescript\n// Try spot instances first, fall back to on-demand if spot is unavailable\nconst ecsFallback = CompositeProvider.fallback(this, 'ECS Fallback', [\n new EcsRunnerProvider(this, 'ECS Spot', {\n labels: ['ecs', 'linux', 'x64'],\n spot: true,\n // ... other config\n }),\n new EcsRunnerProvider(this, 'ECS On-Demand', {\n labels: ['ecs', 'linux', 'x64'],\n spot: false,\n // ... other config\n }),\n]);\n\nnew GitHubRunners(this, 'runners', {\n providers: [ecsFallback],\n});\n```\n\n**Weighted Distribution Strategy**: Randomly select a provider based on weights. Useful for distributing load across multiple availability zones or instance types.\n\n```typescript\n// Distribute 60% of traffic to AZ-1, 40% to AZ-2\nconst distributedProvider = CompositeProvider.distribute(this, 'Fargate Distribution', [\n {\n weight: 3, // 3/(3+2) = 60%\n provider: new FargateRunnerProvider(this, 'Fargate AZ-1', {\n labels: ['fargate', 'linux', 'x64'],\n subnetSelection: vpc.selectSubnets({\n availabilityZones: [vpc.availabilityZones[0]],\n }),\n // ... other config\n }),\n },\n {\n weight: 2, // 2/(3+2) = 40%\n provider: new FargateRunnerProvider(this, 'Fargate AZ-2', {\n labels: ['fargate', 'linux', 'x64'],\n subnetSelection: vpc.selectSubnets({\n availabilityZones: [vpc.availabilityZones[1]],\n }),\n // ... other config\n }),\n },\n]);\n\nnew GitHubRunners(this, 'runners', {\n providers: [distributedProvider],\n});\n```\n\n**Important**: All providers in a composite must have the exact same labels. This ensures any provisioned runner can match the labels requested by the GitHub workflow job.\n\n### Custom Provider Selection\n\nBy default, providers are selected based on label matching: the first provider that has all the labels requested by the job is selected. You can customize this behavior using a provider selector Lambda function to:\n\n* Filter out certain jobs (prevent runner provisioning)\n* Dynamically select a provider based on job characteristics (repository, branch, time of day, etc.)\n* Customize labels for the runner (add, remove, or modify labels dynamically)\n\nThe selector function receives the full GitHub webhook payload, a map of all available providers and their labels, and the default provider/labels that would have been selected. It returns the provider to use (or `undefined` to skip runner creation) and the labels to assign to the runner.\n\n**Example: Route jobs to different providers based on repository**\n\n```typescript\nimport { ComputeType } from 'aws-cdk-lib/aws-codebuild';\nimport { Function, Code, Runtime } from 'aws-cdk-lib/aws-lambda';\nimport { GitHubRunners, CodeBuildRunnerProvider } from '@cloudsnorkel/cdk-github-runners';\n\nconst defaultProvider = new CodeBuildRunnerProvider(this, 'default', {\n labels: ['custom-runner', 'default'],\n});\nconst productionProvider = new CodeBuildRunnerProvider(this, 'production', {\n labels: ['custom-runner', 'production'],\n computeType: ComputeType.LARGE,\n});\n\nconst providerSelector = new Function(this, 'provider-selector', {\n runtime: Runtime.NODEJS_LATEST,\n handler: 'index.handler',\n code: Code.fromInline(`\n exports.handler = async (event) => {\n const { payload, providers, defaultProvider, defaultLabels } = event;\n\n // Route production repos to dedicated provider\n if (payload.repository.name.includes('prod')) {\n return {\n provider: '${productionProvider.node.path}',\n labels: ['custom-runner', 'production', 'modified-via-selector'],\n };\n }\n\n // Filter out draft PRs\n if (payload.workflow_job.head_branch?.startsWith('draft/')) {\n return { provider: undefined }; // Skip runner provisioning\n }\n\n // Use default for everything else\n return {\n provider: defaultProvider,\n labels: defaultLabels,\n };\n };\n `),\n});\n\nnew GitHubRunners(this, 'runners', {\n providers: [defaultProvider, productionProvider],\n providerSelector: providerSelector,\n});\n```\n\n**Example: Add dynamic labels based on job metadata**\n\n```typescript\nconst providerSelector = new Function(this, 'provider-selector', {\n runtime: Runtime.NODEJS_LATEST,\n handler: 'index.handler',\n code: Code.fromInline(`\n exports.handler = async (event) => {\n const { payload, defaultProvider, defaultLabels } = event;\n\n // Add branch name as a label\n const branch = payload.workflow_job.head_branch || 'unknown';\n const labels = [...(defaultLabels || []), 'branch:' + branch];\n\n return {\n provider: defaultProvider,\n labels: labels,\n };\n };\n `),\n});\n```\n\n**Important considerations:**\n\n* ⚠️ **Label matching responsibility**: You are responsible for ensuring the selected provider's labels match what the job requires. If labels don't match, the runner will be provisioned but GitHub Actions won't assign the job to it.\n* ⚠️ **No guarantee of assignment**: Provider selection only determines which provider will provision a runner. GitHub Actions may still route the job to any available runner with matching labels. For reliable provider assignment, consider repo-level runner registration (the default).\n* ⚑ **Performance**: The selector runs synchronously during webhook processing. Keep it fast and efficientβ€”the webhook has a 30-second timeout total.\n\n## Examples\n\nWe provide comprehensive examples in the [`examples/`](examples/) folder to help you get started quickly:\n\n### Getting Started\n- **[Simple CodeBuild](examples/typescript/simple-codebuild/)** - Basic setup with just a CodeBuild provider (also available in [Python](examples/python/simple-codebuild/))\n\n### Provider Configuration\n- **[Composite Provider](examples/typescript/composite-provider/)** - Fallback and weighted distribution strategies (also available in [Python](examples/python/composite-provider/))\n- **[Provider Selector](examples/typescript/provider-selector/)** - Custom provider selection with Lambda function (also available in [Python](examples/python/provider-selector/))\n- **[EC2 Windows Provider](examples/typescript/ec2-windows-provider/)** - EC2 configuration for Windows runners (also available in [Python](examples/python/ec2-windows-provider/))\n\n### Compute & Performance\n- **[Compute Options](examples/typescript/compute-options/)** - Configure CPU, memory, and instance types for different providers (also available in [Python](examples/python/compute-options/))\n- **[Spot Instances](examples/typescript/spot-instances/)** - Use spot instances for cost savings across EC2, Fargate, and ECS (also available in [Python](examples/python/spot-instances/))\n- **[Storage Options](examples/typescript/storage-options/)** - Custom EBS storage options for EC2 runners (also available in [Python](examples/python/storage-options/))\n- **[ECS Scaling](examples/typescript/ecs-scaling/)** - Custom autoscaling group scaling policies for ECS providers (also available in [Python](examples/python/ecs-scaling/))\n\n### Security & Access\n- **[IAM Permissions](examples/typescript/iam-permissions/)** - Grant AWS IAM permissions to runners (also available in [Python](examples/python/iam-permissions/))\n- **[Network Access](examples/typescript/network-access/)** - Configure network access with VPCs and security groups (also available in [Python](examples/python/network-access/))\n- **[Access Control](examples/typescript/access-control/)** - Configure access control for webhook and setup functions (also available in [Python](examples/python/access-control/))\n\n### Customization\n- **[Add Software](examples/typescript/add-software/)** - Add custom software to runner images (also available in [Python](examples/python/add-software/))\n\n### Enterprise & Monitoring\n- **[GHES](examples/typescript/ghes/)** - Configure runners for GitHub Enterprise Server (also available in [Python](examples/python/ghes/))\n- **[Monitoring](examples/typescript/monitoring/)** - Set up CloudWatch alarms and SNS notifications (also available in [Python](examples/python/monitoring/))\n\nEach example is self-contained with its own dependencies and README. Start with the simple examples and work your way up to more advanced configurations.\n\nAnother good and very full example is the [integration test](test/default.integ.ts).\n\nIf you have more to share, please open a PR adding examples to the `examples` folder.\n\n## Architecture\n\n![Architecture diagram](architecture.svg)\n\n## Troubleshooting\n\nRunners are started in response to a webhook coming in from GitHub. If there are any issues starting the runner like missing capacity or transient API issues, the provider will keep retrying for 24 hours. Configuration issue related errors like pointing to a missing AMI will not be retried. GitHub itself will cancel the job if it can't find a runner for 24 hours. If your jobs don't start, follow the steps below to examine all parts of this workflow.\n\n1. Always start with the status function, make sure no errors are reported, and confirm all status codes are OK\n2. Make sure `runs-on` in the workflow matches the expected labels set in the runner provider\n3. Diagnose relevant executions of the orchestrator step function by visiting the URL in `troubleshooting.stepFunctionUrl` from `status.json`\n 1. If the execution failed, check your runner provider configuration for errors\n 2. If the execution is still running for a long time, check the execution events to see why runner starting is being retried\n 3. If there are no relevant executions, move to the next step\n4. Confirm the webhook Lambda was called by visiting the URL in `troubleshooting.webhookHandlerUrl` from `status.json`\n 1. If it's not called or logs errors, confirm the webhook settings on the GitHub side\n 2. If you see too many errors, make sure you're only sending `workflow_job` events\n5. When using GitHub app, make sure there are active installations in `github.auth.app.installations`\n\nAll logs are saved in CloudWatch.\n* Log group names can be found in `status.json` for each provider, image builder, and other parts of the system\n* Some useful Logs Insights queries can be enabled with `GitHubRunners.createLogsInsightsQueries()`\n\nTo get `status.json`, check out the CloudFormation stack output for a command that generates it. The command looks like:\n\n```\naws --region us-east-1 lambda invoke --function-name status-XYZ123 status.json\n```\n\n## Monitoring\n\nThere are two important ways to monitor your runners:\n\n1. Make sure runners don't fail to start. When that happens, jobs may sit and wait. Use `GitHubRunners.metricFailed()` to get a metric for the number of failed runner starts. You should use this metric to trigger an alarm.\n2. Make sure runner images don't fail to build. Failed runner image builds mean you will get stuck with out-of-date software on your runners. It may lead to security vulnerabilities, or it may lead to slower runner start-ups as the runner software itself needs to be updated. Use `GitHubRunners.failedImageBuildsTopic()` to get SNS topic that gets notified of failed runner image builds. You should subscribe to this topic.\n\nOther useful metrics to track:\n\n1. Use `GitHubRunners.metricJobCompleted()` to get a metric for the number of completed jobs broken down by labels and job success.\n2. Use `GitHubRunners.metricTime()` to get a metric for the total time a runner is running. This includes the overhead of starting the runner.\n\n## Contributing\n\nIf you use and love this project, please consider contributing.\n\n1. πŸͺ³ If you see something, say something. [Issues][16] help improve the quality of the project.\n * Include relevant logs and package versions for bugs.\n * When possible, describe the use-case behind feature requests.\n1. πŸ› οΈ [Pull requests][17] are welcome.\n * Run `npm run build` before submitting to make sure all tests pass.\n * Allow edits from maintainers so small adjustments can be made easily.\n1. πŸ’΅ Consider [sponsoring][15] the project to show your support and optionally get your name listed below.\n\n## Other Options\n\n1. [philips-labs/terraform-aws-github-runner][3] if you're using Terraform\n2. [actions/actions-runner-controller][4] if you're using Kubernetes\n\n\n[1]: https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners\n[2]: https://github.com/marketplace/actions/configure-aws-credentials-action-for-github-actions\n[3]: https://github.com/philips-labs/terraform-aws-github-runner\n[4]: https://github.com/actions/actions-runner-controller\n[5]: https://github.com/actions/runner\n[6]: https://pypi.org/project/cloudsnorkel.cdk-github-runners\n[7]: https://www.npmjs.com/package/@cloudsnorkel/cdk-github-runners\n[8]: https://central.sonatype.com/artifact/com.cloudsnorkel/cdk.github.runners/\n[9]: https://docs.github.com/en/developers/apps/getting-started-with-apps/about-apps\n[10]: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token\n[11]: https://pkg.go.dev/github.com/CloudSnorkel/cdk-github-runners-go/cloudsnorkelcdkgithubrunners\n[12]: https://www.nuget.org/packages/CloudSnorkel.Cdk.Github.Runners/\n[13]: https://constructs.dev/packages/@cloudsnorkel/cdk-github-runners/\n[14]: https://docs.github.com/en/actions/hosting-your-own-runners/autoscaling-with-self-hosted-runners#using-ephemeral-runners-for-autoscaling\n[15]: https://github.com/sponsors/CloudSnorkel\n[16]: https://github.com/CloudSnorkel/cdk-github-runners/issues\n[17]: https://github.com/CloudSnorkel/cdk-github-runners/pulls\n"
3862
3862
  },
3863
3863
  "repository": {
3864
3864
  "type": "git",
@@ -4813,7 +4813,7 @@
4813
4813
  "kind": "interface",
4814
4814
  "locationInModule": {
4815
4815
  "filename": "src/image-builders/aws-image-builder/builder.ts",
4816
- "line": 33
4816
+ "line": 34
4817
4817
  },
4818
4818
  "name": "AwsImageBuilderRunnerImageBuilderProps",
4819
4819
  "properties": [
@@ -4828,7 +4828,7 @@
4828
4828
  "immutable": true,
4829
4829
  "locationInModule": {
4830
4830
  "filename": "src/image-builders/aws-image-builder/builder.ts",
4831
- "line": 57
4831
+ "line": 58
4832
4832
  },
4833
4833
  "name": "fastLaunchOptions",
4834
4834
  "optional": true,
@@ -4846,7 +4846,7 @@
4846
4846
  "immutable": true,
4847
4847
  "locationInModule": {
4848
4848
  "filename": "src/image-builders/aws-image-builder/builder.ts",
4849
- "line": 39
4849
+ "line": 40
4850
4850
  },
4851
4851
  "name": "instanceType",
4852
4852
  "optional": true,
@@ -4865,7 +4865,7 @@
4865
4865
  "immutable": true,
4866
4866
  "locationInModule": {
4867
4867
  "filename": "src/image-builders/aws-image-builder/builder.ts",
4868
- "line": 48
4868
+ "line": 49
4869
4869
  },
4870
4870
  "name": "storageSize",
4871
4871
  "optional": true,
@@ -4876,6 +4876,474 @@
4876
4876
  ],
4877
4877
  "symbolId": "src/image-builders/aws-image-builder/builder:AwsImageBuilderRunnerImageBuilderProps"
4878
4878
  },
4879
+ "@cloudsnorkel/cdk-github-runners.BaseContainerImage": {
4880
+ "assembly": "@cloudsnorkel/cdk-github-runners",
4881
+ "docs": {
4882
+ "remarks": "This class is adapted from AWS CDK's BaseContainerImage class to support both string and object inputs.",
4883
+ "stability": "experimental",
4884
+ "summary": "Represents a base container image that is used to start from in EC2 Image Builder container builds."
4885
+ },
4886
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseContainerImage",
4887
+ "initializer": {
4888
+ "docs": {
4889
+ "stability": "experimental"
4890
+ },
4891
+ "locationInModule": {
4892
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
4893
+ "line": 163
4894
+ },
4895
+ "parameters": [
4896
+ {
4897
+ "name": "image",
4898
+ "type": {
4899
+ "primitive": "string"
4900
+ }
4901
+ },
4902
+ {
4903
+ "name": "ecrRepository",
4904
+ "optional": true,
4905
+ "type": {
4906
+ "fqn": "aws-cdk-lib.aws_ecr.IRepository"
4907
+ }
4908
+ }
4909
+ ],
4910
+ "protected": true
4911
+ },
4912
+ "kind": "class",
4913
+ "locationInModule": {
4914
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
4915
+ "line": 110
4916
+ },
4917
+ "methods": [
4918
+ {
4919
+ "docs": {
4920
+ "stability": "experimental",
4921
+ "summary": "The DockerHub image to use as the base image in a container recipe."
4922
+ },
4923
+ "locationInModule": {
4924
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
4925
+ "line": 117
4926
+ },
4927
+ "name": "fromDockerHub",
4928
+ "parameters": [
4929
+ {
4930
+ "docs": {
4931
+ "summary": "The DockerHub repository where the base image resides in."
4932
+ },
4933
+ "name": "repository",
4934
+ "type": {
4935
+ "primitive": "string"
4936
+ }
4937
+ },
4938
+ {
4939
+ "docs": {
4940
+ "summary": "The tag of the base image in the DockerHub repository."
4941
+ },
4942
+ "name": "tag",
4943
+ "type": {
4944
+ "primitive": "string"
4945
+ }
4946
+ }
4947
+ ],
4948
+ "returns": {
4949
+ "type": {
4950
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseContainerImage"
4951
+ }
4952
+ },
4953
+ "static": true
4954
+ },
4955
+ {
4956
+ "docs": {
4957
+ "stability": "experimental",
4958
+ "summary": "The ECR container image to use as the base image in a container recipe."
4959
+ },
4960
+ "locationInModule": {
4961
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
4962
+ "line": 127
4963
+ },
4964
+ "name": "fromEcr",
4965
+ "parameters": [
4966
+ {
4967
+ "docs": {
4968
+ "summary": "The ECR repository where the base image resides in."
4969
+ },
4970
+ "name": "repository",
4971
+ "type": {
4972
+ "fqn": "aws-cdk-lib.aws_ecr.IRepository"
4973
+ }
4974
+ },
4975
+ {
4976
+ "docs": {
4977
+ "summary": "The tag of the base image in the ECR repository."
4978
+ },
4979
+ "name": "tag",
4980
+ "type": {
4981
+ "primitive": "string"
4982
+ }
4983
+ }
4984
+ ],
4985
+ "returns": {
4986
+ "type": {
4987
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseContainerImage"
4988
+ }
4989
+ },
4990
+ "static": true
4991
+ },
4992
+ {
4993
+ "docs": {
4994
+ "stability": "experimental",
4995
+ "summary": "The ECR public container image to use as the base image in a container recipe."
4996
+ },
4997
+ "locationInModule": {
4998
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
4999
+ "line": 138
5000
+ },
5001
+ "name": "fromEcrPublic",
5002
+ "parameters": [
5003
+ {
5004
+ "docs": {
5005
+ "summary": "The alias of the ECR public registry where the base image resides in."
5006
+ },
5007
+ "name": "registryAlias",
5008
+ "type": {
5009
+ "primitive": "string"
5010
+ }
5011
+ },
5012
+ {
5013
+ "docs": {
5014
+ "summary": "The name of the ECR public repository, where the base image resides in."
5015
+ },
5016
+ "name": "repositoryName",
5017
+ "type": {
5018
+ "primitive": "string"
5019
+ }
5020
+ },
5021
+ {
5022
+ "docs": {
5023
+ "summary": "The tag of the base image in the ECR public repository."
5024
+ },
5025
+ "name": "tag",
5026
+ "type": {
5027
+ "primitive": "string"
5028
+ }
5029
+ }
5030
+ ],
5031
+ "returns": {
5032
+ "type": {
5033
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseContainerImage"
5034
+ }
5035
+ },
5036
+ "static": true
5037
+ },
5038
+ {
5039
+ "docs": {
5040
+ "remarks": "This can be an EC2 Image Builder image ARN,\nan ECR or ECR public image, or a container URI sourced from a third-party container registry such as DockerHub.",
5041
+ "stability": "experimental",
5042
+ "summary": "The string value of the base image to use in a container recipe."
5043
+ },
5044
+ "locationInModule": {
5045
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5046
+ "line": 148
5047
+ },
5048
+ "name": "fromString",
5049
+ "parameters": [
5050
+ {
5051
+ "docs": {
5052
+ "summary": "The base image as a direct string value."
5053
+ },
5054
+ "name": "baseContainerImageString",
5055
+ "type": {
5056
+ "primitive": "string"
5057
+ }
5058
+ }
5059
+ ],
5060
+ "returns": {
5061
+ "type": {
5062
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseContainerImage"
5063
+ }
5064
+ },
5065
+ "static": true
5066
+ }
5067
+ ],
5068
+ "name": "BaseContainerImage",
5069
+ "properties": [
5070
+ {
5071
+ "docs": {
5072
+ "stability": "experimental",
5073
+ "summary": "The rendered base image to use."
5074
+ },
5075
+ "immutable": true,
5076
+ "locationInModule": {
5077
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5078
+ "line": 155
5079
+ },
5080
+ "name": "image",
5081
+ "type": {
5082
+ "primitive": "string"
5083
+ }
5084
+ },
5085
+ {
5086
+ "docs": {
5087
+ "remarks": "This allows automatic permission granting for CodeBuild.",
5088
+ "stability": "experimental",
5089
+ "summary": "The ECR repository if this image was created from an ECR repository."
5090
+ },
5091
+ "immutable": true,
5092
+ "locationInModule": {
5093
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5094
+ "line": 161
5095
+ },
5096
+ "name": "ecrRepository",
5097
+ "optional": true,
5098
+ "type": {
5099
+ "fqn": "aws-cdk-lib.aws_ecr.IRepository"
5100
+ }
5101
+ }
5102
+ ],
5103
+ "symbolId": "src/image-builders/aws-image-builder/base-image:BaseContainerImage"
5104
+ },
5105
+ "@cloudsnorkel/cdk-github-runners.BaseImage": {
5106
+ "assembly": "@cloudsnorkel/cdk-github-runners",
5107
+ "docs": {
5108
+ "remarks": "This class is adapted from AWS CDK's BaseImage class to support both string and object inputs.",
5109
+ "stability": "experimental",
5110
+ "summary": "Represents a base image that is used to start from in EC2 Image Builder image builds."
5111
+ },
5112
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage",
5113
+ "initializer": {
5114
+ "docs": {
5115
+ "stability": "experimental"
5116
+ },
5117
+ "locationInModule": {
5118
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5119
+ "line": 91
5120
+ },
5121
+ "parameters": [
5122
+ {
5123
+ "name": "image",
5124
+ "type": {
5125
+ "primitive": "string"
5126
+ }
5127
+ }
5128
+ ],
5129
+ "protected": true
5130
+ },
5131
+ "kind": "class",
5132
+ "locationInModule": {
5133
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5134
+ "line": 20
5135
+ },
5136
+ "methods": [
5137
+ {
5138
+ "docs": {
5139
+ "stability": "experimental",
5140
+ "summary": "The AMI ID to use as a base image in an image recipe."
5141
+ },
5142
+ "locationInModule": {
5143
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5144
+ "line": 26
5145
+ },
5146
+ "name": "fromAmiId",
5147
+ "parameters": [
5148
+ {
5149
+ "docs": {
5150
+ "summary": "The AMI ID to use as the base image."
5151
+ },
5152
+ "name": "amiId",
5153
+ "type": {
5154
+ "primitive": "string"
5155
+ }
5156
+ }
5157
+ ],
5158
+ "returns": {
5159
+ "type": {
5160
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
5161
+ }
5162
+ },
5163
+ "static": true
5164
+ },
5165
+ {
5166
+ "docs": {
5167
+ "remarks": "This constructs an Image Builder ARN for AWS-provided images like `ubuntu-server-22-lts-x86/x.x.x`.",
5168
+ "stability": "experimental",
5169
+ "summary": "An AWS-provided EC2 Image Builder image to use as a base image in an image recipe."
5170
+ },
5171
+ "locationInModule": {
5172
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5173
+ "line": 39
5174
+ },
5175
+ "name": "fromImageBuilder",
5176
+ "parameters": [
5177
+ {
5178
+ "docs": {
5179
+ "summary": "The construct scope (used to determine the stack and region)."
5180
+ },
5181
+ "name": "scope",
5182
+ "type": {
5183
+ "fqn": "constructs.Construct"
5184
+ }
5185
+ },
5186
+ {
5187
+ "docs": {
5188
+ "summary": "The Image Builder resource name pattern (e.g., `ubuntu-server-22-lts-x86` or `ubuntu-server-22-lts-${arch}`)."
5189
+ },
5190
+ "name": "resourceName",
5191
+ "type": {
5192
+ "primitive": "string"
5193
+ }
5194
+ },
5195
+ {
5196
+ "docs": {
5197
+ "summary": "The version pattern (defaults to `x.x.x` to use the latest version)."
5198
+ },
5199
+ "name": "version",
5200
+ "optional": true,
5201
+ "type": {
5202
+ "primitive": "string"
5203
+ }
5204
+ }
5205
+ ],
5206
+ "returns": {
5207
+ "type": {
5208
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
5209
+ }
5210
+ },
5211
+ "static": true
5212
+ },
5213
+ {
5214
+ "docs": {
5215
+ "stability": "experimental",
5216
+ "summary": "The marketplace product ID for an AMI product to use as the base image in an image recipe."
5217
+ },
5218
+ "locationInModule": {
5219
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5220
+ "line": 54
5221
+ },
5222
+ "name": "fromMarketplaceProductId",
5223
+ "parameters": [
5224
+ {
5225
+ "docs": {
5226
+ "summary": "The Marketplace AMI product ID to use as the base image."
5227
+ },
5228
+ "name": "productId",
5229
+ "type": {
5230
+ "primitive": "string"
5231
+ }
5232
+ }
5233
+ ],
5234
+ "returns": {
5235
+ "type": {
5236
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
5237
+ }
5238
+ },
5239
+ "static": true
5240
+ },
5241
+ {
5242
+ "docs": {
5243
+ "stability": "experimental",
5244
+ "summary": "The SSM parameter to use as the base image in an image recipe."
5245
+ },
5246
+ "locationInModule": {
5247
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5248
+ "line": 63
5249
+ },
5250
+ "name": "fromSsmParameter",
5251
+ "parameters": [
5252
+ {
5253
+ "docs": {
5254
+ "summary": "The SSM parameter to use as the base image."
5255
+ },
5256
+ "name": "parameter",
5257
+ "type": {
5258
+ "fqn": "aws-cdk-lib.aws_ssm.IParameter"
5259
+ }
5260
+ }
5261
+ ],
5262
+ "returns": {
5263
+ "type": {
5264
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
5265
+ }
5266
+ },
5267
+ "static": true
5268
+ },
5269
+ {
5270
+ "docs": {
5271
+ "stability": "experimental",
5272
+ "summary": "The parameter name for the SSM parameter to use as the base image in an image recipe."
5273
+ },
5274
+ "locationInModule": {
5275
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5276
+ "line": 72
5277
+ },
5278
+ "name": "fromSsmParameterName",
5279
+ "parameters": [
5280
+ {
5281
+ "docs": {
5282
+ "summary": "The name of the SSM parameter to use as the base image."
5283
+ },
5284
+ "name": "parameterName",
5285
+ "type": {
5286
+ "primitive": "string"
5287
+ }
5288
+ }
5289
+ ],
5290
+ "returns": {
5291
+ "type": {
5292
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
5293
+ }
5294
+ },
5295
+ "static": true
5296
+ },
5297
+ {
5298
+ "docs": {
5299
+ "remarks": "This can be an EC2 Image Builder image ARN,\nan SSM parameter, an AWS Marketplace product ID, or an AMI ID.",
5300
+ "stability": "experimental",
5301
+ "summary": "The direct string value of the base image to use in an image recipe."
5302
+ },
5303
+ "locationInModule": {
5304
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5305
+ "line": 82
5306
+ },
5307
+ "name": "fromString",
5308
+ "parameters": [
5309
+ {
5310
+ "docs": {
5311
+ "summary": "The base image as a direct string value."
5312
+ },
5313
+ "name": "baseImageString",
5314
+ "type": {
5315
+ "primitive": "string"
5316
+ }
5317
+ }
5318
+ ],
5319
+ "returns": {
5320
+ "type": {
5321
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
5322
+ }
5323
+ },
5324
+ "static": true
5325
+ }
5326
+ ],
5327
+ "name": "BaseImage",
5328
+ "properties": [
5329
+ {
5330
+ "docs": {
5331
+ "stability": "experimental",
5332
+ "summary": "The rendered base image to use."
5333
+ },
5334
+ "immutable": true,
5335
+ "locationInModule": {
5336
+ "filename": "src/image-builders/aws-image-builder/base-image.ts",
5337
+ "line": 89
5338
+ },
5339
+ "name": "image",
5340
+ "type": {
5341
+ "primitive": "string"
5342
+ }
5343
+ }
5344
+ ],
5345
+ "symbolId": "src/image-builders/aws-image-builder/base-image:BaseImage"
5346
+ },
4879
5347
  "@cloudsnorkel/cdk-github-runners.CodeBuildImageBuilder": {
4880
5348
  "assembly": "@cloudsnorkel/cdk-github-runners",
4881
5349
  "base": "constructs.Construct",
@@ -5458,7 +5926,7 @@
5458
5926
  "kind": "interface",
5459
5927
  "locationInModule": {
5460
5928
  "filename": "src/image-builders/codebuild.ts",
5461
- "line": 32
5929
+ "line": 33
5462
5930
  },
5463
5931
  "name": "CodeBuildRunnerImageBuilderProps",
5464
5932
  "properties": [
@@ -5473,7 +5941,7 @@
5473
5941
  "immutable": true,
5474
5942
  "locationInModule": {
5475
5943
  "filename": "src/image-builders/codebuild.ts",
5476
- "line": 48
5944
+ "line": 49
5477
5945
  },
5478
5946
  "name": "buildImage",
5479
5947
  "optional": true,
@@ -5492,7 +5960,7 @@
5492
5960
  "immutable": true,
5493
5961
  "locationInModule": {
5494
5962
  "filename": "src/image-builders/codebuild.ts",
5495
- "line": 39
5963
+ "line": 40
5496
5964
  },
5497
5965
  "name": "computeType",
5498
5966
  "optional": true,
@@ -5511,7 +5979,7 @@
5511
5979
  "immutable": true,
5512
5980
  "locationInModule": {
5513
5981
  "filename": "src/image-builders/codebuild.ts",
5514
- "line": 57
5982
+ "line": 58
5515
5983
  },
5516
5984
  "name": "timeout",
5517
5985
  "optional": true,
@@ -9151,7 +9619,7 @@
9151
9619
  "kind": "interface",
9152
9620
  "locationInModule": {
9153
9621
  "filename": "src/image-builders/aws-image-builder/builder.ts",
9154
- "line": 63
9622
+ "line": 64
9155
9623
  },
9156
9624
  "name": "FastLaunchOptions",
9157
9625
  "properties": [
@@ -9169,7 +9637,7 @@
9169
9637
  "immutable": true,
9170
9638
  "locationInModule": {
9171
9639
  "filename": "src/image-builders/aws-image-builder/builder.ts",
9172
- "line": 74
9640
+ "line": 75
9173
9641
  },
9174
9642
  "name": "enabled",
9175
9643
  "optional": true,
@@ -9188,7 +9656,7 @@
9188
9656
  "immutable": true,
9189
9657
  "locationInModule": {
9190
9658
  "filename": "src/image-builders/aws-image-builder/builder.ts",
9191
- "line": 83
9659
+ "line": 84
9192
9660
  },
9193
9661
  "name": "maxParallelLaunches",
9194
9662
  "optional": true,
@@ -9206,7 +9674,7 @@
9206
9674
  "immutable": true,
9207
9675
  "locationInModule": {
9208
9676
  "filename": "src/image-builders/aws-image-builder/builder.ts",
9209
- "line": 90
9677
+ "line": 91
9210
9678
  },
9211
9679
  "name": "targetResourceCount",
9212
9680
  "optional": true,
@@ -9232,7 +9700,7 @@
9232
9700
  },
9233
9701
  "locationInModule": {
9234
9702
  "filename": "src/runner.ts",
9235
- "line": 290
9703
+ "line": 308
9236
9704
  },
9237
9705
  "parameters": [
9238
9706
  {
@@ -9262,7 +9730,7 @@
9262
9730
  "kind": "class",
9263
9731
  "locationInModule": {
9264
9732
  "filename": "src/runner.ts",
9265
- "line": 263
9733
+ "line": 281
9266
9734
  },
9267
9735
  "methods": [
9268
9736
  {
@@ -9273,7 +9741,7 @@
9273
9741
  },
9274
9742
  "locationInModule": {
9275
9743
  "filename": "src/runner.ts",
9276
- "line": 842
9744
+ "line": 902
9277
9745
  },
9278
9746
  "name": "createLogsInsightsQueries"
9279
9747
  },
@@ -9285,7 +9753,7 @@
9285
9753
  },
9286
9754
  "locationInModule": {
9287
9755
  "filename": "src/runner.ts",
9288
- "line": 822
9756
+ "line": 882
9289
9757
  },
9290
9758
  "name": "failedImageBuildsTopic",
9291
9759
  "returns": {
@@ -9302,7 +9770,7 @@
9302
9770
  },
9303
9771
  "locationInModule": {
9304
9772
  "filename": "src/runner.ts",
9305
- "line": 804
9773
+ "line": 864
9306
9774
  },
9307
9775
  "name": "metricFailed",
9308
9776
  "parameters": [
@@ -9328,7 +9796,7 @@
9328
9796
  },
9329
9797
  "locationInModule": {
9330
9798
  "filename": "src/runner.ts",
9331
- "line": 748
9799
+ "line": 808
9332
9800
  },
9333
9801
  "name": "metricJobCompleted",
9334
9802
  "parameters": [
@@ -9354,7 +9822,7 @@
9354
9822
  },
9355
9823
  "locationInModule": {
9356
9824
  "filename": "src/runner.ts",
9357
- "line": 795
9825
+ "line": 855
9358
9826
  },
9359
9827
  "name": "metricSucceeded",
9360
9828
  "parameters": [
@@ -9380,7 +9848,7 @@
9380
9848
  },
9381
9849
  "locationInModule": {
9382
9850
  "filename": "src/runner.ts",
9383
- "line": 811
9851
+ "line": 871
9384
9852
  },
9385
9853
  "name": "metricTime",
9386
9854
  "parameters": [
@@ -9410,7 +9878,7 @@
9410
9878
  "immutable": true,
9411
9879
  "locationInModule": {
9412
9880
  "filename": "src/runner.ts",
9413
- "line": 279
9881
+ "line": 297
9414
9882
  },
9415
9883
  "name": "connections",
9416
9884
  "overrides": "aws-cdk-lib.aws_ec2.IConnectable",
@@ -9426,7 +9894,7 @@
9426
9894
  "immutable": true,
9427
9895
  "locationInModule": {
9428
9896
  "filename": "src/runner.ts",
9429
- "line": 267
9897
+ "line": 285
9430
9898
  },
9431
9899
  "name": "providers",
9432
9900
  "type": {
@@ -9455,7 +9923,7 @@
9455
9923
  "immutable": true,
9456
9924
  "locationInModule": {
9457
9925
  "filename": "src/runner.ts",
9458
- "line": 272
9926
+ "line": 290
9459
9927
  },
9460
9928
  "name": "secrets",
9461
9929
  "type": {
@@ -9469,7 +9937,7 @@
9469
9937
  "immutable": true,
9470
9938
  "locationInModule": {
9471
9939
  "filename": "src/runner.ts",
9472
- "line": 290
9940
+ "line": 308
9473
9941
  },
9474
9942
  "name": "props",
9475
9943
  "optional": true,
@@ -9491,7 +9959,7 @@
9491
9959
  "kind": "interface",
9492
9960
  "locationInModule": {
9493
9961
  "filename": "src/runner.ts",
9494
- "line": 40
9962
+ "line": 43
9495
9963
  },
9496
9964
  "name": "GitHubRunnersProps",
9497
9965
  "properties": [
@@ -9499,14 +9967,14 @@
9499
9967
  "abstract": true,
9500
9968
  "docs": {
9501
9969
  "default": "false",
9502
- "remarks": "Lambda Functions in a public subnet can NOT access the internet.",
9970
+ "remarks": "**Note:** This only affects management functions that interact with GitHub. Lambda functions that help with runner image building and don't interact with GitHub are NOT affected by this setting.",
9503
9971
  "stability": "experimental",
9504
- "summary": "Allow management functions to run in public subnets."
9972
+ "summary": "Allow management functions to run in public subnets. Lambda Functions in a public subnet can NOT access the internet."
9505
9973
  },
9506
9974
  "immutable": true,
9507
9975
  "locationInModule": {
9508
9976
  "filename": "src/runner.ts",
9509
- "line": 81
9977
+ "line": 90
9510
9978
  },
9511
9979
  "name": "allowPublicSubnet",
9512
9980
  "optional": true,
@@ -9517,14 +9985,14 @@
9517
9985
  {
9518
9986
  "abstract": true,
9519
9987
  "docs": {
9520
- "remarks": "You may also want to use custom images for your runner providers that contain the same certificates. See {@link CodeBuildImageBuilder.addCertificates }.\n\n```typescript\nconst imageBuilder = CodeBuildRunnerProvider.imageBuilder(this, 'Image Builder with Certs');\nimageBuilder.addComponent(RunnerImageComponent.extraCertificates('path-to-my-extra-certs-folder/certs.pem', 'private-ca');\n\nconst provider = new CodeBuildRunnerProvider(this, 'CodeBuild', {\n imageBuilder: imageBuilder,\n});\n\nnew GitHubRunners(\n this,\n 'runners',\n {\n providers: [provider],\n extraCertificates: 'path-to-my-extra-certs-folder',\n }\n);\n```",
9988
+ "remarks": "If a directory is provided, all .pem and .crt files in that directory will be used. The certificates will be concatenated into a single file for use by Node.js.\n\nYou may also want to use custom images for your runner providers that contain the same certificates. See {@link RunnerImageComponent.extraCertificates }.\n\n```typescript\nconst selfSignedCertificates = 'certs/ghes.pem'; // or 'path-to-my-extra-certs-folder' for a directory\nconst imageBuilder = CodeBuildRunnerProvider.imageBuilder(this, 'Image Builder with Certs');\nimageBuilder.addComponent(RunnerImageComponent.extraCertificates(selfSignedCertificates, 'private-ca'));\n\nconst provider = new CodeBuildRunnerProvider(this, 'CodeBuild', {\n imageBuilder: imageBuilder,\n});\n\nnew GitHubRunners(\n this,\n 'runners',\n {\n providers: [provider],\n extraCertificates: selfSignedCertificates,\n }\n);\n```",
9521
9989
  "stability": "experimental",
9522
- "summary": "Path to a directory containing a file named certs.pem containing any additional certificates required to trust GitHub Enterprise Server. Use this when GitHub Enterprise Server certificates are self-signed."
9990
+ "summary": "Path to a certificate file (.pem or .crt) or a directory containing certificate files (.pem or .crt) required to trust GitHub Enterprise Server. Use this when GitHub Enterprise Server certificates are self-signed."
9523
9991
  },
9524
9992
  "immutable": true,
9525
9993
  "locationInModule": {
9526
9994
  "filename": "src/runner.ts",
9527
- "line": 118
9995
+ "line": 136
9528
9996
  },
9529
9997
  "name": "extraCertificates",
9530
9998
  "optional": true,
@@ -9543,7 +10011,7 @@
9543
10011
  "immutable": true,
9544
10012
  "locationInModule": {
9545
10013
  "filename": "src/runner.ts",
9546
- "line": 125
10014
+ "line": 143
9547
10015
  },
9548
10016
  "name": "idleTimeout",
9549
10017
  "optional": true,
@@ -9561,7 +10029,7 @@
9561
10029
  "immutable": true,
9562
10030
  "locationInModule": {
9563
10031
  "filename": "src/runner.ts",
9564
- "line": 132
10032
+ "line": 150
9565
10033
  },
9566
10034
  "name": "logOptions",
9567
10035
  "optional": true,
@@ -9580,7 +10048,7 @@
9580
10048
  "immutable": true,
9581
10049
  "locationInModule": {
9582
10050
  "filename": "src/runner.ts",
9583
- "line": 46
10051
+ "line": 49
9584
10052
  },
9585
10053
  "name": "providers",
9586
10054
  "optional": true,
@@ -9612,7 +10080,7 @@
9612
10080
  "immutable": true,
9613
10081
  "locationInModule": {
9614
10082
  "filename": "src/runner.ts",
9615
- "line": 187
10083
+ "line": 205
9616
10084
  },
9617
10085
  "name": "providerSelector",
9618
10086
  "optional": true,
@@ -9631,7 +10099,7 @@
9631
10099
  "immutable": true,
9632
10100
  "locationInModule": {
9633
10101
  "filename": "src/runner.ts",
9634
- "line": 55
10102
+ "line": 58
9635
10103
  },
9636
10104
  "name": "requireSelfHostedLabel",
9637
10105
  "optional": true,
@@ -9650,7 +10118,7 @@
9650
10118
  "immutable": true,
9651
10119
  "locationInModule": {
9652
10120
  "filename": "src/runner.ts",
9653
- "line": 169
10121
+ "line": 187
9654
10122
  },
9655
10123
  "name": "retryOptions",
9656
10124
  "optional": true,
@@ -9662,14 +10130,14 @@
9662
10130
  "abstract": true,
9663
10131
  "docs": {
9664
10132
  "deprecated": "use {@link securityGroups } instead",
9665
- "remarks": "Use this with to provide access to GitHub Enterprise Server hosted inside a VPC.",
10133
+ "remarks": "Use this with to provide access to GitHub Enterprise Server hosted inside a VPC.\n\n**Note:** This only affects management functions that interact with GitHub. Lambda functions that help with runner image building and don't interact with GitHub are NOT affected by this setting.",
9666
10134
  "stability": "deprecated",
9667
10135
  "summary": "Security group attached to all management functions."
9668
10136
  },
9669
10137
  "immutable": true,
9670
10138
  "locationInModule": {
9671
10139
  "filename": "src/runner.ts",
9672
- "line": 88
10140
+ "line": 99
9673
10141
  },
9674
10142
  "name": "securityGroup",
9675
10143
  "optional": true,
@@ -9680,14 +10148,14 @@
9680
10148
  {
9681
10149
  "abstract": true,
9682
10150
  "docs": {
9683
- "remarks": "Use this with to provide access to GitHub Enterprise Server hosted inside a VPC.",
10151
+ "remarks": "Use this to provide outbound access from management functions to GitHub Enterprise Server hosted inside a VPC.\n\n**Note:** This only affects management functions that interact with GitHub. Lambda functions that help with runner image building and don't interact with GitHub are NOT affected by this setting.\n\n**Note:** Defining inbound rules on this security group does nothing. This security group only controls outbound access FROM the management functions. To limit access TO the webhook or setup functions, use {@link webhookAccess} and {@link setupAccess} instead.",
9684
10152
  "stability": "experimental",
9685
10153
  "summary": "Security groups attached to all management functions."
9686
10154
  },
9687
10155
  "immutable": true,
9688
10156
  "locationInModule": {
9689
10157
  "filename": "src/runner.ts",
9690
- "line": 93
10158
+ "line": 108
9691
10159
  },
9692
10160
  "name": "securityGroups",
9693
10161
  "optional": true,
@@ -9711,7 +10179,7 @@
9711
10179
  "immutable": true,
9712
10180
  "locationInModule": {
9713
10181
  "filename": "src/runner.ts",
9714
- "line": 139
10182
+ "line": 157
9715
10183
  },
9716
10184
  "name": "setupAccess",
9717
10185
  "optional": true,
@@ -9730,7 +10198,7 @@
9730
10198
  "immutable": true,
9731
10199
  "locationInModule": {
9732
10200
  "filename": "src/runner.ts",
9733
- "line": 158
10201
+ "line": 176
9734
10202
  },
9735
10203
  "name": "statusAccess",
9736
10204
  "optional": true,
@@ -9741,14 +10209,14 @@
9741
10209
  {
9742
10210
  "abstract": true,
9743
10211
  "docs": {
9744
- "remarks": "Make sure the selected VPC and subnets have access to the following with either NAT Gateway or VPC Endpoints:\n* GitHub Enterprise Server\n* Secrets Manager\n* SQS\n* Step Functions\n* CloudFormation (status function only)\n* EC2 (status function only)\n* ECR (status function only)",
10212
+ "remarks": "**Note:** This only affects management functions that interact with GitHub. Lambda functions that help with runner image building and don't interact with GitHub are NOT affected by this setting and will run outside the VPC.\n\nMake sure the selected VPC and subnets have access to the following with either NAT Gateway or VPC Endpoints:\n* GitHub Enterprise Server\n* Secrets Manager\n* SQS\n* Step Functions\n* CloudFormation (status function only)\n* EC2 (status function only)\n* ECR (status function only)",
9745
10213
  "stability": "experimental",
9746
10214
  "summary": "VPC used for all management functions. Use this with GitHub Enterprise Server hosted that's inaccessible from outside the VPC."
9747
10215
  },
9748
10216
  "immutable": true,
9749
10217
  "locationInModule": {
9750
10218
  "filename": "src/runner.ts",
9751
- "line": 69
10219
+ "line": 74
9752
10220
  },
9753
10221
  "name": "vpc",
9754
10222
  "optional": true,
@@ -9759,14 +10227,14 @@
9759
10227
  {
9760
10228
  "abstract": true,
9761
10229
  "docs": {
9762
- "remarks": "Use this with GitHub Enterprise Server hosted that's inaccessible from outside the VPC.",
10230
+ "remarks": "Use this with GitHub Enterprise Server hosted that's inaccessible from outside the VPC.\n\n**Note:** This only affects management functions that interact with GitHub. Lambda functions that help with runner image building and don't interact with GitHub are NOT affected by this setting.",
9763
10231
  "stability": "experimental",
9764
10232
  "summary": "VPC subnets used for all management functions."
9765
10233
  },
9766
10234
  "immutable": true,
9767
10235
  "locationInModule": {
9768
10236
  "filename": "src/runner.ts",
9769
- "line": 74
10237
+ "line": 81
9770
10238
  },
9771
10239
  "name": "vpcSubnets",
9772
10240
  "optional": true,
@@ -9785,7 +10253,7 @@
9785
10253
  "immutable": true,
9786
10254
  "locationInModule": {
9787
10255
  "filename": "src/runner.ts",
9788
- "line": 151
10256
+ "line": 169
9789
10257
  },
9790
10258
  "name": "webhookAccess",
9791
10259
  "optional": true,
@@ -9966,7 +10434,7 @@
9966
10434
  "kind": "interface",
9967
10435
  "locationInModule": {
9968
10436
  "filename": "src/image-builders/common.ts",
9969
- "line": 308
10437
+ "line": 327
9970
10438
  },
9971
10439
  "methods": [
9972
10440
  {
@@ -9978,7 +10446,7 @@
9978
10446
  },
9979
10447
  "locationInModule": {
9980
10448
  "filename": "src/image-builders/common.ts",
9981
- "line": 314
10449
+ "line": 333
9982
10450
  },
9983
10451
  "name": "addComponent",
9984
10452
  "parameters": [
@@ -10002,7 +10470,7 @@
10002
10470
  },
10003
10471
  "locationInModule": {
10004
10472
  "filename": "src/image-builders/common.ts",
10005
- "line": 321
10473
+ "line": 340
10006
10474
  },
10007
10475
  "name": "removeComponent",
10008
10476
  "parameters": [
@@ -10082,7 +10550,7 @@
10082
10550
  "kind": "interface",
10083
10551
  "locationInModule": {
10084
10552
  "filename": "src/image-builders/common.ts",
10085
- "line": 281
10553
+ "line": 300
10086
10554
  },
10087
10555
  "methods": [
10088
10556
  {
@@ -10094,7 +10562,7 @@
10094
10562
  },
10095
10563
  "locationInModule": {
10096
10564
  "filename": "src/image-builders/common.ts",
10097
- "line": 300
10565
+ "line": 319
10098
10566
  },
10099
10567
  "name": "bindAmi",
10100
10568
  "returns": {
@@ -10112,7 +10580,7 @@
10112
10580
  },
10113
10581
  "locationInModule": {
10114
10582
  "filename": "src/image-builders/common.ts",
10115
- "line": 291
10583
+ "line": 310
10116
10584
  },
10117
10585
  "name": "bindDockerImage",
10118
10586
  "returns": {
@@ -10548,7 +11016,7 @@
10548
11016
  "kind": "interface",
10549
11017
  "locationInModule": {
10550
11018
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10551
- "line": 96
11019
+ "line": 97
10552
11020
  },
10553
11021
  "name": "ImageBuilderAsset",
10554
11022
  "properties": [
@@ -10561,7 +11029,7 @@
10561
11029
  "immutable": true,
10562
11030
  "locationInModule": {
10563
11031
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10564
- "line": 105
11032
+ "line": 106
10565
11033
  },
10566
11034
  "name": "asset",
10567
11035
  "type": {
@@ -10577,7 +11045,7 @@
10577
11045
  "immutable": true,
10578
11046
  "locationInModule": {
10579
11047
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10580
- "line": 100
11048
+ "line": 101
10581
11049
  },
10582
11050
  "name": "path",
10583
11051
  "type": {
@@ -10603,7 +11071,7 @@
10603
11071
  },
10604
11072
  "locationInModule": {
10605
11073
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10606
- "line": 179
11074
+ "line": 180
10607
11075
  },
10608
11076
  "parameters": [
10609
11077
  {
@@ -10629,7 +11097,7 @@
10629
11097
  "kind": "class",
10630
11098
  "locationInModule": {
10631
11099
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10632
- "line": 166
11100
+ "line": 167
10633
11101
  },
10634
11102
  "methods": [
10635
11103
  {
@@ -10639,7 +11107,7 @@
10639
11107
  },
10640
11108
  "locationInModule": {
10641
11109
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10642
- "line": 277
11110
+ "line": 278
10643
11111
  },
10644
11112
  "name": "grantAssetsRead",
10645
11113
  "parameters": [
@@ -10657,7 +11125,7 @@
10657
11125
  },
10658
11126
  "locationInModule": {
10659
11127
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10660
- "line": 283
11128
+ "line": 284
10661
11129
  },
10662
11130
  "name": "prefixCommandsWithErrorHandling",
10663
11131
  "parameters": [
@@ -10701,7 +11169,7 @@
10701
11169
  "immutable": true,
10702
11170
  "locationInModule": {
10703
11171
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10704
- "line": 170
11172
+ "line": 171
10705
11173
  },
10706
11174
  "name": "arn",
10707
11175
  "type": {
@@ -10716,7 +11184,7 @@
10716
11184
  "immutable": true,
10717
11185
  "locationInModule": {
10718
11186
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10719
- "line": 175
11187
+ "line": 176
10720
11188
  },
10721
11189
  "name": "platform",
10722
11190
  "type": {
@@ -10737,7 +11205,7 @@
10737
11205
  "kind": "interface",
10738
11206
  "locationInModule": {
10739
11207
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10740
- "line": 111
11208
+ "line": 112
10741
11209
  },
10742
11210
  "name": "ImageBuilderComponentProperties",
10743
11211
  "properties": [
@@ -10751,7 +11219,7 @@
10751
11219
  "immutable": true,
10752
11220
  "locationInModule": {
10753
11221
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10754
- "line": 132
11222
+ "line": 133
10755
11223
  },
10756
11224
  "name": "commands",
10757
11225
  "type": {
@@ -10772,7 +11240,7 @@
10772
11240
  "immutable": true,
10773
11241
  "locationInModule": {
10774
11242
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10775
- "line": 125
11243
+ "line": 126
10776
11244
  },
10777
11245
  "name": "description",
10778
11246
  "type": {
@@ -10788,7 +11256,7 @@
10788
11256
  "immutable": true,
10789
11257
  "locationInModule": {
10790
11258
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10791
- "line": 120
11259
+ "line": 121
10792
11260
  },
10793
11261
  "name": "displayName",
10794
11262
  "type": {
@@ -10805,7 +11273,7 @@
10805
11273
  "immutable": true,
10806
11274
  "locationInModule": {
10807
11275
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10808
- "line": 115
11276
+ "line": 116
10809
11277
  },
10810
11278
  "name": "platform",
10811
11279
  "type": {
@@ -10821,7 +11289,7 @@
10821
11289
  "immutable": true,
10822
11290
  "locationInModule": {
10823
11291
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10824
- "line": 137
11292
+ "line": 138
10825
11293
  },
10826
11294
  "name": "assets",
10827
11295
  "optional": true,
@@ -10844,7 +11312,7 @@
10844
11312
  "immutable": true,
10845
11313
  "locationInModule": {
10846
11314
  "filename": "src/image-builders/aws-image-builder/builder.ts",
10847
- "line": 144
11315
+ "line": 145
10848
11316
  },
10849
11317
  "name": "reboot",
10850
11318
  "optional": true,
@@ -11990,7 +12458,7 @@
11990
12458
  "kind": "interface",
11991
12459
  "locationInModule": {
11992
12460
  "filename": "src/runner.ts",
11993
- "line": 193
12461
+ "line": 211
11994
12462
  },
11995
12463
  "name": "LogOptions",
11996
12464
  "properties": [
@@ -12004,7 +12472,7 @@
12004
12472
  "immutable": true,
12005
12473
  "locationInModule": {
12006
12474
  "filename": "src/runner.ts",
12007
- "line": 204
12475
+ "line": 222
12008
12476
  },
12009
12477
  "name": "includeExecutionData",
12010
12478
  "optional": true,
@@ -12022,7 +12490,7 @@
12022
12490
  "immutable": true,
12023
12491
  "locationInModule": {
12024
12492
  "filename": "src/runner.ts",
12025
- "line": 211
12493
+ "line": 229
12026
12494
  },
12027
12495
  "name": "level",
12028
12496
  "optional": true,
@@ -12039,7 +12507,7 @@
12039
12507
  "immutable": true,
12040
12508
  "locationInModule": {
12041
12509
  "filename": "src/runner.ts",
12042
- "line": 197
12510
+ "line": 215
12043
12511
  },
12044
12512
  "name": "logGroupName",
12045
12513
  "optional": true,
@@ -12058,7 +12526,7 @@
12058
12526
  "immutable": true,
12059
12527
  "locationInModule": {
12060
12528
  "filename": "src/runner.ts",
12061
- "line": 220
12529
+ "line": 238
12062
12530
  },
12063
12531
  "name": "logRetention",
12064
12532
  "optional": true,
@@ -12763,7 +13231,7 @@
12763
13231
  "kind": "interface",
12764
13232
  "locationInModule": {
12765
13233
  "filename": "src/image-builders/common.ts",
12766
- "line": 119
13234
+ "line": 120
12767
13235
  },
12768
13236
  "name": "RunnerImageAsset",
12769
13237
  "properties": [
@@ -12777,7 +13245,7 @@
12777
13245
  "immutable": true,
12778
13246
  "locationInModule": {
12779
13247
  "filename": "src/image-builders/common.ts",
12780
- "line": 123
13248
+ "line": 124
12781
13249
  },
12782
13250
  "name": "source",
12783
13251
  "type": {
@@ -12793,7 +13261,7 @@
12793
13261
  "immutable": true,
12794
13262
  "locationInModule": {
12795
13263
  "filename": "src/image-builders/common.ts",
12796
- "line": 128
13264
+ "line": 129
12797
13265
  },
12798
13266
  "name": "target",
12799
13267
  "type": {
@@ -12819,7 +13287,7 @@
12819
13287
  },
12820
13288
  "locationInModule": {
12821
13289
  "filename": "src/image-builders/common.ts",
12822
- "line": 330
13290
+ "line": 349
12823
13291
  },
12824
13292
  "parameters": [
12825
13293
  {
@@ -12900,7 +13368,7 @@
12900
13368
  },
12901
13369
  "locationInModule": {
12902
13370
  "filename": "src/image-builders/common.ts",
12903
- "line": 345
13371
+ "line": 364
12904
13372
  },
12905
13373
  "name": "addComponent",
12906
13374
  "overrides": "@cloudsnorkel/cdk-github-runners.IConfigurableRunnerImageBuilder",
@@ -12922,7 +13390,7 @@
12922
13390
  },
12923
13391
  "locationInModule": {
12924
13392
  "filename": "src/image-builders/common.ts",
12925
- "line": 340
13393
+ "line": 359
12926
13394
  },
12927
13395
  "name": "bindAmi",
12928
13396
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerImageBuilder",
@@ -12941,7 +13409,7 @@
12941
13409
  },
12942
13410
  "locationInModule": {
12943
13411
  "filename": "src/image-builders/common.ts",
12944
- "line": 338
13412
+ "line": 357
12945
13413
  },
12946
13414
  "name": "bindDockerImage",
12947
13415
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerImageBuilder",
@@ -12959,7 +13427,7 @@
12959
13427
  },
12960
13428
  "locationInModule": {
12961
13429
  "filename": "src/image-builders/common.ts",
12962
- "line": 349
13430
+ "line": 368
12963
13431
  },
12964
13432
  "name": "removeComponent",
12965
13433
  "overrides": "@cloudsnorkel/cdk-github-runners.IConfigurableRunnerImageBuilder",
@@ -12984,7 +13452,7 @@
12984
13452
  "immutable": true,
12985
13453
  "locationInModule": {
12986
13454
  "filename": "src/image-builders/common.ts",
12987
- "line": 342
13455
+ "line": 361
12988
13456
  },
12989
13457
  "name": "connections",
12990
13458
  "overrides": "aws-cdk-lib.aws_ec2.IConnectable",
@@ -13001,7 +13469,7 @@
13001
13469
  "immutable": true,
13002
13470
  "locationInModule": {
13003
13471
  "filename": "src/image-builders/common.ts",
13004
- "line": 343
13472
+ "line": 362
13005
13473
  },
13006
13474
  "name": "grantPrincipal",
13007
13475
  "overrides": "aws-cdk-lib.aws_iam.IGrantable",
@@ -13015,7 +13483,7 @@
13015
13483
  },
13016
13484
  "locationInModule": {
13017
13485
  "filename": "src/image-builders/common.ts",
13018
- "line": 328
13486
+ "line": 347
13019
13487
  },
13020
13488
  "name": "components",
13021
13489
  "protected": true,
@@ -13041,7 +13509,7 @@
13041
13509
  "kind": "interface",
13042
13510
  "locationInModule": {
13043
13511
  "filename": "src/image-builders/common.ts",
13044
- "line": 131
13512
+ "line": 132
13045
13513
  },
13046
13514
  "name": "RunnerImageBuilderProps",
13047
13515
  "properties": [
@@ -13055,7 +13523,7 @@
13055
13523
  "immutable": true,
13056
13524
  "locationInModule": {
13057
13525
  "filename": "src/image-builders/common.ts",
13058
- "line": 137
13526
+ "line": 138
13059
13527
  },
13060
13528
  "name": "architecture",
13061
13529
  "optional": true,
@@ -13073,7 +13541,7 @@
13073
13541
  "immutable": true,
13074
13542
  "locationInModule": {
13075
13543
  "filename": "src/image-builders/common.ts",
13076
- "line": 246
13544
+ "line": 265
13077
13545
  },
13078
13546
  "name": "awsImageBuilderOptions",
13079
13547
  "optional": true,
@@ -13085,38 +13553,56 @@
13085
13553
  "abstract": true,
13086
13554
  "docs": {
13087
13555
  "default": "latest Ubuntu 22.04 AMI for Os.LINUX_UBUNTU and Os.LINUX_UBUNTU_2204, Ubuntu 24.04 AMI for Os.LINUX_UBUNTU_2404, latest Amazon Linux 2 AMI for Os.LINUX_AMAZON_2, latest Windows Server 2022 AMI for Os.WINDOWS",
13088
- "remarks": "This can be an actual AMI or an AWS Image Builder ARN that points to the latest AMI. For example `arn:aws:imagebuilder:us-east-1:aws:image/ubuntu-server-22-lts-x86/x.x.x` would always use the latest version of Ubuntu 22.04 in each build. If you want a specific version, you can replace `x.x.x` with that version.",
13556
+ "remarks": "This can be:\n- A string (AMI ID, Image Builder ARN, SSM parameter reference, or Marketplace product ID) - deprecated, use BaseImage static factory methods instead\n- A BaseImage instance created using static factory methods:\n - `BaseImage.fromAmiId('ami-12345')` - Use an AMI ID\n - `BaseImage.fromString('arn:aws:imagebuilder:...')` - Use any string (ARN, AMI ID, etc.)\n - `BaseImage.fromSsmParameter(parameter)` - Use an SSM parameter object\n - `BaseImage.fromSsmParameterName('/aws/service/ami/...')` - Use an SSM parameter by name\n - `BaseImage.fromMarketplaceProductId('product-id')` - Use a Marketplace product ID\n - `BaseImage.fromImageBuilder(scope, 'ubuntu-server-22-lts-x86')` - Use an AWS-provided Image Builder image\n\nFor example `BaseImage.fromImageBuilder(scope, 'ubuntu-server-22-lts-x86')` would always use the latest version of Ubuntu 22.04 in each build. If you want a specific version, you can pass the version as the third parameter.",
13089
13557
  "stability": "experimental",
13090
13558
  "summary": "Base AMI from which runner AMIs will be built."
13091
13559
  },
13092
13560
  "immutable": true,
13093
13561
  "locationInModule": {
13094
13562
  "filename": "src/image-builders/common.ts",
13095
- "line": 171
13563
+ "line": 190
13096
13564
  },
13097
13565
  "name": "baseAmi",
13098
13566
  "optional": true,
13099
13567
  "type": {
13100
- "primitive": "string"
13568
+ "union": {
13569
+ "types": [
13570
+ {
13571
+ "primitive": "string"
13572
+ },
13573
+ {
13574
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseImage"
13575
+ }
13576
+ ]
13577
+ }
13101
13578
  }
13102
13579
  },
13103
13580
  {
13104
13581
  "abstract": true,
13105
13582
  "docs": {
13106
13583
  "default": "public.ecr.aws/lts/ubuntu:22.04 for Os.LINUX_UBUNTU and Os.LINUX_UBUNTU_2204, public.ecr.aws/lts/ubuntu:24.04 for Os.LINUX_UBUNTU_2404, public.ecr.aws/amazonlinux/amazonlinux:2 for Os.LINUX_AMAZON_2, mcr.microsoft.com/windows/servercore:ltsc2019-amd64 for Os.WINDOWS",
13107
- "remarks": "When using private images from a different account or not on ECR, you may need to include additional setup commands with {@link dockerSetupCommands}.",
13584
+ "remarks": "This can be:\n- A string (ECR/ECR public image URI, DockerHub image, or Image Builder ARN) - deprecated, use BaseContainerImage static factory methods instead\n- A BaseContainerImage instance created using static factory methods:\n - `BaseContainerImage.fromDockerHub('ubuntu', '22.04')` - Use DockerHub\n - `BaseContainerImage.fromEcr(repo, 'latest')` - Use ECR (automatically grants permissions with CodeBuild)\n - `BaseContainerImage.fromEcrPublic('lts', 'ubuntu', '22.04')` - Use ECR Public\n - `BaseContainerImage.fromString('public.ecr.aws/lts/ubuntu:22.04')` - Use any string\n\nWhen using private images from a different account or not on ECR, you may need to include additional setup commands with {@link dockerSetupCommands}.",
13108
13585
  "stability": "experimental",
13109
13586
  "summary": "Base image from which Docker runner images will be built."
13110
13587
  },
13111
13588
  "immutable": true,
13112
13589
  "locationInModule": {
13113
13590
  "filename": "src/image-builders/common.ts",
13114
- "line": 153
13591
+ "line": 162
13115
13592
  },
13116
13593
  "name": "baseDockerImage",
13117
13594
  "optional": true,
13118
13595
  "type": {
13119
- "primitive": "string"
13596
+ "union": {
13597
+ "types": [
13598
+ {
13599
+ "primitive": "string"
13600
+ },
13601
+ {
13602
+ "fqn": "@cloudsnorkel/cdk-github-runners.BaseContainerImage"
13603
+ }
13604
+ ]
13605
+ }
13120
13606
  }
13121
13607
  },
13122
13608
  {
@@ -13128,7 +13614,7 @@
13128
13614
  "immutable": true,
13129
13615
  "locationInModule": {
13130
13616
  "filename": "src/image-builders/common.ts",
13131
- "line": 236
13617
+ "line": 255
13132
13618
  },
13133
13619
  "name": "builderType",
13134
13620
  "optional": true,
@@ -13146,7 +13632,7 @@
13146
13632
  "immutable": true,
13147
13633
  "locationInModule": {
13148
13634
  "filename": "src/image-builders/common.ts",
13149
- "line": 241
13635
+ "line": 260
13150
13636
  },
13151
13637
  "name": "codeBuildOptions",
13152
13638
  "optional": true,
@@ -13164,7 +13650,7 @@
13164
13650
  "immutable": true,
13165
13651
  "locationInModule": {
13166
13652
  "filename": "src/image-builders/common.ts",
13167
- "line": 185
13653
+ "line": 204
13168
13654
  },
13169
13655
  "name": "components",
13170
13656
  "optional": true,
@@ -13188,7 +13674,7 @@
13188
13674
  "immutable": true,
13189
13675
  "locationInModule": {
13190
13676
  "filename": "src/image-builders/common.ts",
13191
- "line": 162
13677
+ "line": 171
13192
13678
  },
13193
13679
  "name": "dockerSetupCommands",
13194
13680
  "optional": true,
@@ -13212,7 +13698,7 @@
13212
13698
  "immutable": true,
13213
13699
  "locationInModule": {
13214
13700
  "filename": "src/image-builders/common.ts",
13215
- "line": 231
13701
+ "line": 250
13216
13702
  },
13217
13703
  "name": "logRemovalPolicy",
13218
13704
  "optional": true,
@@ -13231,7 +13717,7 @@
13231
13717
  "immutable": true,
13232
13718
  "locationInModule": {
13233
13719
  "filename": "src/image-builders/common.ts",
13234
- "line": 222
13720
+ "line": 241
13235
13721
  },
13236
13722
  "name": "logRetention",
13237
13723
  "optional": true,
@@ -13249,7 +13735,7 @@
13249
13735
  "immutable": true,
13250
13736
  "locationInModule": {
13251
13737
  "filename": "src/image-builders/common.ts",
13252
- "line": 144
13738
+ "line": 145
13253
13739
  },
13254
13740
  "name": "os",
13255
13741
  "optional": true,
@@ -13268,7 +13754,7 @@
13268
13754
  "immutable": true,
13269
13755
  "locationInModule": {
13270
13756
  "filename": "src/image-builders/common.ts",
13271
- "line": 194
13757
+ "line": 213
13272
13758
  },
13273
13759
  "name": "rebuildInterval",
13274
13760
  "optional": true,
@@ -13286,7 +13772,7 @@
13286
13772
  "immutable": true,
13287
13773
  "locationInModule": {
13288
13774
  "filename": "src/image-builders/common.ts",
13289
- "line": 178
13775
+ "line": 197
13290
13776
  },
13291
13777
  "name": "runnerVersion",
13292
13778
  "optional": true,
@@ -13303,7 +13789,7 @@
13303
13789
  "immutable": true,
13304
13790
  "locationInModule": {
13305
13791
  "filename": "src/image-builders/common.ts",
13306
- "line": 206
13792
+ "line": 225
13307
13793
  },
13308
13794
  "name": "securityGroups",
13309
13795
  "optional": true,
@@ -13326,7 +13812,7 @@
13326
13812
  "immutable": true,
13327
13813
  "locationInModule": {
13328
13814
  "filename": "src/image-builders/common.ts",
13329
- "line": 213
13815
+ "line": 232
13330
13816
  },
13331
13817
  "name": "subnetSelection",
13332
13818
  "optional": true,
@@ -13344,7 +13830,7 @@
13344
13830
  "immutable": true,
13345
13831
  "locationInModule": {
13346
13832
  "filename": "src/image-builders/common.ts",
13347
- "line": 201
13833
+ "line": 220
13348
13834
  },
13349
13835
  "name": "vpc",
13350
13836
  "optional": true,
@@ -13363,7 +13849,7 @@
13363
13849
  "immutable": true,
13364
13850
  "locationInModule": {
13365
13851
  "filename": "src/image-builders/common.ts",
13366
- "line": 257
13852
+ "line": 276
13367
13853
  },
13368
13854
  "name": "waitOnDeploy",
13369
13855
  "optional": true,
@@ -13383,7 +13869,7 @@
13383
13869
  "kind": "enum",
13384
13870
  "locationInModule": {
13385
13871
  "filename": "src/image-builders/common.ts",
13386
- "line": 260
13872
+ "line": 279
13387
13873
  },
13388
13874
  "members": [
13389
13875
  {
@@ -13423,7 +13909,7 @@
13423
13909
  "kind": "class",
13424
13910
  "locationInModule": {
13425
13911
  "filename": "src/image-builders/components.ts",
13426
- "line": 39
13912
+ "line": 40
13427
13913
  },
13428
13914
  "methods": [
13429
13915
  {
@@ -13433,7 +13919,7 @@
13433
13919
  },
13434
13920
  "locationInModule": {
13435
13921
  "filename": "src/image-builders/components.ts",
13436
- "line": 181
13922
+ "line": 182
13437
13923
  },
13438
13924
  "name": "awsCli",
13439
13925
  "returns": {
@@ -13450,7 +13936,7 @@
13450
13936
  },
13451
13937
  "locationInModule": {
13452
13938
  "filename": "src/image-builders/components.ts",
13453
- "line": 107
13939
+ "line": 108
13454
13940
  },
13455
13941
  "name": "cloudWatchAgent",
13456
13942
  "returns": {
@@ -13468,7 +13954,7 @@
13468
13954
  },
13469
13955
  "locationInModule": {
13470
13956
  "filename": "src/image-builders/components.ts",
13471
- "line": 49
13957
+ "line": 50
13472
13958
  },
13473
13959
  "name": "custom",
13474
13960
  "parameters": [
@@ -13494,7 +13980,7 @@
13494
13980
  },
13495
13981
  "locationInModule": {
13496
13982
  "filename": "src/image-builders/components.ts",
13497
- "line": 399
13983
+ "line": 400
13498
13984
  },
13499
13985
  "name": "docker",
13500
13986
  "returns": {
@@ -13512,7 +13998,7 @@
13512
13998
  },
13513
13999
  "locationInModule": {
13514
14000
  "filename": "src/image-builders/components.ts",
13515
- "line": 477
14001
+ "line": 478
13516
14002
  },
13517
14003
  "name": "dockerInDocker",
13518
14004
  "returns": {
@@ -13530,7 +14016,7 @@
13530
14016
  },
13531
14017
  "locationInModule": {
13532
14018
  "filename": "src/image-builders/components.ts",
13533
- "line": 580
14019
+ "line": 595
13534
14020
  },
13535
14021
  "name": "environmentVariables",
13536
14022
  "parameters": [
@@ -13561,13 +14047,13 @@
13561
14047
  },
13562
14048
  "locationInModule": {
13563
14049
  "filename": "src/image-builders/components.ts",
13564
- "line": 487
14050
+ "line": 488
13565
14051
  },
13566
14052
  "name": "extraCertificates",
13567
14053
  "parameters": [
13568
14054
  {
13569
14055
  "docs": {
13570
- "summary": "path to certificate file in PEM format."
14056
+ "summary": "path to certificate file in PEM format, or a directory containing certificate files (.pem or .crt)."
13571
14057
  },
13572
14058
  "name": "source",
13573
14059
  "type": {
@@ -13598,7 +14084,7 @@
13598
14084
  },
13599
14085
  "locationInModule": {
13600
14086
  "filename": "src/image-builders/components.ts",
13601
- "line": 260
14087
+ "line": 261
13602
14088
  },
13603
14089
  "name": "git",
13604
14090
  "returns": {
@@ -13615,7 +14101,7 @@
13615
14101
  },
13616
14102
  "locationInModule": {
13617
14103
  "filename": "src/image-builders/components.ts",
13618
- "line": 217
14104
+ "line": 218
13619
14105
  },
13620
14106
  "name": "githubCli",
13621
14107
  "returns": {
@@ -13633,7 +14119,7 @@
13633
14119
  },
13634
14120
  "locationInModule": {
13635
14121
  "filename": "src/image-builders/components.ts",
13636
- "line": 304
14122
+ "line": 305
13637
14123
  },
13638
14124
  "name": "githubRunner",
13639
14125
  "parameters": [
@@ -13662,7 +14148,7 @@
13662
14148
  },
13663
14149
  "locationInModule": {
13664
14150
  "filename": "src/image-builders/components.ts",
13665
- "line": 537
14151
+ "line": 552
13666
14152
  },
13667
14153
  "name": "lambdaEntrypoint",
13668
14154
  "returns": {
@@ -13679,7 +14165,7 @@
13679
14165
  },
13680
14166
  "locationInModule": {
13681
14167
  "filename": "src/image-builders/components.ts",
13682
- "line": 74
14168
+ "line": 75
13683
14169
  },
13684
14170
  "name": "requiredPackages",
13685
14171
  "returns": {
@@ -13696,7 +14182,7 @@
13696
14182
  },
13697
14183
  "locationInModule": {
13698
14184
  "filename": "src/image-builders/components.ts",
13699
- "line": 150
14185
+ "line": 151
13700
14186
  },
13701
14187
  "name": "runnerUser",
13702
14188
  "returns": {
@@ -13714,7 +14200,7 @@
13714
14200
  },
13715
14201
  "locationInModule": {
13716
14202
  "filename": "src/image-builders/components.ts",
13717
- "line": 617
14203
+ "line": 632
13718
14204
  },
13719
14205
  "name": "getAssets",
13720
14206
  "parameters": [
@@ -13751,7 +14237,7 @@
13751
14237
  },
13752
14238
  "locationInModule": {
13753
14239
  "filename": "src/image-builders/components.ts",
13754
- "line": 612
14240
+ "line": 627
13755
14241
  },
13756
14242
  "name": "getCommands",
13757
14243
  "parameters": [
@@ -13787,7 +14273,7 @@
13787
14273
  },
13788
14274
  "locationInModule": {
13789
14275
  "filename": "src/image-builders/components.ts",
13790
- "line": 626
14276
+ "line": 641
13791
14277
  },
13792
14278
  "name": "getDockerCommands",
13793
14279
  "parameters": [
@@ -13822,7 +14308,7 @@
13822
14308
  },
13823
14309
  "locationInModule": {
13824
14310
  "filename": "src/image-builders/components.ts",
13825
- "line": 633
14311
+ "line": 648
13826
14312
  },
13827
14313
  "name": "shouldReboot",
13828
14314
  "parameters": [
@@ -13858,7 +14344,7 @@
13858
14344
  "immutable": true,
13859
14345
  "locationInModule": {
13860
14346
  "filename": "src/image-builders/components.ts",
13861
- "line": 607
14347
+ "line": 622
13862
14348
  },
13863
14349
  "name": "name",
13864
14350
  "type": {
@@ -13878,7 +14364,7 @@
13878
14364
  "kind": "interface",
13879
14365
  "locationInModule": {
13880
14366
  "filename": "src/image-builders/components.ts",
13881
- "line": 8
14367
+ "line": 9
13882
14368
  },
13883
14369
  "name": "RunnerImageComponentCustomProps",
13884
14370
  "properties": [
@@ -13891,7 +14377,7 @@
13891
14377
  "immutable": true,
13892
14378
  "locationInModule": {
13893
14379
  "filename": "src/image-builders/components.ts",
13894
- "line": 24
14380
+ "line": 25
13895
14381
  },
13896
14382
  "name": "assets",
13897
14383
  "optional": true,
@@ -13913,7 +14399,7 @@
13913
14399
  "immutable": true,
13914
14400
  "locationInModule": {
13915
14401
  "filename": "src/image-builders/components.ts",
13916
- "line": 19
14402
+ "line": 20
13917
14403
  },
13918
14404
  "name": "commands",
13919
14405
  "optional": true,
@@ -13936,7 +14422,7 @@
13936
14422
  "immutable": true,
13937
14423
  "locationInModule": {
13938
14424
  "filename": "src/image-builders/components.ts",
13939
- "line": 33
14425
+ "line": 34
13940
14426
  },
13941
14427
  "name": "dockerCommands",
13942
14428
  "optional": true,
@@ -13959,7 +14445,7 @@
13959
14445
  "immutable": true,
13960
14446
  "locationInModule": {
13961
14447
  "filename": "src/image-builders/components.ts",
13962
- "line": 14
14448
+ "line": 15
13963
14449
  },
13964
14450
  "name": "name",
13965
14451
  "optional": true,
@@ -14419,7 +14905,7 @@
14419
14905
  "kind": "class",
14420
14906
  "locationInModule": {
14421
14907
  "filename": "src/image-builders/static.ts",
14422
- "line": 10
14908
+ "line": 11
14423
14909
  },
14424
14910
  "methods": [
14425
14911
  {
@@ -14430,7 +14916,7 @@
14430
14916
  },
14431
14917
  "locationInModule": {
14432
14918
  "filename": "src/image-builders/static.ts",
14433
- "line": 49
14919
+ "line": 50
14434
14920
  },
14435
14921
  "name": "fromDockerHub",
14436
14922
  "parameters": [
@@ -14491,7 +14977,7 @@
14491
14977
  },
14492
14978
  "locationInModule": {
14493
14979
  "filename": "src/image-builders/static.ts",
14494
- "line": 19
14980
+ "line": 20
14495
14981
  },
14496
14982
  "name": "fromEcrRepository",
14497
14983
  "parameters": [
@@ -14920,6 +15406,6 @@
14920
15406
  "symbolId": "src/image-builders/aws-image-builder/deprecated/windows-components:WindowsComponents"
14921
15407
  }
14922
15408
  },
14923
- "version": "0.14.18",
14924
- "fingerprint": "78faIxcJg8nT4vHotUHZaPgQK8EkmIk1Pw2k6eNcPPg="
15409
+ "version": "0.14.19",
15410
+ "fingerprint": "QF6i7fJ2z4AGrNgldaspT8wEzuZH447E3ZPEjj7oNOs="
14925
15411
  }