@cloudsnorkel/cdk-github-runners 0.15.0 β†’ 0.15.1

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 (42) hide show
  1. package/.jsii +533 -327
  2. package/API.md +384 -174
  3. package/README.md +1 -1
  4. package/assets/delete-failed-runner.lambda/index.js +23 -6
  5. package/assets/idle-runner-repear.lambda/index.js +23 -6
  6. package/assets/setup.lambda/index.html +7 -7
  7. package/assets/setup.lambda/index.js +23 -6
  8. package/assets/status.lambda/index.js +23 -6
  9. package/assets/token-retriever.lambda/index.js +23 -6
  10. package/assets/warm-runner-manager.lambda/index.js +23 -6
  11. package/assets/webhook-handler.lambda/index.js +23 -6
  12. package/assets/webhook-redelivery.lambda/index.js +23 -6
  13. package/lib/access.js +1 -1
  14. package/lib/image-builders/api.js +1 -1
  15. package/lib/image-builders/aws-image-builder/base-image.js +2 -2
  16. package/lib/image-builders/aws-image-builder/builder.js +1 -1
  17. package/lib/image-builders/aws-image-builder/deprecated/ami.js +1 -1
  18. package/lib/image-builders/aws-image-builder/deprecated/container.js +1 -1
  19. package/lib/image-builders/aws-image-builder/deprecated/linux-components.js +1 -1
  20. package/lib/image-builders/aws-image-builder/deprecated/windows-components.js +1 -1
  21. package/lib/image-builders/codebuild-deprecated.js +1 -1
  22. package/lib/image-builders/components.js +1 -1
  23. package/lib/image-builders/static.js +1 -1
  24. package/lib/providers/codebuild.d.ts +2 -2
  25. package/lib/providers/codebuild.js +3 -3
  26. package/lib/providers/common.d.ts +47 -3
  27. package/lib/providers/common.js +29 -5
  28. package/lib/providers/composite.js +14 -19
  29. package/lib/providers/ec2.d.ts +4 -2
  30. package/lib/providers/ec2.js +58 -30
  31. package/lib/providers/ecs.d.ts +2 -2
  32. package/lib/providers/ecs.js +8 -8
  33. package/lib/providers/fargate.d.ts +2 -2
  34. package/lib/providers/fargate.js +13 -8
  35. package/lib/providers/lambda.d.ts +2 -2
  36. package/lib/providers/lambda.js +3 -3
  37. package/lib/runner.d.ts +6 -1
  38. package/lib/runner.js +54 -31
  39. package/lib/secrets.js +1 -1
  40. package/lib/warm-runner.d.ts +15 -7
  41. package/lib/warm-runner.js +19 -12
  42. package/package.json +15 -15
package/.jsii CHANGED
@@ -8501,7 +8501,7 @@
8501
8501
  "stability": "experimental"
8502
8502
  },
8503
8503
  "homepage": "https://github.com/CloudSnorkel/cdk-github-runners.git",
8504
- "jsiiVersion": "5.9.31 (build 550e607)",
8504
+ "jsiiVersion": "5.9.33 (build 8ebb533)",
8505
8505
  "keywords": [
8506
8506
  "aws",
8507
8507
  "aws-cdk",
@@ -8525,7 +8525,7 @@
8525
8525
  },
8526
8526
  "name": "@cloudsnorkel/cdk-github-runners",
8527
8527
  "readme": {
8528
- "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[![Discord](https://img.shields.io/badge/Discord-5865F2?logo=discord&logoColor=white)][20]\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## Table of Contents\n\n- [API](#api)\n- [Providers](#providers)\n- [Installation](#installation)\n- [Customizing](#customizing)\n - [Composite Providers](#composite-providers)\n - [Custom Provider Selection](#custom-provider-selection)\n - [Warm Runners](#warm-runners)\n- [Examples](#examples)\n- [Architecture](#architecture)\n- [Troubleshooting](#troubleshooting)\n- [Monitoring](#monitoring)\n- [Getting Help](#getting-help)\n- [Contributing](#contributing)\n- [Sponsors](#sponsors)\n- [Other Options](#other-options)\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### Warm Runners\n\nWarm runners are pre-provisioned and stay idle until a job arrives, reducing startup latency. Use `AlwaysOnWarmRunner` for 24/7 pools or `ScheduledWarmRunner` for time-windowed pools. You specify the provider directly.\n\n```typescript\nimport { AlwaysOnWarmRunner, CodeBuildRunnerProvider, GitHubRunners } from '@cloudsnorkel/cdk-github-runners';\n\nconst provider = new CodeBuildRunnerProvider(this, 'provider', { labels: ['codebuild', 'linux'] });\nconst runners = new GitHubRunners(this, 'runners', { providers: [provider] });\n\nnew AlwaysOnWarmRunner(this, 'warm', {\n runners,\n provider,\n count: 2,\n owner: 'my-org',\n repo: 'my-repo',\n});\n```\n\nWarm runner pools can be stacked. If you want 2 warm runners always available but 3 during peak work hours, you can create one pool with 2 runners always on and another pool with 1 runner during work hours.\n\n```typescript\nimport { aws_events as events, Duration } from 'aws-cdk-lib';\nimport { AlwaysOnWarmRunner, ScheduledWarmRunner, CodeBuildRunnerProvider, GitHubRunners } from '@cloudsnorkel/cdk-github-runners';\n\nconst provider = new CodeBuildRunnerProvider(this, 'provider', { labels: ['codebuild', 'linux'] });\nconst runners = new GitHubRunners(this, 'runners', { providers: [provider] });\n\nnew AlwaysOnWarmRunner(this, 'warm', {\n runners,\n provider,\n count: 2,\n owner: 'my-org',\n repo: 'my-repo',\n});\n\nnew ScheduledWarmRunner(this, 'work hours warm', {\n runners,\n provider,\n count: 1,\n owner: 'my-org',\n repo: 'my-repo',\n schedule: events.Schedule.cron({ hour: '13', minute: '0', weekDay: 'MON-FRI' }),\n duration: Duration.hours(2),\n});\n```\n\nSee the [warm-runners example](examples/typescript/warm-runners/) for a complete setup.\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- **[Warm Runners](examples/typescript/warm-runners/)** - Pre-provisioned runners for low-latency job starts (also available in [Python](examples/python/warm-runners/))\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- **[Split Stacks](examples/typescript/split-stacks/)** - Split image builders and providers across multiple stacks (also available in [Python](examples/python/split-stacks/))\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- **[GPU](examples/typescript/gpu/)** - GPU support with NVIDIA drivers across EC2, CodeBuild, and ECS (also available in [Python](examples/python/gpu/))\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## Getting Help\n\nNeed help? We're here for you!\n\n* πŸ’¬ **GitHub Discussions**: Ask questions, share ideas, or get help from the community by opening a [discussion][18]\n* πŸ› **GitHub Issues**: Report bugs or request features by opening an [issue][16]\n* πŸ’¬ **Discord**: Join our [Discord community][20] for real-time help and discussions\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## Sponsors\n\nThanks to our generous sponsors who helped make this project possible!\n\n<table>\n <tr>\n <td align=\"center\">\n <a href=\"https://github.com/threat-down\">\n <img src=\"https://github.com/threat-down.png?size=100\" width=\"100\" height=\"100\" alt=\"ThreatDown\" />\n <br />\n <sub><b>ThreatDown</b></sub>\n </a>\n </td>\n <td align=\"center\">\n <a href=\"https://github.com/magicbell\">\n <img src=\"https://github.com/magicbell.png?size=100\" width=\"100\" height=\"100\" alt=\"MagicBell\" />\n <br />\n <sub><b>MagicBell</b></sub>\n </a>\n </td>\n <td align=\"center\">\n <a href=\"https://github.com/fragment-dev\">\n <img src=\"https://github.com/fragment-dev.png?size=100\" width=\"100\" height=\"100\" alt=\"Fragment\" />\n <br />\n <sub><b>Fragment</b></sub>\n </a>\n </td>\n <td align=\"center\">\n <a href=\"https://github.com/andresionek91\">\n <img src=\"https://github.com/andresionek91.png?size=100\" width=\"100\" height=\"100\" alt=\"Andre Sionek\" />\n <br />\n <sub><b>Andre Sionek</b></sub>\n </a>\n </td>\n </tr>\n</table>\n\n## Other Options\n\n1. [github-aws-runners/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/github-aws-runners/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[18]: https://github.com/CloudSnorkel/cdk-github-runners/discussions\n[20]: https://discord.gg/vdrTUTqQKv\n"
8528
+ "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[![Discord](https://img.shields.io/badge/Discord-5865F2?logo=discord&logoColor=white)][20]\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## Table of Contents\n\n- [API](#api)\n- [Providers](#providers)\n- [Installation](#installation)\n- [Customizing](#customizing)\n - [Composite Providers](#composite-providers)\n - [Custom Provider Selection](#custom-provider-selection)\n - [Warm Runners](#warm-runners)\n- [Examples](#examples)\n- [Architecture](#architecture)\n- [Troubleshooting](#troubleshooting)\n- [Monitoring](#monitoring)\n- [Getting Help](#getting-help)\n- [Contributing](#contributing)\n- [Sponsors](#sponsors)\n- [Other Options](#other-options)\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 | 36 hours (default 1 hour) | 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### Warm Runners\n\nWarm runners are pre-provisioned and stay idle until a job arrives, reducing startup latency. Use `AlwaysOnWarmRunner` for 24/7 pools or `ScheduledWarmRunner` for time-windowed pools. You specify the provider directly.\n\n```typescript\nimport { AlwaysOnWarmRunner, CodeBuildRunnerProvider, GitHubRunners } from '@cloudsnorkel/cdk-github-runners';\n\nconst provider = new CodeBuildRunnerProvider(this, 'provider', { labels: ['codebuild', 'linux'] });\nconst runners = new GitHubRunners(this, 'runners', { providers: [provider] });\n\nnew AlwaysOnWarmRunner(this, 'warm', {\n runners,\n provider,\n count: 2,\n owner: 'my-org',\n repo: 'my-repo',\n});\n```\n\nWarm runner pools can be stacked. If you want 2 warm runners always available but 3 during peak work hours, you can create one pool with 2 runners always on and another pool with 1 runner during work hours.\n\n```typescript\nimport { aws_events as events, Duration } from 'aws-cdk-lib';\nimport { AlwaysOnWarmRunner, ScheduledWarmRunner, CodeBuildRunnerProvider, GitHubRunners } from '@cloudsnorkel/cdk-github-runners';\n\nconst provider = new CodeBuildRunnerProvider(this, 'provider', { labels: ['codebuild', 'linux'] });\nconst runners = new GitHubRunners(this, 'runners', { providers: [provider] });\n\nnew AlwaysOnWarmRunner(this, 'warm', {\n runners,\n provider,\n count: 2,\n owner: 'my-org',\n repo: 'my-repo',\n});\n\nnew ScheduledWarmRunner(this, 'work hours warm', {\n runners,\n provider,\n count: 1,\n owner: 'my-org',\n repo: 'my-repo',\n schedule: events.Schedule.cron({ hour: '13', minute: '0', weekDay: 'MON-FRI' }),\n duration: Duration.hours(2),\n});\n```\n\nSee the [warm-runners example](examples/typescript/warm-runners/) for a complete setup.\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- **[Warm Runners](examples/typescript/warm-runners/)** - Pre-provisioned runners for low-latency job starts (also available in [Python](examples/python/warm-runners/))\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- **[Split Stacks](examples/typescript/split-stacks/)** - Split image builders and providers across multiple stacks (also available in [Python](examples/python/split-stacks/))\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- **[GPU](examples/typescript/gpu/)** - GPU support with NVIDIA drivers across EC2, CodeBuild, and ECS (also available in [Python](examples/python/gpu/))\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## Getting Help\n\nNeed help? We're here for you!\n\n* πŸ’¬ **GitHub Discussions**: Ask questions, share ideas, or get help from the community by opening a [discussion][18]\n* πŸ› **GitHub Issues**: Report bugs or request features by opening an [issue][16]\n* πŸ’¬ **Discord**: Join our [Discord community][20] for real-time help and discussions\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## Sponsors\n\nThanks to our generous sponsors who helped make this project possible!\n\n<table>\n <tr>\n <td align=\"center\">\n <a href=\"https://github.com/threat-down\">\n <img src=\"https://github.com/threat-down.png?size=100\" width=\"100\" height=\"100\" alt=\"ThreatDown\" />\n <br />\n <sub><b>ThreatDown</b></sub>\n </a>\n </td>\n <td align=\"center\">\n <a href=\"https://github.com/magicbell\">\n <img src=\"https://github.com/magicbell.png?size=100\" width=\"100\" height=\"100\" alt=\"MagicBell\" />\n <br />\n <sub><b>MagicBell</b></sub>\n </a>\n </td>\n <td align=\"center\">\n <a href=\"https://github.com/fragment-dev\">\n <img src=\"https://github.com/fragment-dev.png?size=100\" width=\"100\" height=\"100\" alt=\"Fragment\" />\n <br />\n <sub><b>Fragment</b></sub>\n </a>\n </td>\n <td align=\"center\">\n <a href=\"https://github.com/andresionek91\">\n <img src=\"https://github.com/andresionek91.png?size=100\" width=\"100\" height=\"100\" alt=\"Andre Sionek\" />\n <br />\n <sub><b>Andre Sionek</b></sub>\n </a>\n </td>\n </tr>\n</table>\n\n## Other Options\n\n1. [github-aws-runners/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/github-aws-runners/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[18]: https://github.com/CloudSnorkel/cdk-github-runners/discussions\n[20]: https://discord.gg/vdrTUTqQKv\n"
8529
8529
  },
8530
8530
  "repository": {
8531
8531
  "type": "git",
@@ -8560,8 +8560,8 @@
8560
8560
  "assembly": "@cloudsnorkel/cdk-github-runners",
8561
8561
  "base": "constructs.Construct",
8562
8562
  "docs": {
8563
- "example": "new AlwaysOnWarmRunner(stack, 'AlwaysOnLinux', {\n runners,\n provider: myProvider,\n count: 3,\n owner: 'my-org',\n repo: 'my-repo',\n});",
8564
- "remarks": "Runners will be provisioned using the specified provider and registered in the specified repository or organization.\n\nRegistration level must match the one selected during setup. See {@link SETUP_GITHUB.md } for more information on the selection.\n\n## Limitations\n\n- Jobs will still trigger provisioning of on-demand runners, even if a warm runner ends up being used.\n- You may briefly see more than `count` runners when changing config or at rotation.\n- To remove: set `count` to 0, deploy, wait for warm runners to stop, then remove and deploy again.\n If you don't follow this procedure, warm runners may linger until they expire.\n- Provider failures or timeouts (like Lambda provider timing out after 15 minutes) will result in a\n gap in coverage until the retry succeeds. Current retry mechanism has built-in back-off rate and\n can be tweaked using `retryOptions`. This will be improved in the future.",
8563
+ "remarks": "Runners will be provisioned using the specified provider and registered in the specified repository or organization.\n\nRegistration level must match the one selected during setup.",
8564
+ "see": "https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md\n\n## Limitations\n\n- Jobs will still trigger provisioning of on-demand runners, even if a warm runner ends up being used.\n- You may briefly see more than `count` runners when changing config or at rotation.\n- To remove: set `count` to 0, deploy, wait for warm runners to stop, then remove and deploy again.\nIf you don't follow this procedure, warm runners may linger until they expire.\n- Provider failures or timeouts (like Lambda provider timing out after 15 minutes) will result in a\ngap in coverage until the retry succeeds. Current retry mechanism has built-in back-off rate and\ncan be tweaked using `retryOptions`. This will be improved in the future.\n\n```typescript\nnew AlwaysOnWarmRunner(stack, 'AlwaysOnLinux', {\nrunners,\nprovider: myProvider,\ncount: 3,\nowner: 'my-org',\nrepo: 'my-repo',\n});\n```",
8565
8565
  "stability": "experimental",
8566
8566
  "summary": "Warm runners that run 24/7. Fills at midnight UTC and each runner stays alive for 24 hours."
8567
8567
  },
@@ -8572,7 +8572,7 @@
8572
8572
  },
8573
8573
  "locationInModule": {
8574
8574
  "filename": "src/warm-runner.ts",
8575
- "line": 166
8575
+ "line": 170
8576
8576
  },
8577
8577
  "parameters": [
8578
8578
  {
@@ -8598,7 +8598,7 @@
8598
8598
  "kind": "class",
8599
8599
  "locationInModule": {
8600
8600
  "filename": "src/warm-runner.ts",
8601
- "line": 159
8601
+ "line": 163
8602
8602
  },
8603
8603
  "name": "AlwaysOnWarmRunner",
8604
8604
  "symbolId": "src/warm-runner:AlwaysOnWarmRunner"
@@ -8614,7 +8614,7 @@
8614
8614
  "kind": "interface",
8615
8615
  "locationInModule": {
8616
8616
  "filename": "src/warm-runner.ts",
8617
- "line": 58
8617
+ "line": 59
8618
8618
  },
8619
8619
  "name": "AlwaysOnWarmRunnerProps",
8620
8620
  "properties": [
@@ -8696,14 +8696,15 @@
8696
8696
  "abstract": true,
8697
8697
  "docs": {
8698
8698
  "default": "'repo'",
8699
- "remarks": "Choose\n'org' for org-wide runners, 'repo' for repo-level. See the setup wizard or\n{@link SETUP_GITHUB.md } for choosing repo vs org.",
8699
+ "remarks": "Choose\n'org' for org-wide runners, 'repo' for repo-level. See the setup wizard for choosing repo vs org.",
8700
+ "see": "https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md",
8700
8701
  "stability": "experimental",
8701
8702
  "summary": "Registration level β€” must match how your runners are set up in GitHub."
8702
8703
  },
8703
8704
  "immutable": true,
8704
8705
  "locationInModule": {
8705
8706
  "filename": "src/warm-runner.ts",
8706
- "line": 47
8707
+ "line": 48
8707
8708
  },
8708
8709
  "name": "registrationLevel",
8709
8710
  "optional": true,
@@ -8721,7 +8722,7 @@
8721
8722
  "immutable": true,
8722
8723
  "locationInModule": {
8723
8724
  "filename": "src/warm-runner.ts",
8724
- "line": 52
8725
+ "line": 53
8725
8726
  },
8726
8727
  "name": "repo",
8727
8728
  "optional": true,
@@ -10980,7 +10981,7 @@
10980
10981
  },
10981
10982
  "name": "parameters",
10982
10983
  "type": {
10983
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
10984
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
10984
10985
  }
10985
10986
  }
10986
10987
  ],
@@ -11017,7 +11018,7 @@
11017
11018
  },
11018
11019
  "locationInModule": {
11019
11020
  "filename": "src/providers/common.ts",
11020
- "line": 613
11021
+ "line": 677
11021
11022
  },
11022
11023
  "name": "labelsFromProperties",
11023
11024
  "parameters": [
@@ -11084,6 +11085,28 @@
11084
11085
  "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerProviderStatus"
11085
11086
  }
11086
11087
  }
11088
+ },
11089
+ {
11090
+ "docs": {
11091
+ "stability": "experimental",
11092
+ "summary": "Override to inject static strings into `$.consts` on the orchestrator state machine."
11093
+ },
11094
+ "locationInModule": {
11095
+ "filename": "src/providers/common.ts",
11096
+ "line": 673
11097
+ },
11098
+ "name": "stepFunctionConstants",
11099
+ "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
11100
+ "returns": {
11101
+ "type": {
11102
+ "collection": {
11103
+ "elementtype": {
11104
+ "primitive": "string"
11105
+ },
11106
+ "kind": "map"
11107
+ }
11108
+ }
11109
+ }
11087
11110
  }
11088
11111
  ],
11089
11112
  "name": "CodeBuildRunnerProvider",
@@ -11522,7 +11545,7 @@
11522
11545
  "kind": "class",
11523
11546
  "locationInModule": {
11524
11547
  "filename": "src/providers/composite.ts",
11525
- "line": 24
11548
+ "line": 31
11526
11549
  },
11527
11550
  "methods": [
11528
11551
  {
@@ -11533,7 +11556,7 @@
11533
11556
  },
11534
11557
  "locationInModule": {
11535
11558
  "filename": "src/providers/composite.ts",
11536
- "line": 66
11559
+ "line": 73
11537
11560
  },
11538
11561
  "name": "distribute",
11539
11562
  "parameters": [
@@ -11585,7 +11608,7 @@
11585
11608
  },
11586
11609
  "locationInModule": {
11587
11610
  "filename": "src/providers/composite.ts",
11588
- "line": 41
11611
+ "line": 48
11589
11612
  },
11590
11613
  "name": "fallback",
11591
11614
  "parameters": [
@@ -12319,7 +12342,7 @@
12319
12342
  },
12320
12343
  "locationInModule": {
12321
12344
  "filename": "src/providers/ec2.ts",
12322
- "line": 398
12345
+ "line": 414
12323
12346
  },
12324
12347
  "parameters": [
12325
12348
  {
@@ -12346,7 +12369,7 @@
12346
12369
  "kind": "class",
12347
12370
  "locationInModule": {
12348
12371
  "filename": "src/providers/ec2.ts",
12349
- "line": 655
12372
+ "line": 679
12350
12373
  },
12351
12374
  "name": "Ec2Runner",
12352
12375
  "symbolId": "src/providers/ec2:Ec2Runner"
@@ -12366,7 +12389,7 @@
12366
12389
  },
12367
12390
  "locationInModule": {
12368
12391
  "filename": "src/providers/ec2.ts",
12369
- "line": 398
12392
+ "line": 414
12370
12393
  },
12371
12394
  "parameters": [
12372
12395
  {
@@ -12396,7 +12419,7 @@
12396
12419
  "kind": "class",
12397
12420
  "locationInModule": {
12398
12421
  "filename": "src/providers/ec2.ts",
12399
- "line": 323
12422
+ "line": 339
12400
12423
  },
12401
12424
  "methods": [
12402
12425
  {
@@ -12407,7 +12430,7 @@
12407
12430
  },
12408
12431
  "locationInModule": {
12409
12432
  "filename": "src/providers/ec2.ts",
12410
- "line": 343
12433
+ "line": 359
12411
12434
  },
12412
12435
  "name": "imageBuilder",
12413
12436
  "parameters": [
@@ -12446,7 +12469,7 @@
12446
12469
  },
12447
12470
  "locationInModule": {
12448
12471
  "filename": "src/providers/ec2.ts",
12449
- "line": 464
12472
+ "line": 493
12450
12473
  },
12451
12474
  "name": "getStepFunctionTask",
12452
12475
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -12457,7 +12480,7 @@
12457
12480
  },
12458
12481
  "name": "parameters",
12459
12482
  "type": {
12460
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
12483
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
12461
12484
  }
12462
12485
  }
12463
12486
  ],
@@ -12475,7 +12498,7 @@
12475
12498
  },
12476
12499
  "locationInModule": {
12477
12500
  "filename": "src/providers/ec2.ts",
12478
- "line": 594
12501
+ "line": 618
12479
12502
  },
12480
12503
  "name": "grantStateMachine",
12481
12504
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -12494,7 +12517,7 @@
12494
12517
  },
12495
12518
  "locationInModule": {
12496
12519
  "filename": "src/providers/common.ts",
12497
- "line": 613
12520
+ "line": 677
12498
12521
  },
12499
12522
  "name": "labelsFromProperties",
12500
12523
  "parameters": [
@@ -12544,7 +12567,7 @@
12544
12567
  },
12545
12568
  "locationInModule": {
12546
12569
  "filename": "src/providers/ec2.ts",
12547
- "line": 624
12570
+ "line": 648
12548
12571
  },
12549
12572
  "name": "status",
12550
12573
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -12561,6 +12584,28 @@
12561
12584
  "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerProviderStatus"
12562
12585
  }
12563
12586
  }
12587
+ },
12588
+ {
12589
+ "docs": {
12590
+ "stability": "experimental",
12591
+ "summary": "Override to inject static strings into `$.consts` on the orchestrator state machine."
12592
+ },
12593
+ "locationInModule": {
12594
+ "filename": "src/providers/ec2.ts",
12595
+ "line": 481
12596
+ },
12597
+ "name": "stepFunctionConstants",
12598
+ "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
12599
+ "returns": {
12600
+ "type": {
12601
+ "collection": {
12602
+ "elementtype": {
12603
+ "primitive": "string"
12604
+ },
12605
+ "kind": "map"
12606
+ }
12607
+ }
12608
+ }
12564
12609
  }
12565
12610
  ],
12566
12611
  "name": "Ec2RunnerProvider",
@@ -12573,7 +12618,7 @@
12573
12618
  "immutable": true,
12574
12619
  "locationInModule": {
12575
12620
  "filename": "src/providers/ec2.ts",
12576
- "line": 647
12621
+ "line": 671
12577
12622
  },
12578
12623
  "name": "connections",
12579
12624
  "overrides": "aws-cdk-lib.aws_ec2.IConnectable",
@@ -12589,7 +12634,7 @@
12589
12634
  "immutable": true,
12590
12635
  "locationInModule": {
12591
12636
  "filename": "src/providers/ec2.ts",
12592
- "line": 370
12637
+ "line": 386
12593
12638
  },
12594
12639
  "name": "grantPrincipal",
12595
12640
  "overrides": "aws-cdk-lib.aws_iam.IGrantable",
@@ -12605,7 +12650,7 @@
12605
12650
  "immutable": true,
12606
12651
  "locationInModule": {
12607
12652
  "filename": "src/providers/ec2.ts",
12608
- "line": 365
12653
+ "line": 381
12609
12654
  },
12610
12655
  "name": "labels",
12611
12656
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -12627,7 +12672,7 @@
12627
12672
  "immutable": true,
12628
12673
  "locationInModule": {
12629
12674
  "filename": "src/providers/ec2.ts",
12630
- "line": 377
12675
+ "line": 393
12631
12676
  },
12632
12677
  "name": "logGroup",
12633
12678
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -12643,7 +12688,7 @@
12643
12688
  "immutable": true,
12644
12689
  "locationInModule": {
12645
12690
  "filename": "src/providers/ec2.ts",
12646
- "line": 379
12691
+ "line": 395
12647
12692
  },
12648
12693
  "name": "retryableErrors",
12649
12694
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -12673,7 +12718,7 @@
12673
12718
  "kind": "interface",
12674
12719
  "locationInModule": {
12675
12720
  "filename": "src/providers/ec2.ts",
12676
- "line": 200
12721
+ "line": 216
12677
12722
  },
12678
12723
  "name": "Ec2RunnerProviderProps",
12679
12724
  "properties": [
@@ -12686,7 +12731,7 @@
12686
12731
  "immutable": true,
12687
12732
  "locationInModule": {
12688
12733
  "filename": "src/providers/ec2.ts",
12689
- "line": 213
12734
+ "line": 229
12690
12735
  },
12691
12736
  "name": "amiBuilder",
12692
12737
  "optional": true,
@@ -12705,7 +12750,7 @@
12705
12750
  "immutable": true,
12706
12751
  "locationInModule": {
12707
12752
  "filename": "src/providers/ec2.ts",
12708
- "line": 238
12753
+ "line": 254
12709
12754
  },
12710
12755
  "name": "group",
12711
12756
  "optional": true,
@@ -12724,7 +12769,7 @@
12724
12769
  "immutable": true,
12725
12770
  "locationInModule": {
12726
12771
  "filename": "src/providers/ec2.ts",
12727
- "line": 208
12772
+ "line": 224
12728
12773
  },
12729
12774
  "name": "imageBuilder",
12730
12775
  "optional": true,
@@ -12743,7 +12788,7 @@
12743
12788
  "immutable": true,
12744
12789
  "locationInModule": {
12745
12790
  "filename": "src/providers/ec2.ts",
12746
- "line": 250
12791
+ "line": 266
12747
12792
  },
12748
12793
  "name": "instanceType",
12749
12794
  "optional": true,
@@ -12762,7 +12807,7 @@
12762
12807
  "immutable": true,
12763
12808
  "locationInModule": {
12764
12809
  "filename": "src/providers/ec2.ts",
12765
- "line": 224
12810
+ "line": 240
12766
12811
  },
12767
12812
  "name": "labels",
12768
12813
  "optional": true,
@@ -12786,7 +12831,7 @@
12786
12831
  "immutable": true,
12787
12832
  "locationInModule": {
12788
12833
  "filename": "src/providers/ec2.ts",
12789
- "line": 271
12834
+ "line": 287
12790
12835
  },
12791
12836
  "name": "securityGroup",
12792
12837
  "optional": true,
@@ -12804,7 +12849,7 @@
12804
12849
  "immutable": true,
12805
12850
  "locationInModule": {
12806
12851
  "filename": "src/providers/ec2.ts",
12807
- "line": 278
12852
+ "line": 294
12808
12853
  },
12809
12854
  "name": "securityGroups",
12810
12855
  "optional": true,
@@ -12828,7 +12873,7 @@
12828
12873
  "immutable": true,
12829
12874
  "locationInModule": {
12830
12875
  "filename": "src/providers/ec2.ts",
12831
- "line": 308
12876
+ "line": 324
12832
12877
  },
12833
12878
  "name": "spot",
12834
12879
  "optional": true,
@@ -12846,7 +12891,7 @@
12846
12891
  "immutable": true,
12847
12892
  "locationInModule": {
12848
12893
  "filename": "src/providers/ec2.ts",
12849
- "line": 315
12894
+ "line": 331
12850
12895
  },
12851
12896
  "name": "spotMaxPrice",
12852
12897
  "optional": true,
@@ -12863,7 +12908,7 @@
12863
12908
  "immutable": true,
12864
12909
  "locationInModule": {
12865
12910
  "filename": "src/providers/ec2.ts",
12866
- "line": 262
12911
+ "line": 278
12867
12912
  },
12868
12913
  "name": "storageOptions",
12869
12914
  "optional": true,
@@ -12882,7 +12927,7 @@
12882
12927
  "immutable": true,
12883
12928
  "locationInModule": {
12884
12929
  "filename": "src/providers/ec2.ts",
12885
- "line": 257
12930
+ "line": 273
12886
12931
  },
12887
12932
  "name": "storageSize",
12888
12933
  "optional": true,
@@ -12901,7 +12946,7 @@
12901
12946
  "immutable": true,
12902
12947
  "locationInModule": {
12903
12948
  "filename": "src/providers/ec2.ts",
12904
- "line": 287
12949
+ "line": 303
12905
12950
  },
12906
12951
  "name": "subnet",
12907
12952
  "optional": true,
@@ -12920,7 +12965,7 @@
12920
12965
  "immutable": true,
12921
12966
  "locationInModule": {
12922
12967
  "filename": "src/providers/ec2.ts",
12923
- "line": 301
12968
+ "line": 317
12924
12969
  },
12925
12970
  "name": "subnetSelection",
12926
12971
  "optional": true,
@@ -12938,7 +12983,7 @@
12938
12983
  "immutable": true,
12939
12984
  "locationInModule": {
12940
12985
  "filename": "src/providers/ec2.ts",
12941
- "line": 294
12986
+ "line": 310
12942
12987
  },
12943
12988
  "name": "vpc",
12944
12989
  "optional": true,
@@ -13055,7 +13100,7 @@
13055
13100
  },
13056
13101
  "name": "parameters",
13057
13102
  "type": {
13058
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
13103
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
13059
13104
  }
13060
13105
  }
13061
13106
  ],
@@ -13092,7 +13137,7 @@
13092
13137
  },
13093
13138
  "locationInModule": {
13094
13139
  "filename": "src/providers/common.ts",
13095
- "line": 613
13140
+ "line": 677
13096
13141
  },
13097
13142
  "name": "labelsFromProperties",
13098
13143
  "parameters": [
@@ -13159,6 +13204,28 @@
13159
13204
  "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerProviderStatus"
13160
13205
  }
13161
13206
  }
13207
+ },
13208
+ {
13209
+ "docs": {
13210
+ "stability": "experimental",
13211
+ "summary": "Override to inject static strings into `$.consts` on the orchestrator state machine."
13212
+ },
13213
+ "locationInModule": {
13214
+ "filename": "src/providers/common.ts",
13215
+ "line": 673
13216
+ },
13217
+ "name": "stepFunctionConstants",
13218
+ "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
13219
+ "returns": {
13220
+ "type": {
13221
+ "collection": {
13222
+ "elementtype": {
13223
+ "primitive": "string"
13224
+ },
13225
+ "kind": "map"
13226
+ }
13227
+ }
13228
+ }
13162
13229
  }
13163
13230
  ],
13164
13231
  "name": "EcsRunnerProvider",
@@ -13754,7 +13821,7 @@
13754
13821
  },
13755
13822
  "locationInModule": {
13756
13823
  "filename": "src/providers/fargate.ts",
13757
- "line": 363
13824
+ "line": 364
13758
13825
  },
13759
13826
  "parameters": [
13760
13827
  {
@@ -13781,7 +13848,7 @@
13781
13848
  "kind": "class",
13782
13849
  "locationInModule": {
13783
13850
  "filename": "src/providers/fargate.ts",
13784
- "line": 549
13851
+ "line": 554
13785
13852
  },
13786
13853
  "name": "FargateRunner",
13787
13854
  "symbolId": "src/providers/fargate:FargateRunner"
@@ -13801,7 +13868,7 @@
13801
13868
  },
13802
13869
  "locationInModule": {
13803
13870
  "filename": "src/providers/fargate.ts",
13804
- "line": 363
13871
+ "line": 364
13805
13872
  },
13806
13873
  "parameters": [
13807
13874
  {
@@ -13831,7 +13898,7 @@
13831
13898
  "kind": "class",
13832
13899
  "locationInModule": {
13833
13900
  "filename": "src/providers/fargate.ts",
13834
- "line": 221
13901
+ "line": 222
13835
13902
  },
13836
13903
  "methods": [
13837
13904
  {
@@ -13842,7 +13909,7 @@
13842
13909
  },
13843
13910
  "locationInModule": {
13844
13911
  "filename": "src/providers/fargate.ts",
13845
- "line": 261
13912
+ "line": 262
13846
13913
  },
13847
13914
  "name": "imageBuilder",
13848
13915
  "parameters": [
@@ -13881,7 +13948,7 @@
13881
13948
  },
13882
13949
  "locationInModule": {
13883
13950
  "filename": "src/providers/fargate.ts",
13884
- "line": 452
13951
+ "line": 457
13885
13952
  },
13886
13953
  "name": "getStepFunctionTask",
13887
13954
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -13892,7 +13959,7 @@
13892
13959
  },
13893
13960
  "name": "parameters",
13894
13961
  "type": {
13895
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
13962
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
13896
13963
  }
13897
13964
  }
13898
13965
  ],
@@ -13910,7 +13977,7 @@
13910
13977
  },
13911
13978
  "locationInModule": {
13912
13979
  "filename": "src/providers/fargate.ts",
13913
- "line": 523
13980
+ "line": 528
13914
13981
  },
13915
13982
  "name": "grantStateMachine",
13916
13983
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -13929,7 +13996,7 @@
13929
13996
  },
13930
13997
  "locationInModule": {
13931
13998
  "filename": "src/providers/common.ts",
13932
- "line": 613
13999
+ "line": 677
13933
14000
  },
13934
14001
  "name": "labelsFromProperties",
13935
14002
  "parameters": [
@@ -13979,7 +14046,7 @@
13979
14046
  },
13980
14047
  "locationInModule": {
13981
14048
  "filename": "src/providers/fargate.ts",
13982
- "line": 526
14049
+ "line": 531
13983
14050
  },
13984
14051
  "name": "status",
13985
14052
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -13996,6 +14063,28 @@
13996
14063
  "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerProviderStatus"
13997
14064
  }
13998
14065
  }
14066
+ },
14067
+ {
14068
+ "docs": {
14069
+ "stability": "experimental",
14070
+ "summary": "Override to inject static strings into `$.consts` on the orchestrator state machine."
14071
+ },
14072
+ "locationInModule": {
14073
+ "filename": "src/providers/common.ts",
14074
+ "line": 673
14075
+ },
14076
+ "name": "stepFunctionConstants",
14077
+ "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
14078
+ "returns": {
14079
+ "type": {
14080
+ "collection": {
14081
+ "elementtype": {
14082
+ "primitive": "string"
14083
+ },
14084
+ "kind": "map"
14085
+ }
14086
+ }
14087
+ }
13999
14088
  }
14000
14089
  ],
14001
14090
  "name": "FargateRunnerProvider",
@@ -14011,7 +14100,7 @@
14011
14100
  "immutable": true,
14012
14101
  "locationInModule": {
14013
14102
  "filename": "src/providers/fargate.ts",
14014
- "line": 242
14103
+ "line": 243
14015
14104
  },
14016
14105
  "name": "LINUX_ARM64_DOCKERFILE_PATH",
14017
14106
  "static": true,
@@ -14030,7 +14119,7 @@
14030
14119
  "immutable": true,
14031
14120
  "locationInModule": {
14032
14121
  "filename": "src/providers/fargate.ts",
14033
- "line": 231
14122
+ "line": 232
14034
14123
  },
14035
14124
  "name": "LINUX_X64_DOCKERFILE_PATH",
14036
14125
  "static": true,
@@ -14047,7 +14136,7 @@
14047
14136
  "immutable": true,
14048
14137
  "locationInModule": {
14049
14138
  "filename": "src/providers/fargate.ts",
14050
- "line": 320
14139
+ "line": 321
14051
14140
  },
14052
14141
  "name": "assignPublicIp",
14053
14142
  "type": {
@@ -14062,7 +14151,7 @@
14062
14151
  "immutable": true,
14063
14152
  "locationInModule": {
14064
14153
  "filename": "src/providers/fargate.ts",
14065
- "line": 280
14154
+ "line": 281
14066
14155
  },
14067
14156
  "name": "cluster",
14068
14157
  "type": {
@@ -14077,7 +14166,7 @@
14077
14166
  "immutable": true,
14078
14167
  "locationInModule": {
14079
14168
  "filename": "src/providers/fargate.ts",
14080
- "line": 330
14169
+ "line": 331
14081
14170
  },
14082
14171
  "name": "connections",
14083
14172
  "overrides": "aws-cdk-lib.aws_ec2.IConnectable",
@@ -14094,7 +14183,7 @@
14094
14183
  "immutable": true,
14095
14184
  "locationInModule": {
14096
14185
  "filename": "src/providers/fargate.ts",
14097
- "line": 294
14186
+ "line": 295
14098
14187
  },
14099
14188
  "name": "container",
14100
14189
  "type": {
@@ -14109,7 +14198,7 @@
14109
14198
  "immutable": true,
14110
14199
  "locationInModule": {
14111
14200
  "filename": "src/providers/fargate.ts",
14112
- "line": 325
14201
+ "line": 326
14113
14202
  },
14114
14203
  "name": "grantPrincipal",
14115
14204
  "overrides": "aws-cdk-lib.aws_iam.IGrantable",
@@ -14127,7 +14216,7 @@
14127
14216
  "immutable": true,
14128
14217
  "locationInModule": {
14129
14218
  "filename": "src/providers/fargate.ts",
14130
- "line": 344
14219
+ "line": 345
14131
14220
  },
14132
14221
  "name": "image",
14133
14222
  "type": {
@@ -14142,7 +14231,7 @@
14142
14231
  "immutable": true,
14143
14232
  "locationInModule": {
14144
14233
  "filename": "src/providers/fargate.ts",
14145
- "line": 299
14234
+ "line": 300
14146
14235
  },
14147
14236
  "name": "labels",
14148
14237
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -14164,7 +14253,7 @@
14164
14253
  "immutable": true,
14165
14254
  "locationInModule": {
14166
14255
  "filename": "src/providers/fargate.ts",
14167
- "line": 351
14256
+ "line": 352
14168
14257
  },
14169
14258
  "name": "logGroup",
14170
14259
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -14180,7 +14269,7 @@
14180
14269
  "immutable": true,
14181
14270
  "locationInModule": {
14182
14271
  "filename": "src/providers/fargate.ts",
14183
- "line": 353
14272
+ "line": 354
14184
14273
  },
14185
14274
  "name": "retryableErrors",
14186
14275
  "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
@@ -14202,7 +14291,7 @@
14202
14291
  "immutable": true,
14203
14292
  "locationInModule": {
14204
14293
  "filename": "src/providers/fargate.ts",
14205
- "line": 337
14294
+ "line": 338
14206
14295
  },
14207
14296
  "name": "spot",
14208
14297
  "type": {
@@ -14218,7 +14307,7 @@
14218
14307
  "immutable": true,
14219
14308
  "locationInModule": {
14220
14309
  "filename": "src/providers/fargate.ts",
14221
- "line": 287
14310
+ "line": 288
14222
14311
  },
14223
14312
  "name": "task",
14224
14313
  "type": {
@@ -14234,7 +14323,7 @@
14234
14323
  "immutable": true,
14235
14324
  "locationInModule": {
14236
14325
  "filename": "src/providers/fargate.ts",
14237
- "line": 313
14326
+ "line": 314
14238
14327
  },
14239
14328
  "name": "subnetSelection",
14240
14329
  "optional": true,
@@ -14251,7 +14340,7 @@
14251
14340
  "immutable": true,
14252
14341
  "locationInModule": {
14253
14342
  "filename": "src/providers/fargate.ts",
14254
- "line": 306
14343
+ "line": 307
14255
14344
  },
14256
14345
  "name": "vpc",
14257
14346
  "optional": true,
@@ -14276,7 +14365,7 @@
14276
14365
  "kind": "interface",
14277
14366
  "locationInModule": {
14278
14367
  "filename": "src/providers/fargate.ts",
14279
- "line": 32
14368
+ "line": 33
14280
14369
  },
14281
14370
  "name": "FargateRunnerProviderProps",
14282
14371
  "properties": [
@@ -14291,7 +14380,7 @@
14291
14380
  "immutable": true,
14292
14381
  "locationInModule": {
14293
14382
  "filename": "src/providers/fargate.ts",
14294
- "line": 119
14383
+ "line": 120
14295
14384
  },
14296
14385
  "name": "assignPublicIp",
14297
14386
  "optional": true,
@@ -14309,7 +14398,7 @@
14309
14398
  "immutable": true,
14310
14399
  "locationInModule": {
14311
14400
  "filename": "src/providers/fargate.ts",
14312
- "line": 110
14401
+ "line": 111
14313
14402
  },
14314
14403
  "name": "cluster",
14315
14404
  "optional": true,
@@ -14328,7 +14417,7 @@
14328
14417
  "immutable": true,
14329
14418
  "locationInModule": {
14330
14419
  "filename": "src/providers/fargate.ts",
14331
- "line": 138
14420
+ "line": 139
14332
14421
  },
14333
14422
  "name": "cpu",
14334
14423
  "optional": true,
@@ -14347,7 +14436,7 @@
14347
14436
  "immutable": true,
14348
14437
  "locationInModule": {
14349
14438
  "filename": "src/providers/fargate.ts",
14350
- "line": 165
14439
+ "line": 166
14351
14440
  },
14352
14441
  "name": "ephemeralStorageGiB",
14353
14442
  "optional": true,
@@ -14366,7 +14455,7 @@
14366
14455
  "immutable": true,
14367
14456
  "locationInModule": {
14368
14457
  "filename": "src/providers/fargate.ts",
14369
- "line": 73
14458
+ "line": 74
14370
14459
  },
14371
14460
  "name": "group",
14372
14461
  "optional": true,
@@ -14385,7 +14474,7 @@
14385
14474
  "immutable": true,
14386
14475
  "locationInModule": {
14387
14476
  "filename": "src/providers/fargate.ts",
14388
- "line": 40
14477
+ "line": 41
14389
14478
  },
14390
14479
  "name": "imageBuilder",
14391
14480
  "optional": true,
@@ -14404,7 +14493,7 @@
14404
14493
  "immutable": true,
14405
14494
  "locationInModule": {
14406
14495
  "filename": "src/providers/fargate.ts",
14407
- "line": 48
14496
+ "line": 49
14408
14497
  },
14409
14498
  "name": "label",
14410
14499
  "optional": true,
@@ -14423,7 +14512,7 @@
14423
14512
  "immutable": true,
14424
14513
  "locationInModule": {
14425
14514
  "filename": "src/providers/fargate.ts",
14426
- "line": 59
14515
+ "line": 60
14427
14516
  },
14428
14517
  "name": "labels",
14429
14518
  "optional": true,
@@ -14447,7 +14536,7 @@
14447
14536
  "immutable": true,
14448
14537
  "locationInModule": {
14449
14538
  "filename": "src/providers/fargate.ts",
14450
- "line": 156
14539
+ "line": 157
14451
14540
  },
14452
14541
  "name": "memoryLimitMiB",
14453
14542
  "optional": true,
@@ -14466,7 +14555,7 @@
14466
14555
  "immutable": true,
14467
14556
  "locationInModule": {
14468
14557
  "filename": "src/providers/fargate.ts",
14469
- "line": 96
14558
+ "line": 97
14470
14559
  },
14471
14560
  "name": "securityGroup",
14472
14561
  "optional": true,
@@ -14484,7 +14573,7 @@
14484
14573
  "immutable": true,
14485
14574
  "locationInModule": {
14486
14575
  "filename": "src/providers/fargate.ts",
14487
- "line": 103
14576
+ "line": 104
14488
14577
  },
14489
14578
  "name": "securityGroups",
14490
14579
  "optional": true,
@@ -14508,7 +14597,7 @@
14508
14597
  "immutable": true,
14509
14598
  "locationInModule": {
14510
14599
  "filename": "src/providers/fargate.ts",
14511
- "line": 175
14600
+ "line": 176
14512
14601
  },
14513
14602
  "name": "spot",
14514
14603
  "optional": true,
@@ -14526,7 +14615,7 @@
14526
14615
  "immutable": true,
14527
14616
  "locationInModule": {
14528
14617
  "filename": "src/providers/fargate.ts",
14529
- "line": 87
14618
+ "line": 88
14530
14619
  },
14531
14620
  "name": "subnetSelection",
14532
14621
  "optional": true,
@@ -14544,7 +14633,7 @@
14544
14633
  "immutable": true,
14545
14634
  "locationInModule": {
14546
14635
  "filename": "src/providers/fargate.ts",
14547
- "line": 80
14636
+ "line": 81
14548
14637
  },
14549
14638
  "name": "vpc",
14550
14639
  "optional": true,
@@ -14647,7 +14736,7 @@
14647
14736
  },
14648
14737
  "locationInModule": {
14649
14738
  "filename": "src/runner.ts",
14650
- "line": 312
14739
+ "line": 317
14651
14740
  },
14652
14741
  "parameters": [
14653
14742
  {
@@ -14677,7 +14766,7 @@
14677
14766
  "kind": "class",
14678
14767
  "locationInModule": {
14679
14768
  "filename": "src/runner.ts",
14680
- "line": 282
14769
+ "line": 285
14681
14770
  },
14682
14771
  "methods": [
14683
14772
  {
@@ -14688,7 +14777,7 @@
14688
14777
  },
14689
14778
  "locationInModule": {
14690
14779
  "filename": "src/runner.ts",
14691
- "line": 921
14780
+ "line": 945
14692
14781
  },
14693
14782
  "name": "createLogsInsightsQueries",
14694
14783
  "parameters": [
@@ -14713,7 +14802,7 @@
14713
14802
  },
14714
14803
  "locationInModule": {
14715
14804
  "filename": "src/runner.ts",
14716
- "line": 897
14805
+ "line": 921
14717
14806
  },
14718
14807
  "name": "failedImageBuildsTopic",
14719
14808
  "parameters": [
@@ -14742,7 +14831,7 @@
14742
14831
  },
14743
14832
  "locationInModule": {
14744
14833
  "filename": "src/runner.ts",
14745
- "line": 873
14834
+ "line": 897
14746
14835
  },
14747
14836
  "name": "metricFailed",
14748
14837
  "parameters": [
@@ -14768,7 +14857,7 @@
14768
14857
  },
14769
14858
  "locationInModule": {
14770
14859
  "filename": "src/runner.ts",
14771
- "line": 817
14860
+ "line": 841
14772
14861
  },
14773
14862
  "name": "metricJobCompleted",
14774
14863
  "parameters": [
@@ -14794,7 +14883,7 @@
14794
14883
  },
14795
14884
  "locationInModule": {
14796
14885
  "filename": "src/runner.ts",
14797
- "line": 864
14886
+ "line": 888
14798
14887
  },
14799
14888
  "name": "metricSucceeded",
14800
14889
  "parameters": [
@@ -14820,7 +14909,7 @@
14820
14909
  },
14821
14910
  "locationInModule": {
14822
14911
  "filename": "src/runner.ts",
14823
- "line": 880
14912
+ "line": 904
14824
14913
  },
14825
14914
  "name": "metricTime",
14826
14915
  "parameters": [
@@ -14850,7 +14939,7 @@
14850
14939
  "immutable": true,
14851
14940
  "locationInModule": {
14852
14941
  "filename": "src/runner.ts",
14853
- "line": 298
14942
+ "line": 301
14854
14943
  },
14855
14944
  "name": "connections",
14856
14945
  "overrides": "aws-cdk-lib.aws_ec2.IConnectable",
@@ -14866,7 +14955,7 @@
14866
14955
  "immutable": true,
14867
14956
  "locationInModule": {
14868
14957
  "filename": "src/runner.ts",
14869
- "line": 286
14958
+ "line": 289
14870
14959
  },
14871
14960
  "name": "providers",
14872
14961
  "type": {
@@ -14895,7 +14984,7 @@
14895
14984
  "immutable": true,
14896
14985
  "locationInModule": {
14897
14986
  "filename": "src/runner.ts",
14898
- "line": 291
14987
+ "line": 294
14899
14988
  },
14900
14989
  "name": "secrets",
14901
14990
  "type": {
@@ -14909,7 +14998,7 @@
14909
14998
  "immutable": true,
14910
14999
  "locationInModule": {
14911
15000
  "filename": "src/runner.ts",
14912
- "line": 312
15001
+ "line": 317
14913
15002
  },
14914
15003
  "name": "props",
14915
15004
  "optional": true,
@@ -14931,7 +15020,7 @@
14931
15020
  "kind": "interface",
14932
15021
  "locationInModule": {
14933
15022
  "filename": "src/runner.ts",
14934
- "line": 44
15023
+ "line": 45
14935
15024
  },
14936
15025
  "name": "GitHubRunnersProps",
14937
15026
  "properties": [
@@ -14946,7 +15035,7 @@
14946
15035
  "immutable": true,
14947
15036
  "locationInModule": {
14948
15037
  "filename": "src/runner.ts",
14949
- "line": 91
15038
+ "line": 92
14950
15039
  },
14951
15040
  "name": "allowPublicSubnet",
14952
15041
  "optional": true,
@@ -14964,7 +15053,7 @@
14964
15053
  "immutable": true,
14965
15054
  "locationInModule": {
14966
15055
  "filename": "src/runner.ts",
14967
- "line": 137
15056
+ "line": 138
14968
15057
  },
14969
15058
  "name": "extraCertificates",
14970
15059
  "optional": true,
@@ -14983,7 +15072,7 @@
14983
15072
  "immutable": true,
14984
15073
  "locationInModule": {
14985
15074
  "filename": "src/runner.ts",
14986
- "line": 144
15075
+ "line": 145
14987
15076
  },
14988
15077
  "name": "idleTimeout",
14989
15078
  "optional": true,
@@ -15001,7 +15090,7 @@
15001
15090
  "immutable": true,
15002
15091
  "locationInModule": {
15003
15092
  "filename": "src/runner.ts",
15004
- "line": 151
15093
+ "line": 152
15005
15094
  },
15006
15095
  "name": "logOptions",
15007
15096
  "optional": true,
@@ -15020,7 +15109,7 @@
15020
15109
  "immutable": true,
15021
15110
  "locationInModule": {
15022
15111
  "filename": "src/runner.ts",
15023
- "line": 50
15112
+ "line": 51
15024
15113
  },
15025
15114
  "name": "providers",
15026
15115
  "optional": true,
@@ -15045,14 +15134,15 @@
15045
15134
  {
15046
15135
  "abstract": true,
15047
15136
  "docs": {
15048
- "remarks": "* The function receives the webhook payload along with default provider and its labels as {@link ProviderSelectorInput }\n* The function returns a selected provider and its labels as {@link ProviderSelectorResult }\n* You can decline to provision a runner by returning undefined as the provider selector result\n* You can fully customize the labels for the about-to-be-provisioned runner (add, remove, modify, dynamic labels, etc.)\n* Labels don't have to match the labels originally configured for the provider, but see warnings below\n* This function will be called synchronously during webhook processing, so it should be fast and efficient (webhook limit is 30 seconds total)\n\n**WARNING: It is your responsibility to ensure the selected provider's labels match the job's required labels. If you return the wrong labels, the runner will be created but GitHub Actions will not assign the job to it.**\n\n**WARNING: Provider selection is not a guarantee that a specific provider will be assigned for the job. GitHub Actions may assign the job to any runner with matching labels. The provider selector only determines which provider's runner will be *created*, but GitHub Actions may route the job to any available runner with the required labels.**\n\n**For reliable provider assignment based on job characteristics, consider using repo-level runner registration where you can control which runners are available for specific repositories. See {@link SETUP_GITHUB.md } for more details on the different registration levels. This information is also available while using the setup wizard.",
15137
+ "remarks": "* The function receives the webhook payload along with default provider and its labels as {@link ProviderSelectorInput }\n* The function returns a selected provider and its labels as {@link ProviderSelectorResult }\n* You can decline to provision a runner by returning undefined as the provider selector result\n* You can fully customize the labels for the about-to-be-provisioned runner (add, remove, modify, dynamic labels, etc.)\n* Labels don't have to match the labels originally configured for the provider, but see warnings below\n* This function will be called synchronously during webhook processing, so it should be fast and efficient (webhook limit is 30 seconds total)\n\n**WARNING: It is your responsibility to ensure the selected provider's labels match the job's required labels. If you return the wrong labels, the runner will be created but GitHub Actions will not assign the job to it.**\n\n**WARNING: Provider selection is not a guarantee that a specific provider will be assigned for the job. GitHub Actions may assign the job to any runner with matching labels. The provider selector only determines which provider's runner will be *created*, but GitHub Actions may route the job to any available runner with the required labels.**\n\n**For reliable provider assignment based on job characteristics, consider using repo-level runner registration where you can control which runners are available for specific repositories. This information is also available while using the setup wizard.",
15138
+ "see": "https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md",
15049
15139
  "stability": "experimental",
15050
15140
  "summary": "Optional Lambda function to customize provider selection logic and label assignment."
15051
15141
  },
15052
15142
  "immutable": true,
15053
15143
  "locationInModule": {
15054
15144
  "filename": "src/runner.ts",
15055
- "line": 206
15145
+ "line": 209
15056
15146
  },
15057
15147
  "name": "providerSelector",
15058
15148
  "optional": true,
@@ -15071,7 +15161,7 @@
15071
15161
  "immutable": true,
15072
15162
  "locationInModule": {
15073
15163
  "filename": "src/runner.ts",
15074
- "line": 59
15164
+ "line": 60
15075
15165
  },
15076
15166
  "name": "requireSelfHostedLabel",
15077
15167
  "optional": true,
@@ -15090,7 +15180,7 @@
15090
15180
  "immutable": true,
15091
15181
  "locationInModule": {
15092
15182
  "filename": "src/runner.ts",
15093
- "line": 188
15183
+ "line": 189
15094
15184
  },
15095
15185
  "name": "retryOptions",
15096
15186
  "optional": true,
@@ -15109,7 +15199,7 @@
15109
15199
  "immutable": true,
15110
15200
  "locationInModule": {
15111
15201
  "filename": "src/runner.ts",
15112
- "line": 100
15202
+ "line": 101
15113
15203
  },
15114
15204
  "name": "securityGroup",
15115
15205
  "optional": true,
@@ -15127,7 +15217,7 @@
15127
15217
  "immutable": true,
15128
15218
  "locationInModule": {
15129
15219
  "filename": "src/runner.ts",
15130
- "line": 109
15220
+ "line": 110
15131
15221
  },
15132
15222
  "name": "securityGroups",
15133
15223
  "optional": true,
@@ -15151,7 +15241,7 @@
15151
15241
  "immutable": true,
15152
15242
  "locationInModule": {
15153
15243
  "filename": "src/runner.ts",
15154
- "line": 158
15244
+ "line": 159
15155
15245
  },
15156
15246
  "name": "setupAccess",
15157
15247
  "optional": true,
@@ -15170,7 +15260,7 @@
15170
15260
  "immutable": true,
15171
15261
  "locationInModule": {
15172
15262
  "filename": "src/runner.ts",
15173
- "line": 177
15263
+ "line": 178
15174
15264
  },
15175
15265
  "name": "statusAccess",
15176
15266
  "optional": true,
@@ -15188,7 +15278,7 @@
15188
15278
  "immutable": true,
15189
15279
  "locationInModule": {
15190
15280
  "filename": "src/runner.ts",
15191
- "line": 75
15281
+ "line": 76
15192
15282
  },
15193
15283
  "name": "vpc",
15194
15284
  "optional": true,
@@ -15206,7 +15296,7 @@
15206
15296
  "immutable": true,
15207
15297
  "locationInModule": {
15208
15298
  "filename": "src/runner.ts",
15209
- "line": 82
15299
+ "line": 83
15210
15300
  },
15211
15301
  "name": "vpcSubnets",
15212
15302
  "optional": true,
@@ -15225,7 +15315,7 @@
15225
15315
  "immutable": true,
15226
15316
  "locationInModule": {
15227
15317
  "filename": "src/runner.ts",
15228
- "line": 170
15318
+ "line": 171
15229
15319
  },
15230
15320
  "name": "webhookAccess",
15231
15321
  "optional": true,
@@ -15250,19 +15340,19 @@
15250
15340
  "kind": "interface",
15251
15341
  "locationInModule": {
15252
15342
  "filename": "src/providers/common.ts",
15253
- "line": 525
15343
+ "line": 553
15254
15344
  },
15255
15345
  "methods": [
15256
15346
  {
15257
15347
  "abstract": true,
15258
15348
  "docs": {
15259
- "remarks": "Called by GithubRunners and shouldn't be called manually.",
15349
+ "remarks": "If the provider has multiple attempts, each attempt should be followed by a `Catch` that deletes the failed runner. Use\n{@link IRunnerRuntimeParameters.addCatchAndCleanUp} to add the catch.\n\nCalled by GithubRunners and shouldn't be called manually.",
15260
15350
  "stability": "experimental",
15261
15351
  "summary": "Generate step function tasks that execute the runner."
15262
15352
  },
15263
15353
  "locationInModule": {
15264
15354
  "filename": "src/providers/common.ts",
15265
- "line": 548
15355
+ "line": 579
15266
15356
  },
15267
15357
  "name": "getStepFunctionTask",
15268
15358
  "parameters": [
@@ -15272,7 +15362,7 @@
15272
15362
  },
15273
15363
  "name": "parameters",
15274
15364
  "type": {
15275
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
15365
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
15276
15366
  }
15277
15367
  }
15278
15368
  ],
@@ -15291,7 +15381,7 @@
15291
15381
  },
15292
15382
  "locationInModule": {
15293
15383
  "filename": "src/providers/common.ts",
15294
- "line": 556
15384
+ "line": 593
15295
15385
  },
15296
15386
  "name": "grantStateMachine",
15297
15387
  "parameters": [
@@ -15315,7 +15405,7 @@
15315
15405
  },
15316
15406
  "locationInModule": {
15317
15407
  "filename": "src/providers/common.ts",
15318
- "line": 563
15408
+ "line": 600
15319
15409
  },
15320
15410
  "name": "status",
15321
15411
  "parameters": [
@@ -15339,6 +15429,28 @@
15339
15429
  }
15340
15430
  }
15341
15431
  }
15432
+ },
15433
+ {
15434
+ "abstract": true,
15435
+ "docs": {
15436
+ "stability": "experimental",
15437
+ "summary": "Merged constants from all sub-providers for the single orchestrator `$.consts` pass. Duplicate keys across sub-providers must be avoided."
15438
+ },
15439
+ "locationInModule": {
15440
+ "filename": "src/providers/common.ts",
15441
+ "line": 585
15442
+ },
15443
+ "name": "stepFunctionConstants",
15444
+ "returns": {
15445
+ "type": {
15446
+ "collection": {
15447
+ "elementtype": {
15448
+ "primitive": "string"
15449
+ },
15450
+ "kind": "map"
15451
+ }
15452
+ }
15453
+ }
15342
15454
  }
15343
15455
  ],
15344
15456
  "name": "ICompositeProvider",
@@ -15353,7 +15465,7 @@
15353
15465
  "immutable": true,
15354
15466
  "locationInModule": {
15355
15467
  "filename": "src/providers/common.ts",
15356
- "line": 533
15468
+ "line": 561
15357
15469
  },
15358
15470
  "name": "labels",
15359
15471
  "type": {
@@ -15375,7 +15487,7 @@
15375
15487
  "immutable": true,
15376
15488
  "locationInModule": {
15377
15489
  "filename": "src/providers/common.ts",
15378
- "line": 539
15490
+ "line": 567
15379
15491
  },
15380
15492
  "name": "providers",
15381
15493
  "type": {
@@ -15471,7 +15583,7 @@
15471
15583
  "kind": "interface",
15472
15584
  "locationInModule": {
15473
15585
  "filename": "src/providers/common.ts",
15474
- "line": 406
15586
+ "line": 422
15475
15587
  },
15476
15588
  "name": "IRunnerAmiStatus",
15477
15589
  "properties": [
@@ -15484,7 +15596,7 @@
15484
15596
  "immutable": true,
15485
15597
  "locationInModule": {
15486
15598
  "filename": "src/providers/common.ts",
15487
- "line": 410
15599
+ "line": 426
15488
15600
  },
15489
15601
  "name": "launchTemplate",
15490
15602
  "type": {
@@ -15500,7 +15612,7 @@
15500
15612
  "immutable": true,
15501
15613
  "locationInModule": {
15502
15614
  "filename": "src/providers/common.ts",
15503
- "line": 415
15615
+ "line": 431
15504
15616
  },
15505
15617
  "name": "amiBuilderLogGroup",
15506
15618
  "optional": true,
@@ -15575,7 +15687,7 @@
15575
15687
  "kind": "interface",
15576
15688
  "locationInModule": {
15577
15689
  "filename": "src/providers/common.ts",
15578
- "line": 386
15690
+ "line": 402
15579
15691
  },
15580
15692
  "name": "IRunnerImageStatus",
15581
15693
  "properties": [
@@ -15588,7 +15700,7 @@
15588
15700
  "immutable": true,
15589
15701
  "locationInModule": {
15590
15702
  "filename": "src/providers/common.ts",
15591
- "line": 390
15703
+ "line": 406
15592
15704
  },
15593
15705
  "name": "imageRepository",
15594
15706
  "type": {
@@ -15604,7 +15716,7 @@
15604
15716
  "immutable": true,
15605
15717
  "locationInModule": {
15606
15718
  "filename": "src/providers/common.ts",
15607
- "line": 395
15719
+ "line": 411
15608
15720
  },
15609
15721
  "name": "imageTag",
15610
15722
  "type": {
@@ -15620,7 +15732,7 @@
15620
15732
  "immutable": true,
15621
15733
  "locationInModule": {
15622
15734
  "filename": "src/providers/common.ts",
15623
- "line": 400
15735
+ "line": 416
15624
15736
  },
15625
15737
  "name": "imageBuilderLogGroup",
15626
15738
  "optional": true,
@@ -15634,7 +15746,7 @@
15634
15746
  "@cloudsnorkel/cdk-github-runners.IRunnerProvider": {
15635
15747
  "assembly": "@cloudsnorkel/cdk-github-runners",
15636
15748
  "docs": {
15637
- "remarks": "Implementations create all required resources and return a step function task that starts those resources from {@link getStepFunctionTask}.",
15749
+ "remarks": "Implementations create all required resources and return a step function task that starts those resources from {@link getStepFunctionTask}.\n\nThis interface is not guaranteed to be stable. If you end up implementing your own provider, please let us know so we can consider changing that contract.",
15638
15750
  "stability": "experimental",
15639
15751
  "summary": "Interface for all runner providers."
15640
15752
  },
@@ -15647,7 +15759,7 @@
15647
15759
  "kind": "interface",
15648
15760
  "locationInModule": {
15649
15761
  "filename": "src/providers/common.ts",
15650
- "line": 471
15762
+ "line": 489
15651
15763
  },
15652
15764
  "methods": [
15653
15765
  {
@@ -15659,7 +15771,7 @@
15659
15771
  },
15660
15772
  "locationInModule": {
15661
15773
  "filename": "src/providers/common.ts",
15662
- "line": 502
15774
+ "line": 520
15663
15775
  },
15664
15776
  "name": "getStepFunctionTask",
15665
15777
  "parameters": [
@@ -15669,7 +15781,7 @@
15669
15781
  },
15670
15782
  "name": "parameters",
15671
15783
  "type": {
15672
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
15784
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
15673
15785
  }
15674
15786
  }
15675
15787
  ],
@@ -15688,7 +15800,7 @@
15688
15800
  },
15689
15801
  "locationInModule": {
15690
15802
  "filename": "src/providers/common.ts",
15691
- "line": 510
15803
+ "line": 538
15692
15804
  },
15693
15805
  "name": "grantStateMachine",
15694
15806
  "parameters": [
@@ -15712,7 +15824,7 @@
15712
15824
  },
15713
15825
  "locationInModule": {
15714
15826
  "filename": "src/providers/common.ts",
15715
- "line": 517
15827
+ "line": 545
15716
15828
  },
15717
15829
  "name": "status",
15718
15830
  "parameters": [
@@ -15731,6 +15843,30 @@
15731
15843
  "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerProviderStatus"
15732
15844
  }
15733
15845
  }
15846
+ },
15847
+ {
15848
+ "abstract": true,
15849
+ "docs": {
15850
+ "default": "`{}` β€” {@link BaseProvider } returns an empty object; override when needed (e.g. EC2 userdata template).",
15851
+ "remarks": "To use the constants in your provider, use `'$.consts.key'` as a path.",
15852
+ "stability": "experimental",
15853
+ "summary": "Static string constants injected once into the orchestrator execution input at `$.consts`. Use unique keys for dynamic values (e.g. include `this.node.path` in the key). Values must be plain strings known at synthesis time."
15854
+ },
15855
+ "locationInModule": {
15856
+ "filename": "src/providers/common.ts",
15857
+ "line": 530
15858
+ },
15859
+ "name": "stepFunctionConstants",
15860
+ "returns": {
15861
+ "type": {
15862
+ "collection": {
15863
+ "elementtype": {
15864
+ "primitive": "string"
15865
+ },
15866
+ "kind": "map"
15867
+ }
15868
+ }
15869
+ }
15734
15870
  }
15735
15871
  ],
15736
15872
  "name": "IRunnerProvider",
@@ -15745,7 +15881,7 @@
15745
15881
  "immutable": true,
15746
15882
  "locationInModule": {
15747
15883
  "filename": "src/providers/common.ts",
15748
- "line": 479
15884
+ "line": 497
15749
15885
  },
15750
15886
  "name": "labels",
15751
15887
  "type": {
@@ -15767,7 +15903,7 @@
15767
15903
  "immutable": true,
15768
15904
  "locationInModule": {
15769
15905
  "filename": "src/providers/common.ts",
15770
- "line": 486
15906
+ "line": 504
15771
15907
  },
15772
15908
  "name": "logGroup",
15773
15909
  "type": {
@@ -15784,7 +15920,7 @@
15784
15920
  "immutable": true,
15785
15921
  "locationInModule": {
15786
15922
  "filename": "src/providers/common.ts",
15787
- "line": 493
15923
+ "line": 511
15788
15924
  },
15789
15925
  "name": "retryableErrors",
15790
15926
  "type": {
@@ -15809,7 +15945,7 @@
15809
15945
  "kind": "interface",
15810
15946
  "locationInModule": {
15811
15947
  "filename": "src/providers/common.ts",
15812
- "line": 421
15948
+ "line": 437
15813
15949
  },
15814
15950
  "name": "IRunnerProviderStatus",
15815
15951
  "properties": [
@@ -15822,7 +15958,7 @@
15822
15958
  "immutable": true,
15823
15959
  "locationInModule": {
15824
15960
  "filename": "src/providers/common.ts",
15825
- "line": 430
15961
+ "line": 446
15826
15962
  },
15827
15963
  "name": "labels",
15828
15964
  "type": {
@@ -15843,7 +15979,7 @@
15843
15979
  "immutable": true,
15844
15980
  "locationInModule": {
15845
15981
  "filename": "src/providers/common.ts",
15846
- "line": 425
15982
+ "line": 441
15847
15983
  },
15848
15984
  "name": "type",
15849
15985
  "type": {
@@ -15859,7 +15995,7 @@
15859
15995
  "immutable": true,
15860
15996
  "locationInModule": {
15861
15997
  "filename": "src/providers/common.ts",
15862
- "line": 460
15998
+ "line": 476
15863
15999
  },
15864
16000
  "name": "ami",
15865
16001
  "optional": true,
@@ -15876,7 +16012,7 @@
15876
16012
  "immutable": true,
15877
16013
  "locationInModule": {
15878
16014
  "filename": "src/providers/common.ts",
15879
- "line": 435
16015
+ "line": 451
15880
16016
  },
15881
16017
  "name": "constructPath",
15882
16018
  "optional": true,
@@ -15893,7 +16029,7 @@
15893
16029
  "immutable": true,
15894
16030
  "locationInModule": {
15895
16031
  "filename": "src/providers/common.ts",
15896
- "line": 455
16032
+ "line": 471
15897
16033
  },
15898
16034
  "name": "image",
15899
16035
  "optional": true,
@@ -15910,7 +16046,7 @@
15910
16046
  "immutable": true,
15911
16047
  "locationInModule": {
15912
16048
  "filename": "src/providers/common.ts",
15913
- "line": 465
16049
+ "line": 481
15914
16050
  },
15915
16051
  "name": "logGroup",
15916
16052
  "optional": true,
@@ -15927,7 +16063,7 @@
15927
16063
  "immutable": true,
15928
16064
  "locationInModule": {
15929
16065
  "filename": "src/providers/common.ts",
15930
- "line": 450
16066
+ "line": 466
15931
16067
  },
15932
16068
  "name": "roleArn",
15933
16069
  "optional": true,
@@ -15944,7 +16080,7 @@
15944
16080
  "immutable": true,
15945
16081
  "locationInModule": {
15946
16082
  "filename": "src/providers/common.ts",
15947
- "line": 445
16083
+ "line": 461
15948
16084
  },
15949
16085
  "name": "securityGroups",
15950
16086
  "optional": true,
@@ -15966,7 +16102,7 @@
15966
16102
  "immutable": true,
15967
16103
  "locationInModule": {
15968
16104
  "filename": "src/providers/common.ts",
15969
- "line": 440
16105
+ "line": 456
15970
16106
  },
15971
16107
  "name": "vpcArn",
15972
16108
  "optional": true,
@@ -15977,42 +16113,222 @@
15977
16113
  ],
15978
16114
  "symbolId": "src/providers/common:IRunnerProviderStatus"
15979
16115
  },
15980
- "@cloudsnorkel/cdk-github-runners.ImageBuilderAsset": {
16116
+ "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters": {
15981
16117
  "assembly": "@cloudsnorkel/cdk-github-runners",
15982
- "datatype": true,
15983
16118
  "docs": {
16119
+ "remarks": "```sh\n./config.sh --unattended --url \"{REGISTRATION_URL}\" --token \"${RUNNER_TOKEN}\" --ephemeral --work _work --labels \"${RUNNER_LABEL}\" --name \"${RUNNER_NAME}\" --disableupdate\n```\n\nAll parameters are specified as step function paths and therefore must be used only in step function task parameters.",
15984
16120
  "stability": "experimental",
15985
- "summary": "An asset including file or directory to place inside the built image."
16121
+ "summary": "Workflow job parameters as parsed from the webhook event. Pass these into your runner executor and run something like:."
15986
16122
  },
15987
- "fqn": "@cloudsnorkel/cdk-github-runners.ImageBuilderAsset",
16123
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters",
15988
16124
  "kind": "interface",
15989
16125
  "locationInModule": {
15990
- "filename": "src/image-builders/aws-image-builder/builder.ts",
15991
- "line": 97
16126
+ "filename": "src/providers/common.ts",
16127
+ "line": 345
15992
16128
  },
15993
- "name": "ImageBuilderAsset",
15994
- "properties": [
16129
+ "methods": [
15995
16130
  {
15996
16131
  "abstract": true,
15997
16132
  "docs": {
16133
+ "remarks": "It is important to fully clean up after any failed runner provisioning. GitHub\nwill fail booting a new runner if the previous one with the same name is not\nfully cleaned up.",
15998
16134
  "stability": "experimental",
15999
- "summary": "Asset to place in the image."
16135
+ "summary": "Catches all errors and cleans up the failed runner from GitHub Actions."
16000
16136
  },
16001
- "immutable": true,
16002
16137
  "locationInModule": {
16003
- "filename": "src/image-builders/aws-image-builder/builder.ts",
16004
- "line": 106
16138
+ "filename": "src/providers/common.ts",
16139
+ "line": 391
16005
16140
  },
16006
- "name": "asset",
16007
- "type": {
16008
- "fqn": "aws-cdk-lib.aws_s3_assets.Asset"
16009
- }
16010
- },
16141
+ "name": "addCatchAndCleanUp",
16142
+ "parameters": [
16143
+ {
16144
+ "docs": {
16145
+ "summary": "state whose failures should trigger cleanup."
16146
+ },
16147
+ "name": "state",
16148
+ "type": {
16149
+ "union": {
16150
+ "types": [
16151
+ {
16152
+ "fqn": "aws-cdk-lib.aws_stepfunctions.TaskStateBase"
16153
+ },
16154
+ {
16155
+ "fqn": "aws-cdk-lib.aws_stepfunctions.Parallel"
16156
+ },
16157
+ {
16158
+ "fqn": "aws-cdk-lib.aws_stepfunctions.Map"
16159
+ }
16160
+ ]
16161
+ }
16162
+ }
16163
+ },
16164
+ {
16165
+ "docs": {
16166
+ "summary": "optional subgraph to run after cleanup."
16167
+ },
16168
+ "name": "next",
16169
+ "optional": true,
16170
+ "type": {
16171
+ "fqn": "aws-cdk-lib.aws_stepfunctions.IChainable"
16172
+ }
16173
+ }
16174
+ ]
16175
+ }
16176
+ ],
16177
+ "name": "IRunnerRuntimeParameters",
16178
+ "properties": [
16011
16179
  {
16012
16180
  "abstract": true,
16013
16181
  "docs": {
16182
+ "remarks": "Most of the time this will be github.com but for self-hosted GitHub instances, this will be different.",
16014
16183
  "stability": "experimental",
16015
- "summary": "Path to place asset in the image."
16184
+ "summary": "Path to GitHub domain."
16185
+ },
16186
+ "immutable": true,
16187
+ "locationInModule": {
16188
+ "filename": "src/providers/common.ts",
16189
+ "line": 359
16190
+ },
16191
+ "name": "githubDomainPath",
16192
+ "type": {
16193
+ "primitive": "string"
16194
+ }
16195
+ },
16196
+ {
16197
+ "abstract": true,
16198
+ "docs": {
16199
+ "stability": "experimental",
16200
+ "summary": "Path to comma-separated labels string to use for runner."
16201
+ },
16202
+ "immutable": true,
16203
+ "locationInModule": {
16204
+ "filename": "src/providers/common.ts",
16205
+ "line": 379
16206
+ },
16207
+ "name": "labelsPath",
16208
+ "type": {
16209
+ "primitive": "string"
16210
+ }
16211
+ },
16212
+ {
16213
+ "abstract": true,
16214
+ "docs": {
16215
+ "stability": "experimental",
16216
+ "summary": "Path to repository owner name."
16217
+ },
16218
+ "immutable": true,
16219
+ "locationInModule": {
16220
+ "filename": "src/providers/common.ts",
16221
+ "line": 364
16222
+ },
16223
+ "name": "ownerPath",
16224
+ "type": {
16225
+ "primitive": "string"
16226
+ }
16227
+ },
16228
+ {
16229
+ "abstract": true,
16230
+ "docs": {
16231
+ "stability": "experimental",
16232
+ "summary": "Repository or organization URL to register runner at."
16233
+ },
16234
+ "immutable": true,
16235
+ "locationInModule": {
16236
+ "filename": "src/providers/common.ts",
16237
+ "line": 374
16238
+ },
16239
+ "name": "registrationUrl",
16240
+ "type": {
16241
+ "primitive": "string"
16242
+ }
16243
+ },
16244
+ {
16245
+ "abstract": true,
16246
+ "docs": {
16247
+ "stability": "experimental",
16248
+ "summary": "Path to repository name."
16249
+ },
16250
+ "immutable": true,
16251
+ "locationInModule": {
16252
+ "filename": "src/providers/common.ts",
16253
+ "line": 369
16254
+ },
16255
+ "name": "repoPath",
16256
+ "type": {
16257
+ "primitive": "string"
16258
+ }
16259
+ },
16260
+ {
16261
+ "abstract": true,
16262
+ "docs": {
16263
+ "remarks": "We specifically set the name to make troubleshooting easier.",
16264
+ "stability": "experimental",
16265
+ "summary": "Path to desired runner name."
16266
+ },
16267
+ "immutable": true,
16268
+ "locationInModule": {
16269
+ "filename": "src/providers/common.ts",
16270
+ "line": 354
16271
+ },
16272
+ "name": "runnerNamePath",
16273
+ "type": {
16274
+ "primitive": "string"
16275
+ }
16276
+ },
16277
+ {
16278
+ "abstract": true,
16279
+ "docs": {
16280
+ "stability": "experimental",
16281
+ "summary": "Path to runner token used to register token."
16282
+ },
16283
+ "immutable": true,
16284
+ "locationInModule": {
16285
+ "filename": "src/providers/common.ts",
16286
+ "line": 349
16287
+ },
16288
+ "name": "runnerTokenPath",
16289
+ "type": {
16290
+ "primitive": "string"
16291
+ }
16292
+ }
16293
+ ],
16294
+ "symbolId": "src/providers/common:IRunnerRuntimeParameters"
16295
+ },
16296
+ "@cloudsnorkel/cdk-github-runners.ImageBuilderAsset": {
16297
+ "assembly": "@cloudsnorkel/cdk-github-runners",
16298
+ "datatype": true,
16299
+ "docs": {
16300
+ "stability": "experimental",
16301
+ "summary": "An asset including file or directory to place inside the built image."
16302
+ },
16303
+ "fqn": "@cloudsnorkel/cdk-github-runners.ImageBuilderAsset",
16304
+ "kind": "interface",
16305
+ "locationInModule": {
16306
+ "filename": "src/image-builders/aws-image-builder/builder.ts",
16307
+ "line": 97
16308
+ },
16309
+ "name": "ImageBuilderAsset",
16310
+ "properties": [
16311
+ {
16312
+ "abstract": true,
16313
+ "docs": {
16314
+ "stability": "experimental",
16315
+ "summary": "Asset to place in the image."
16316
+ },
16317
+ "immutable": true,
16318
+ "locationInModule": {
16319
+ "filename": "src/image-builders/aws-image-builder/builder.ts",
16320
+ "line": 106
16321
+ },
16322
+ "name": "asset",
16323
+ "type": {
16324
+ "fqn": "aws-cdk-lib.aws_s3_assets.Asset"
16325
+ }
16326
+ },
16327
+ {
16328
+ "abstract": true,
16329
+ "docs": {
16330
+ "stability": "experimental",
16331
+ "summary": "Path to place asset in the image."
16016
16332
  },
16017
16333
  "immutable": true,
16018
16334
  "locationInModule": {
@@ -16595,7 +16911,7 @@
16595
16911
  },
16596
16912
  "name": "parameters",
16597
16913
  "type": {
16598
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters"
16914
+ "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerRuntimeParameters"
16599
16915
  }
16600
16916
  }
16601
16917
  ],
@@ -16632,7 +16948,7 @@
16632
16948
  },
16633
16949
  "locationInModule": {
16634
16950
  "filename": "src/providers/common.ts",
16635
- "line": 613
16951
+ "line": 677
16636
16952
  },
16637
16953
  "name": "labelsFromProperties",
16638
16954
  "parameters": [
@@ -16699,6 +17015,28 @@
16699
17015
  "fqn": "@cloudsnorkel/cdk-github-runners.IRunnerProviderStatus"
16700
17016
  }
16701
17017
  }
17018
+ },
17019
+ {
17020
+ "docs": {
17021
+ "stability": "experimental",
17022
+ "summary": "Override to inject static strings into `$.consts` on the orchestrator state machine."
17023
+ },
17024
+ "locationInModule": {
17025
+ "filename": "src/providers/common.ts",
17026
+ "line": 673
17027
+ },
17028
+ "name": "stepFunctionConstants",
17029
+ "overrides": "@cloudsnorkel/cdk-github-runners.IRunnerProvider",
17030
+ "returns": {
17031
+ "type": {
17032
+ "collection": {
17033
+ "elementtype": {
17034
+ "primitive": "string"
17035
+ },
17036
+ "kind": "map"
17037
+ }
17038
+ }
17039
+ }
16702
17040
  }
16703
17041
  ],
16704
17042
  "name": "LambdaRunnerProvider",
@@ -17431,7 +17769,7 @@
17431
17769
  "kind": "interface",
17432
17770
  "locationInModule": {
17433
17771
  "filename": "src/runner.ts",
17434
- "line": 212
17772
+ "line": 215
17435
17773
  },
17436
17774
  "name": "LogOptions",
17437
17775
  "properties": [
@@ -17445,7 +17783,7 @@
17445
17783
  "immutable": true,
17446
17784
  "locationInModule": {
17447
17785
  "filename": "src/runner.ts",
17448
- "line": 223
17786
+ "line": 226
17449
17787
  },
17450
17788
  "name": "includeExecutionData",
17451
17789
  "optional": true,
@@ -17463,7 +17801,7 @@
17463
17801
  "immutable": true,
17464
17802
  "locationInModule": {
17465
17803
  "filename": "src/runner.ts",
17466
- "line": 230
17804
+ "line": 233
17467
17805
  },
17468
17806
  "name": "level",
17469
17807
  "optional": true,
@@ -17480,7 +17818,7 @@
17480
17818
  "immutable": true,
17481
17819
  "locationInModule": {
17482
17820
  "filename": "src/runner.ts",
17483
- "line": 216
17821
+ "line": 219
17484
17822
  },
17485
17823
  "name": "logGroupName",
17486
17824
  "optional": true,
@@ -17499,7 +17837,7 @@
17499
17837
  "immutable": true,
17500
17838
  "locationInModule": {
17501
17839
  "filename": "src/runner.ts",
17502
- "line": 239
17840
+ "line": 242
17503
17841
  },
17504
17842
  "name": "logRetention",
17505
17843
  "optional": true,
@@ -19562,139 +19900,6 @@
19562
19900
  ],
19563
19901
  "symbolId": "src/providers/common:RunnerProviderProps"
19564
19902
  },
19565
- "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters": {
19566
- "assembly": "@cloudsnorkel/cdk-github-runners",
19567
- "datatype": true,
19568
- "docs": {
19569
- "remarks": "```sh\n./config.sh --unattended --url \"{REGISTRATION_URL}\" --token \"${RUNNER_TOKEN}\" --ephemeral --work _work --labels \"${RUNNER_LABEL}\" --name \"${RUNNER_NAME}\" --disableupdate\n```\n\nAll parameters are specified as step function paths and therefore must be used only in step function task parameters.",
19570
- "stability": "experimental",
19571
- "summary": "Workflow job parameters as parsed from the webhook event. Pass these into your runner executor and run something like:."
19572
- },
19573
- "fqn": "@cloudsnorkel/cdk-github-runners.RunnerRuntimeParameters",
19574
- "kind": "interface",
19575
- "locationInModule": {
19576
- "filename": "src/providers/common.ts",
19577
- "line": 345
19578
- },
19579
- "name": "RunnerRuntimeParameters",
19580
- "properties": [
19581
- {
19582
- "abstract": true,
19583
- "docs": {
19584
- "remarks": "Most of the time this will be github.com but for self-hosted GitHub instances, this will be different.",
19585
- "stability": "experimental",
19586
- "summary": "Path to GitHub domain."
19587
- },
19588
- "immutable": true,
19589
- "locationInModule": {
19590
- "filename": "src/providers/common.ts",
19591
- "line": 359
19592
- },
19593
- "name": "githubDomainPath",
19594
- "type": {
19595
- "primitive": "string"
19596
- }
19597
- },
19598
- {
19599
- "abstract": true,
19600
- "docs": {
19601
- "stability": "experimental",
19602
- "summary": "Path to comma-separated labels string to use for runner."
19603
- },
19604
- "immutable": true,
19605
- "locationInModule": {
19606
- "filename": "src/providers/common.ts",
19607
- "line": 379
19608
- },
19609
- "name": "labelsPath",
19610
- "type": {
19611
- "primitive": "string"
19612
- }
19613
- },
19614
- {
19615
- "abstract": true,
19616
- "docs": {
19617
- "stability": "experimental",
19618
- "summary": "Path to repository owner name."
19619
- },
19620
- "immutable": true,
19621
- "locationInModule": {
19622
- "filename": "src/providers/common.ts",
19623
- "line": 364
19624
- },
19625
- "name": "ownerPath",
19626
- "type": {
19627
- "primitive": "string"
19628
- }
19629
- },
19630
- {
19631
- "abstract": true,
19632
- "docs": {
19633
- "stability": "experimental",
19634
- "summary": "Repository or organization URL to register runner at."
19635
- },
19636
- "immutable": true,
19637
- "locationInModule": {
19638
- "filename": "src/providers/common.ts",
19639
- "line": 374
19640
- },
19641
- "name": "registrationUrl",
19642
- "type": {
19643
- "primitive": "string"
19644
- }
19645
- },
19646
- {
19647
- "abstract": true,
19648
- "docs": {
19649
- "stability": "experimental",
19650
- "summary": "Path to repository name."
19651
- },
19652
- "immutable": true,
19653
- "locationInModule": {
19654
- "filename": "src/providers/common.ts",
19655
- "line": 369
19656
- },
19657
- "name": "repoPath",
19658
- "type": {
19659
- "primitive": "string"
19660
- }
19661
- },
19662
- {
19663
- "abstract": true,
19664
- "docs": {
19665
- "remarks": "We specifically set the name to make troubleshooting easier.",
19666
- "stability": "experimental",
19667
- "summary": "Path to desired runner name."
19668
- },
19669
- "immutable": true,
19670
- "locationInModule": {
19671
- "filename": "src/providers/common.ts",
19672
- "line": 354
19673
- },
19674
- "name": "runnerNamePath",
19675
- "type": {
19676
- "primitive": "string"
19677
- }
19678
- },
19679
- {
19680
- "abstract": true,
19681
- "docs": {
19682
- "stability": "experimental",
19683
- "summary": "Path to runner token used to register token."
19684
- },
19685
- "immutable": true,
19686
- "locationInModule": {
19687
- "filename": "src/providers/common.ts",
19688
- "line": 349
19689
- },
19690
- "name": "runnerTokenPath",
19691
- "type": {
19692
- "primitive": "string"
19693
- }
19694
- }
19695
- ],
19696
- "symbolId": "src/providers/common:RunnerRuntimeParameters"
19697
- },
19698
19903
  "@cloudsnorkel/cdk-github-runners.RunnerVersion": {
19699
19904
  "assembly": "@cloudsnorkel/cdk-github-runners",
19700
19905
  "docs": {
@@ -19823,8 +20028,8 @@
19823
20028
  "assembly": "@cloudsnorkel/cdk-github-runners",
19824
20029
  "base": "constructs.Construct",
19825
20030
  "docs": {
19826
- "example": "// Rate: fill every 12 hours\nnew ScheduledWarmRunner(stack, 'Every 12 Hours', {\n runners,\n provider: myProvider,\n count: 2,\n owner: 'my-org',\n repo: 'my-repo',\n schedule: events.Schedule.rate(cdk.Duration.hours(5)),\n duration: cdk.Duration.hours(12),\n});",
19827
- "remarks": "Runners will be provisioned using the specified provider and registered in the specified repository or organization.\n\nRegistration level must match the one selected during setup. See {@link SETUP_GITHUB.md } for more information on the selection.\n\n## Limitations\n\n- **No deployment-fill**: Unlike `AlwaysOnWarmRunner`, scheduled warm runners do not get an initial\n fill on deploy. The first fill happens at the next schedule occurrence. If you deploy at 1pm for\n a 2pm schedule, runners will not appear until 2pm.\n- Jobs will still trigger provisioning of on-demand runners, even if a warm runner ends up being used.\n- You may briefly see more than `count` runners when changing config or at rotation.\n- To remove: set `count` to 0, deploy, wait for warm runners to stop, then remove and deploy again.\n If you don't follow this procedure, warm runners may linger until they expire.\n- Provider failures or timeouts (like Lambda provider timing out after 15 minutes) will result in a\n gap in coverage until the retry succeeds. Current retry mechanism has built-in back-off rate and\n can be tweaked using `retryOptions`. This will be improved in the future.",
20031
+ "remarks": "Runners will be provisioned using the specified provider and registered in the specified repository or organization.\n\nRegistration level must match the one selected during setup.",
20032
+ "see": "https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md\n\n## Limitations\n\n- **No deployment-fill**: Unlike `AlwaysOnWarmRunner`, scheduled warm runners do not get an initial\nfill on deploy. The first fill happens at the next schedule occurrence. If you deploy at 1pm for\na 2pm schedule, runners will not appear until 2pm.\n- Jobs will still trigger provisioning of on-demand runners, even if a warm runner ends up being used.\n- You may briefly see more than `count` runners when changing config or at rotation.\n- To remove: set `count` to 0, deploy, wait for warm runners to stop, then remove and deploy again.\nIf you don't follow this procedure, warm runners may linger until they expire.\n- Provider failures or timeouts (like Lambda provider timing out after 15 minutes) will result in a\ngap in coverage until the retry succeeds. Current retry mechanism has built-in back-off rate and\ncan be tweaked using `retryOptions`. This will be improved in the future.\n\n```typescript\n// Cron: fill at 1pm on weekdays\nnew ScheduledWarmRunner(stack, 'Business Hours', {\nrunners,\nprovider: myProvider,\ncount: 3,\nowner: 'my-org',\nrepo: 'my-repo',\nschedule: events.Schedule.cron({ hour: '13', minute: '0', weekDay: 'MON-FRI' }),\nduration: cdk.Duration.hours(2),\n});\n```\n\n```typescript\n// Rate: fill every 12 hours\nnew ScheduledWarmRunner(stack, 'Every 12 Hours', {\nrunners,\nprovider: myProvider,\ncount: 2,\nowner: 'my-org',\nrepo: 'my-repo',\nschedule: events.Schedule.rate(cdk.Duration.hours(5)),\nduration: cdk.Duration.hours(12),\n});\n```",
19828
20033
  "stability": "experimental",
19829
20034
  "summary": "Warm runners active during a time window specified by start time (`schedule`) and duration (`duration`)."
19830
20035
  },
@@ -19835,7 +20040,7 @@
19835
20040
  },
19836
20041
  "locationInModule": {
19837
20042
  "filename": "src/warm-runner.ts",
19838
- "line": 275
20043
+ "line": 283
19839
20044
  },
19840
20045
  "parameters": [
19841
20046
  {
@@ -19861,7 +20066,7 @@
19861
20066
  "kind": "class",
19862
20067
  "locationInModule": {
19863
20068
  "filename": "src/warm-runner.ts",
19864
- "line": 268
20069
+ "line": 276
19865
20070
  },
19866
20071
  "name": "ScheduledWarmRunner",
19867
20072
  "symbolId": "src/warm-runner:ScheduledWarmRunner"
@@ -19877,7 +20082,7 @@
19877
20082
  "kind": "interface",
19878
20083
  "locationInModule": {
19879
20084
  "filename": "src/warm-runner.ts",
19880
- "line": 63
20085
+ "line": 64
19881
20086
  },
19882
20087
  "name": "ScheduledWarmRunnerProps",
19883
20088
  "properties": [
@@ -19907,7 +20112,7 @@
19907
20112
  "immutable": true,
19908
20113
  "locationInModule": {
19909
20114
  "filename": "src/warm-runner.ts",
19910
- "line": 73
20115
+ "line": 74
19911
20116
  },
19912
20117
  "name": "duration",
19913
20118
  "type": {
@@ -19981,7 +20186,7 @@
19981
20186
  "immutable": true,
19982
20187
  "locationInModule": {
19983
20188
  "filename": "src/warm-runner.ts",
19984
- "line": 67
20189
+ "line": 68
19985
20190
  },
19986
20191
  "name": "schedule",
19987
20192
  "type": {
@@ -19992,14 +20197,15 @@
19992
20197
  "abstract": true,
19993
20198
  "docs": {
19994
20199
  "default": "'repo'",
19995
- "remarks": "Choose\n'org' for org-wide runners, 'repo' for repo-level. See the setup wizard or\n{@link SETUP_GITHUB.md } for choosing repo vs org.",
20200
+ "remarks": "Choose\n'org' for org-wide runners, 'repo' for repo-level. See the setup wizard for choosing repo vs org.",
20201
+ "see": "https://github.com/CloudSnorkel/cdk-github-runners/blob/main/SETUP_GITHUB.md",
19996
20202
  "stability": "experimental",
19997
20203
  "summary": "Registration level β€” must match how your runners are set up in GitHub."
19998
20204
  },
19999
20205
  "immutable": true,
20000
20206
  "locationInModule": {
20001
20207
  "filename": "src/warm-runner.ts",
20002
- "line": 47
20208
+ "line": 48
20003
20209
  },
20004
20210
  "name": "registrationLevel",
20005
20211
  "optional": true,
@@ -20017,7 +20223,7 @@
20017
20223
  "immutable": true,
20018
20224
  "locationInModule": {
20019
20225
  "filename": "src/warm-runner.ts",
20020
- "line": 52
20226
+ "line": 53
20021
20227
  },
20022
20228
  "name": "repo",
20023
20229
  "optional": true,
@@ -20285,7 +20491,7 @@
20285
20491
  "kind": "interface",
20286
20492
  "locationInModule": {
20287
20493
  "filename": "src/providers/common.ts",
20288
- "line": 569
20494
+ "line": 626
20289
20495
  },
20290
20496
  "name": "StorageOptions",
20291
20497
  "properties": [
@@ -20301,7 +20507,7 @@
20301
20507
  "immutable": true,
20302
20508
  "locationInModule": {
20303
20509
  "filename": "src/providers/common.ts",
20304
- "line": 590
20510
+ "line": 647
20305
20511
  },
20306
20512
  "name": "iops",
20307
20513
  "optional": true,
@@ -20320,7 +20526,7 @@
20320
20526
  "immutable": true,
20321
20527
  "locationInModule": {
20322
20528
  "filename": "src/providers/common.ts",
20323
- "line": 598
20529
+ "line": 655
20324
20530
  },
20325
20531
  "name": "throughput",
20326
20532
  "optional": true,
@@ -20339,7 +20545,7 @@
20339
20545
  "immutable": true,
20340
20546
  "locationInModule": {
20341
20547
  "filename": "src/providers/common.ts",
20342
- "line": 576
20548
+ "line": 633
20343
20549
  },
20344
20550
  "name": "volumeType",
20345
20551
  "optional": true,
@@ -20361,7 +20567,7 @@
20361
20567
  "kind": "interface",
20362
20568
  "locationInModule": {
20363
20569
  "filename": "src/providers/composite.ts",
20364
- "line": 8
20570
+ "line": 15
20365
20571
  },
20366
20572
  "name": "WeightedRunnerProvider",
20367
20573
  "properties": [
@@ -20374,7 +20580,7 @@
20374
20580
  "immutable": true,
20375
20581
  "locationInModule": {
20376
20582
  "filename": "src/providers/composite.ts",
20377
- "line": 12
20583
+ "line": 19
20378
20584
  },
20379
20585
  "name": "provider",
20380
20586
  "type": {
@@ -20391,7 +20597,7 @@
20391
20597
  "immutable": true,
20392
20598
  "locationInModule": {
20393
20599
  "filename": "src/providers/composite.ts",
20394
- "line": 18
20600
+ "line": 25
20395
20601
  },
20396
20602
  "name": "weight",
20397
20603
  "type": {
@@ -20648,6 +20854,6 @@
20648
20854
  "symbolId": "src/image-builders/aws-image-builder/deprecated/windows-components:WindowsComponents"
20649
20855
  }
20650
20856
  },
20651
- "version": "0.15.0",
20652
- "fingerprint": "lsUpiDAUxBKg7ICWZtaUHMCTYUR+KKujy9bIS462qas="
20857
+ "version": "0.15.1",
20858
+ "fingerprint": "Lk71dLShH+PMTMKLmjAt9sGKRlpS0gynnpicSme5Dts="
20653
20859
  }