Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
7f4073f
feat(runner-config): add provider-aware runner configuration
edersonbrilhante Sep 3, 2026
160ac79
refactor(runner-config): use canonical nested settings
edersonbrilhante Sep 3, 2026
261d123
docs: auto update terraform docs
github-actions[bot] Sep 3, 2026
ac90552
docs: auto update terraform docs
github-actions[bot] Sep 9, 2026
d4825da
refactor(runner-config): align GitHub configuration contract
edersonbrilhante Sep 10, 2026
03c0691
Revert "refactor(runner-config): align GitHub configuration contract"
edersonbrilhante Sep 10, 2026
6b4f255
fix(multi-runner): route v1 and v2 runners separately
edersonbrilhante Sep 3, 2026
d094324
docs: auto update terraform docs
github-actions[bot] Sep 3, 2026
00f3edc
fix(runner-config): allow missing installation IDs
edersonbrilhante Sep 9, 2026
76c6108
docs: auto update terraform docs
github-actions[bot] Sep 9, 2026
6869b66
fix(multi-runner): adapt v2 GitHub app parameters
edersonbrilhante Sep 10, 2026
9df266b
fix(runner-config): restore required installation IDs
edersonbrilhante Sep 10, 2026
a3e382a
fix(webhook): require installation ID parameter lists
edersonbrilhante Sep 10, 2026
9426a34
docs: auto update terraform docs
github-actions[bot] Sep 10, 2026
3e9ea4f
test(runner-config): cover additional app installation IDs
edersonbrilhante Sep 10, 2026
873b980
docs: auto update terraform docs
github-actions[bot] Sep 10, 2026
47fb103
test(runner-config): keep additional app fixture focused
edersonbrilhante Sep 10, 2026
47625db
docs: auto update terraform docs
github-actions[bot] Sep 10, 2026
94d5cf2
fix(multi-runner): make v2 inputs independent
edersonbrilhante Sep 4, 2026
ce26906
docs: auto update terraform docs
github-actions[bot] Sep 4, 2026
aff90b7
fix(multi-runner): validate v1 and v2 inputs
edersonbrilhante Sep 4, 2026
89a4f09
docs: auto update terraform docs
github-actions[bot] Sep 4, 2026
13cac30
fix(multi-runner): centralize input validation
edersonbrilhante Sep 4, 2026
ea01f2d
docs(multi-runner): document Terraform 1.4 requirement
edersonbrilhante Sep 4, 2026
6162f8c
test(multi-runner): isolate v2 fixture inputs
edersonbrilhante Sep 4, 2026
8e09c0c
docs: auto update terraform docs
github-actions[bot] Sep 8, 2026
ff5dc9a
fix(multi-runner): remove experimental v2 input prefixes
edersonbrilhante Sep 8, 2026
74c0833
test(multi-runner): remove v2 feature acknowledgement
edersonbrilhante Sep 8, 2026
bc60c58
chore(multi-runner): track linux provider checksums
edersonbrilhante Sep 8, 2026
a18bb90
docs: auto update terraform docs
github-actions[bot] Sep 8, 2026
5862cab
docs: auto update terraform docs
github-actions[bot] Sep 9, 2026
1813a14
test(multi-runner): acknowledge experimental v2 feature
edersonbrilhante Sep 9, 2026
ef8a4f0
test(multi-runner): scope v2 feature acknowledgement to v2 tests
edersonbrilhante Sep 9, 2026
8864d5d
fix(multi-runner): adapt GitHub app parameters for v2
edersonbrilhante Sep 9, 2026
4d6d39b
feat(examples): add multi-runner-v2 configuration
edersonbrilhante Sep 4, 2026
aa11ff0
docs: auto update terraform docs
github-actions[bot] Sep 4, 2026
48dd190
fix(examples): rely on v2 module inputs
edersonbrilhante Sep 4, 2026
8fdb59f
chore(examples): require Terraform 1.4
edersonbrilhante Sep 4, 2026
277f58c
docs: auto update terraform docs
github-actions[bot] Sep 4, 2026
6c88dd6
docs(examples): require Terraform 1.4
edersonbrilhante Sep 4, 2026
1b3693b
test(ministack): cover multi-runner-v2 example
edersonbrilhante Sep 8, 2026
fc1d900
fix(examples): remove experimental v2 input prefixes
edersonbrilhante Sep 8, 2026
fb51c4f
fix(examples): track linux provider checksums
edersonbrilhante Sep 8, 2026
eba84b9
fix(ministack): configure v2 AMIs through Terraform variables
edersonbrilhante Sep 9, 2026
23fe569
fix(ministack): shorten multi-runner v2 prefix
edersonbrilhante Sep 10, 2026
8e5bfe0
fix(ministack): use localhost endpoint
edersonbrilhante Sep 10, 2026
7976e29
fix(ministack): use localhost in workflow endpoint
edersonbrilhante Sep 10, 2026
c4a8c4a
feat(compute-providers): add Lambda MicroVM Terraform provider
edersonbrilhante Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .github/workflows/ministack.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ env:
AWS_ACCESS_KEY_ID: "000000000000"
AWS_DEFAULT_REGION: eu-west-1
AWS_EC2_METADATA_DISABLED: "true"
AWS_ENDPOINT_URL: http://127.0.0.1:4566
AWS_ENDPOINT_URL: http://localhost:4566
AWS_REGION: eu-west-1
AWS_SECRET_ACCESS_KEY: test-only
TF_IN_AUTOMATION: "true"
Expand All @@ -53,6 +53,7 @@ jobs:
- default
- ephemeral
- multi-runner
- multi-runner-v2
- termination-watcher
terraform:
- "1.4.0"
Expand Down
5 changes: 5 additions & 0 deletions .github/workflows/terraform.yml
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,8 @@ jobs:
"download-lambda",
"lambda",
"multi-runner",
"compute-providers/aws/microvm",
"compute-providers/aws/microvm/trust-policy",
"runner-binaries-syncer",
"runners",
"setup-iam-permissions",
Expand Down Expand Up @@ -155,6 +157,7 @@ jobs:
"ephemeral",
"termination-watcher",
"multi-runner",
"multi-runner-v2",
"external-managed-ssm-secrets"
]
defaults:
Expand Down Expand Up @@ -215,6 +218,8 @@ jobs:
module:
- modules/runners
- modules/multi-runner
- modules/compute-providers/aws/microvm
- modules/compute-providers/aws/microvm/trust-policy
defaults:
run:
working-directory: ${{ matrix.module }}
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ Join our discord community via [this invite link](https://discord.gg/bxgXW8jJGh)
| <a name="input_runners_scale_up_lambda_memory_size"></a> [runners\_scale\_up\_lambda\_memory\_size](#input\_runners\_scale\_up\_lambda\_memory\_size) | Memory size limit in MB for scale-up lambda. | `number` | `512` | no |
| <a name="input_runners_scale_up_lambda_timeout"></a> [runners\_scale\_up\_lambda\_timeout](#input\_runners\_scale\_up\_lambda\_timeout) | Time out for the scale up lambda in seconds. | `number` | `30` | no |
| <a name="input_runners_ssm_housekeeper"></a> [runners\_ssm\_housekeeper](#input\_runners\_ssm\_housekeeper) | Configuration for the SSM housekeeper lambda. This lambda deletes token / JIT config from SSM.<br/><br/> `schedule_expression`: is used to configure the schedule for the lambda.<br/> `enabled`: enable or disable the lambda trigger via the EventBridge.<br/> `lambda_memory_size`: lambda memory size limit.<br/> `lambda_timeout`: timeout for the lambda in seconds.<br/> `config`: configuration for the lambda function. Token path will be read by default from the module. | <pre>object({<br/> schedule_expression = optional(string, "rate(1 day)")<br/> enabled = optional(bool, true)<br/> lambda_memory_size = optional(number, 512)<br/> lambda_timeout = optional(number, 60)<br/> config = object({<br/> tokenPath = optional(string)<br/> minimumDaysOld = optional(number, 1)<br/> dryRun = optional(bool, false)<br/> })<br/> })</pre> | <pre>{<br/> "config": {}<br/>}</pre> | no |
| <a name="input_scale_down_idle_confirmation_seconds"></a> [scale\_down\_idle\_confirmation\_seconds](#input\_scale\_down\_idle\_confirmation\_seconds) | Number of seconds a runner must consistently report not-busy before scale-down terminates it. GitHub's busy flag can be stale (it can read false for a runner that is actively executing a job), so a single not-busy reading is not sufficient evidence a runner is idle. Set to at least one scale-down schedule interval to require two consecutive not-busy evaluations; a busy reading resets the window. 0 keeps the previous single-reading behaviour. | `number` | `0` | no |
| <a name="input_scale_down_schedule_expression"></a> [scale\_down\_schedule\_expression](#input\_scale\_down\_schedule\_expression) | Scheduler expression to check every x for scale down. | `string` | `"cron(*/5 * * * ? *)"` | no |
| <a name="input_scale_errors"></a> [scale\_errors](#input\_scale\_errors) | List of AWS error codes that should trigger retry during scale up. This list replaces the module default scale-up retry errors | `list(string)` | <pre>[<br/> "UnfulfillableCapacity",<br/> "MaxSpotInstanceCountExceeded",<br/> "TargetCapacityLimitExceededException",<br/> "RequestLimitExceeded",<br/> "ResourceLimitExceeded",<br/> "MaxSpotInstanceCountExceeded",<br/> "MaxSpotFleetRequestCountExceeded",<br/> "InsufficientInstanceCapacity",<br/> "InsufficientCapacityOnHost"<br/>]</pre> | no |
| <a name="input_scale_up_reserved_concurrent_executions"></a> [scale\_up\_reserved\_concurrent\_executions](#input\_scale\_up\_reserved\_concurrent\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no |
Expand Down
1 change: 1 addition & 0 deletions docs/examples/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ Examples are located in the [examples](https://github.com/github-aws-runners/ter
- _[Default](default.md)_: The default example of the module
- _[Ephemeral](ephemeral.md)_: Example usages of ephemeral runners based on the default example.
- _[Multi Runner](multi-runner.md)_ : Example usage of creating a multi runner which creates multiple runners/ configurations with a single deployment. The examples including: "arm64", "windows", and "ubuntu" runners.
- _[Multi Runner v2](multi-runner-v2.md)_ : Example usage of the experimental v2 multi-runner configuration interface with shared defaults and per-lane overrides.
- _[Permissions boundary](permissions-boundary.md)_: Example usages of permissions boundaries.
- _[Prebuilt Images](prebuilt.md)_: Example usages of deploying runners with a custom prebuilt image.
- _[Termination watcher](termination-watcher.md)_: Example usages of termination watcher.
Expand Down
1 change: 1 addition & 0 deletions docs/examples/multi-runner-v2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
--8<-- "examples/multi-runner-v2/README.md"
93 changes: 93 additions & 0 deletions examples/multi-runner-v2/.terraform.lock.hcl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

77 changes: 77 additions & 0 deletions examples/multi-runner-v2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
# Multi-runner v2 example

This example demonstrates the experimental multi-runner v2 interface. Shared
defaults are configured with `global_config*` variables, while
each runner lane uses `multi_runner_config` for its matcher,
runner lifecycle, and compute-provider settings.

The example creates three lanes from one deployment:

- Linux ARM64 Amazon Linux runners.
- Ephemeral Linux x64 Amazon Linux runners with job retry enabled.
- Windows x64 Server Core 2022 runners.

The v2 interface keeps provider-owned settings inside the selected provider
configuration. For example, VPC and subnet settings are under
`global_config_compute_provider.aws.ec2`, while the per-lane
instance types and AMI configuration are under each lane's compute provider
block. The optional `ami` variable can provide per-lane AMI filters and owners,
which is useful for test environments with locally registered images.

Configure the GitHub App variables before applying:

```bash
terraform init
terraform apply \
-var='github_app={id="123456",key_base64="..."}'
```

The `github_app` value is sensitive and should be supplied through a secure
variable source in real deployments rather than committed to configuration.

<!-- BEGIN_TF_DOCS -->
## Requirements

| Name | Version |
|------|---------|
| <a name="requirement_terraform"></a> [terraform](#requirement\_terraform) | >= 1.4.0 |
| <a name="requirement_aws"></a> [aws](#requirement\_aws) | >= 6.33 |
| <a name="requirement_local"></a> [local](#requirement\_local) | ~> 2.0 |
| <a name="requirement_random"></a> [random](#requirement\_random) | ~> 3.0 |

## Providers

| Name | Version |
|------|---------|
| <a name="provider_random"></a> [random](#provider\_random) | 3.9.0 |

## Modules

| Name | Source | Version |
|------|--------|---------|
| <a name="module_base"></a> [base](#module\_base) | ../base | n/a |
| <a name="module_runners"></a> [runners](#module\_runners) | ../../modules/multi-runner | n/a |
| <a name="module_webhook_github_app"></a> [webhook\_github\_app](#module\_webhook\_github\_app) | ../../modules/webhook-github-app | n/a |

## Resources

| Name | Type |
|------|------|
| [random_id.random](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/id) | resource |

## Inputs

| Name | Description | Type | Default | Required |
|------|-------------|------|---------|:--------:|
| <a name="input_ami"></a> [ami](#input\_ami) | Optional AMI configuration keyed by runner lane. | <pre>map(object({<br/> filter = optional(map(list(string)), { state = ["available"] })<br/> owners = optional(list(string), ["amazon"])<br/> id_ssm_parameter = optional(object({<br/> arn = string<br/> }), null)<br/> kms_key = optional(object({<br/> arn = string<br/> }), null)<br/> }))</pre> | `{}` | no |
| <a name="input_aws_region"></a> [aws\_region](#input\_aws\_region) | AWS region to deploy to. | `string` | `"eu-west-1"` | no |
| <a name="input_environment"></a> [environment](#input\_environment) | Environment name, used as prefix. | `string` | `null` | no |
| <a name="input_github_app"></a> [github\_app](#input\_github\_app) | GitHub App ID and base64-encoded private key. | <pre>object({<br/> id = string<br/> key_base64 = string<br/> })</pre> | n/a | yes |

## Outputs

| Name | Description |
|------|-------------|
| <a name="output_webhook_endpoint"></a> [webhook\_endpoint](#output\_webhook\_endpoint) | n/a |
| <a name="output_webhook_secret"></a> [webhook\_secret](#output\_webhook\_secret) | n/a |
<!-- END_TF_DOCS -->
Loading