Skip to content

Restore fixed runner sizing to unblock module publication - #267

Merged
ravion-ops[bot] merged 1 commit into
mainfrom
devin/1793466700-unblock-module-publish
Oct 31, 2026
Merged

ravion-ops[bot] merged 1 commit into
mainfrom
devin/1793466700-unblock-module-publish

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 31, 2026 •

Copy link
Copy Markdown
Contributor
  • In merge queue / Merged
  • Prioritize

Summary

Before: module publication never starts: automatic sizing’s historical-run lookup exceeds the webhook’s ~30-second deadline. Both the original job and one retry remain queued without a runner. Consequently the worker version from #253 is unavailable and Tower config #8985 cannot plan.

After: only the release publisher returns to its previous fixed 2 vCPU / 4 GiB runner. Removing CPU/memory/disk autosizing avoids that lookup; disk uses the fixed-shape default. Disk caching and non-interruptible execution remain enabled. No validation, publication, permission, or secret settings change; other jobs retain automatic sizing.

This is publication recovery, not a fix for the underlying autosizing query. It adds no job or host; publisher resource allocation is fixed rather than adaptive.

Once merged, verify the main publication run actually publishes rvn-eks-worker@0.18.0, then replan #8985. Do not deploy #8986 until the module upgrade is applied.

Validation: parsed workflow YAML; asserted that jobs.publish.runs-on is the only semantic change and retains interruptible=false; git diff --check and normal commit hooks passed.

Link to Devin session: https://app.devin.ai/sessions/a65ede619c9d4171b242b95d57a991dd
Open in Devin Desktop: https://app.devin.ai/desktop/session/a65ede619c9d4171b242b95d57a991dd?variant=devin

RetriggerView in GreptileConfidence Score: 5/5

The PR appears safe to merge; no actionable defects were found in the runner sizing change.

Summary

Restores fixed runner sizing for the release publisher in .github/workflows/module-definitions.yml.

  • The module publisher requests a fixed 2-vCPU, 4-GiB runner.

Reviews (1) · Last reviewed commit: "fix: constrain module publish runner sha..." · Reviewed by Greptile

Co-Authored-By: brandon <brandon@flightcontrol.dev>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

@github-actions

Copy link
Copy Markdown

Ravion Module Publish Plan

Dry run only. No Ravion API mutations were made.

Module Current Version New Version Description
rvn-ecs-nlb 2.5.0 2.6.0 Let pipeline deploy steps set allowlisted environment variables, such as a release version computed earlier in the pipeline.
rvn-ecs-web 2.8.0 2.9.0 Let pipeline deploy steps set allowlisted environment variables, such as a release version computed earlier in the pipeline.
rvn-ecs-worker 2.4.0 2.5.0 Let pipeline deploy steps set allowlisted environment variables, such as a release version computed earlier in the pipeline.
rvn-eks-addons 0.28.0 1.0.0 First stable release, available to all Ravion organizations.
rvn-eks-chart 0.3.3 1.0.0 First stable release, available to all Ravion organizations.
rvn-eks-cluster 0.10.0 1.0.0 First stable release, available to all Ravion organizations.
rvn-eks-web 1.16.0 1.17.0 Let pipeline deploy steps set allowlisted environment variables, such as a release version computed earlier in the pipeline.
rvn-eks-worker 0.17.0 1.0.0 First stable release, available to all Ravion organizations.

Diffs

rvn-ecs-nlb 2.5.0 -> 2.6.0

--- remote
+++ compiled
       placeholder: sha256:... or latest or <run-id>-railpack
       required: true
       type: string
+    - description: Plain environment variables to set for this deploy. Only names listed in the module's Deploy-provided environment variables input are applied; others are ignored. Can't replace a runtime variable or secret.
+      id: environment_variables
+      label: Environment variables
+      placeholder: |-
+        - name: LOG_LEVEL
+          value: info
+      required: false
+      type: array
   post_deploy: '<< module.input.post_deploy_enabled && len(module.input.post_deploy_command) > 0 ? {"container_overrides": [{"name": stack.output.container_name, "command": module.input.post_deploy_command, "environment": module.input.post_deploy_environment_variables, "cpu": (module.input.post_deploy_cpu ? int(float(module.input.post_deploy_cpu) * 1024) : nil), "memory": (module.input.post_deploy_memory ? int(float(module.input.post_deploy_memory) * 1024) : nil)}], "cpu": string(module.input.post_deploy_cpu ? int(float(module.input.post_deploy_cpu) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024))), "memory": string(module.input.post_deploy_memory ? int(float(module.input.post_deploy_memory) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024))), "ephemeral_storage": (module.input.post_deploy_ephemeral_storage_size_gib ? {size_in_gib: module.input.post_deploy_ephemeral_storage_size_gib} : nil), "task_role_arn": stack.output.task_role_arn, "execution_role_arn": stack.output.execution_role_arn, "capacity_provider_strategy": (get(module.input.advanced_terraform_variables, "capacity_provider_strategies") != nil ? get(module.input.advanced_terraform_variables, "capacity_provider_strategies") : ((module.input.capacity_provider == "fargate" || module.input.additional_fargate_capacity_enabled ? [{capacity_provider: module.input.fargate_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "fargate_spot" || module.input.additional_fargate_spot_capacity_enabled ? [{capacity_provider: module.input.fargate_spot_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "ec2" || module.input.additional_ec2_capacity_enabled ? [{capacity_provider: module.input.ec2_capacity_provider_name, weight: 1, base: 0}] : []))), "network_configuration": {"awsvpc_configuration": {"subnets": (module.input.private_subnet_placement_enabled ? module.input.private_subnet_ids : module.input.public_subnet_ids), "security_groups": ([stack.output.security_group_id] | concat(module.input.security_group_ids != nil ? module.input.security_group_ids : [])), "assign_public_ip": (module.input.private_subnet_placement_enabled ? "DISABLED" : "ENABLED")}}, "enable_execute_command": module.input.execute_command_enabled, "timeout": module.input.post_deploy_timeout} : nil >>'
   pre_deploy: '<< module.input.pre_deploy_enabled && len(module.input.pre_deploy_command) > 0 ? {"container_overrides": [{"name": stack.output.container_name, "command": module.input.pre_deploy_command, "environment": module.input.pre_deploy_environment_variables, "cpu": (module.input.pre_deploy_cpu ? int(float(module.input.pre_deploy_cpu) * 1024) : nil), "memory": (module.input.pre_deploy_memory ? int(float(module.input.pre_deploy_memory) * 1024) : nil)}], "cpu": string(module.input.pre_deploy_cpu ? int(float(module.input.pre_deploy_cpu) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024))), "memory": string(module.input.pre_deploy_memory ? int(float(module.input.pre_deploy_memory) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024))), "ephemeral_storage": (module.input.pre_deploy_ephemeral_storage_size_gib ? {size_in_gib: module.input.pre_deploy_ephemeral_storage_size_gib} : nil), "task_role_arn": stack.output.task_role_arn, "execution_role_arn": stack.output.execution_role_arn, "capacity_provider_strategy": (get(module.input.advanced_terraform_variables, "capacity_provider_strategies") != nil ? get(module.input.advanced_terraform_variables, "capacity_provider_strategies") : ((module.input.capacity_provider == "fargate" || module.input.additional_fargate_capacity_enabled ? [{capacity_provider: module.input.fargate_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "fargate_spot" || module.input.additional_fargate_spot_capacity_enabled ? [{capacity_provider: module.input.fargate_spot_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "ec2" || module.input.additional_ec2_capacity_enabled ? [{capacity_provider: module.input.ec2_capacity_provider_name, weight: 1, base: 0}] : []))), "network_configuration": {"awsvpc_configuration": {"subnets": (module.input.private_subnet_placement_enabled ? module.input.private_subnet_ids : module.input.public_subnet_ids), "security_groups": ([stack.output.security_group_id] | concat(module.input.security_group_ids != nil ? module.input.security_group_ids : [])), "assign_public_ip": (module.input.private_subnet_placement_enabled ? "DISABLED" : "ENABLED")}}, "enable_execute_command": module.input.execute_command_enabled, "timeout": module.input.pre_deploy_timeout} : nil >>'
   strategy:
@@
     minimum_healthy_percent: "<< module.input.deployment_minimum_healthy_percent != nil ? module.input.deployment_minimum_healthy_percent : 100 >>"
     type: rolling
   task_definition:
-    container_definitions: "<< (module.input.firelens_enabled ? [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"depends_on\": [{\"container_name\": \"log_router\", \"condition\": \"START\"}], \"environment\": ([{name: \"PORT\", value: string(module.input.listeners[0].container_port)}] | concat(module.input.environment_variables != nil ? module.input.environment_variables : [])), \"essential\": true, \"image\": (module.input.build_source == \"image_registry\" ? (deploy.input.image_ref contains \"sha256:\" ? module.input.image_repository + \"@\" + deploy.input.image_ref : module.input.image_repository + \":\" + deploy.input.image_ref) : (deploy.input.image_ref contains \"sha256:\" ? stack.output.ecr_repository_url + \"@\" + deploy.input.image_ref : stack.output.ecr_repository_url + \":\" + deploy.input.image_ref)), \"linux_parameters\": {\"init_process_enabled\": true}, \"log_configuration\": {\"log_driver\": \"awsfirelens\"}, \"memory\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024)), \"mount_points\": (module.input.efs_enabled ? [{\"source_volume\": \"efs\", \"container_path\": module.input.efs_mount_path, \"read_only\": module.input.efs_read_only}] : []), \"name\": (stack.output.container_name), \"port_mappings\": map(module.input.listeners, {\"container_port\": #.container_port, \"protocol\": (#.listener_protocol == \"UDP\" ? \"udp\" : \"tcp\")}), \"readonly_root_filesystem\": false, \"repository_credentials\": (module.input.image_registry_credentials_secret_arn ? {credentials_parameter: module.input.image_registry_credentials_secret_arn} : nil), \"secrets\": (module.input.secrets), \"stop_timeout\": (module.input.stop_timeout != nil ? module.input.stop_timeout : 30)}, {\"name\": \"log_router\", \"image\": module.input.firelens_image, \"cpu\": 0, \"memory_reservation\": 51, \"essential\": true, \"environment\": ([{name: \"FIRELENS_CONFIG_CONTENT\", value: \"[SERVICE]\\n    Flush 1\\n    Grace 30\\n\\n\" + (module.input.firelens_config ? module.input.firelens_config + \"\\n\" : \"\") + (module.input.firelens_cloudwatch_output_enabled ? \"\\n[OUTPUT]\\n    Name cloudwatch\\n    Match *\\n    region \" + stack.output.region + \"\\n    log_group_name \" + stack.output.log_group_name + \"\\n    auto_create_group true\\n    log_stream_prefix \" + stack.output.log_stream_prefix + \"/\\n    retry_limit 2\\n    log_key log\\n    log_format json/emf\\n\" : \"\")}] | concat(module.input.firelens_environment_variables != nil ? module.input.firelens_environment_variables : [])), \"secrets\": module.input.firelens_secrets != nil ? module.input.firelens_secrets : [], \"command\": [\"/bin/sh\", \"-c\", \"printf '%s' \\\"$FIRELENS_CONFIG_CONTENT\\\" > /flightcontrol-firelens.conf && exec /entrypoint.sh\"], \"user\": \"0\", \"log_configuration\": {\"log_driver\": \"awslogs\", \"options\": {\"awslogs-group\": stack.output.log_group_name, \"awslogs-region\": stack.output.region, \"awslogs-stream-prefix\": stack.output.log_stream_prefix + \"/firelens\"}}, \"firelens_configuration\": {\"type\": \"fluentbit\", \"options\": {\"config-file-type\": \"file\", \"config-file-value\": \"/flightcontrol-firelens.conf\", \"enable-ecs-log-metadata\": string(module.input.firelens_ecs_metadata_enabled)}}}] : [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"environment\": ([{name: \"PORT\", value: string(module.input.listeners[0].container_port)}] | concat(module.input.environment_variables != nil ? module.input.environment_variables : [])), \"essential\": true, \"image\": (module.input.build_source == \"image_registry\" ? (deploy.input.image_ref contains \"sha256:\" ? module.input.image_repository + \"@\" + deploy.input.image_ref : module.input.image_repository + \":\" + deploy.input.image_ref) : (deploy.input.image_ref contains \"sha256:\" ? stack.output.ecr_repository_url + \"@\" + deploy.input.image_ref : stack.output.ecr_repository_url + \":\" + deploy.input.image_ref)), \"linux_parameters\": {\"init_process_enabled\": true}, \"log_configuration\": {\"log_driver\": \"awslogs\", \"options\": {\"awslogs-group\": stack.output.log_group_name, \"awslogs-region\": stack.output.region, \"awslogs-stream-prefix\": stack.output.log_stream_prefix}}, \"memory\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024)), \"mount_points\": (module.input.efs_enabled ? [{\"source_volume\": \"efs\", \"container_path\": module.input.efs_mount_path, \"read_only\": module.input.efs_read_only}] : []), \"name\": (stack.output.container_name), \"port_mappings\": map(module.input.listeners, {\"container_port\": #.container_port, \"protocol\": (#.listener_protocol == \"UDP\" ? \"udp\" : \"tcp\")}), \"readonly_root_filesystem\": false, \"repository_credentials\": (module.input.image_registry_credentials_secret_arn ? {credentials_parameter: module.input.image_registry_credentials_secret_arn} : nil), \"secrets\": (module.input.secrets), \"stop_timeout\": (module.input.stop_timeout != nil ? module.input.stop_timeout : 30)}]) | concat(module.input.sidecars ? map(module.input.sidecars, {\"name\": #.name, \"image\": #.image, \"essential\": #.essential, \"cpu\": (#.cpu ? int(float(#.cpu) * 1024) : nil), \"memory\": (#.memory ? int(float(#.memory) * 1024) : nil), \"memory_reservation\": (#.memory_reservation ? int(float(#.memory_reservation) * 1024) : nil), \"environment\": #.environment, \"secrets\": #.secrets, \"port_mappings\": #.port_mappings, \"mount_points\": #.mount_points, \"depends_on\": #.depends_on, \"command\": #.command, \"entry_point\": #.entry_point, \"working_directory\": #.working_directory}) : []) >>"
+    container_definitions: "
... diff truncated ...

rvn-ecs-web 2.8.0 -> 2.9.0

--- remote
+++ compiled
       placeholder: sha256:... or latest or <run-id>-railpack
       required: true
       type: string
+    - description: Plain environment variables to set for this deploy. Only names listed in the module's Deploy-provided environment variables input are applied; others are ignored. Can't replace a runtime variable or secret.
+      id: environment_variables
+      label: Environment variables
+      placeholder: |-
+        - name: LOG_LEVEL
+          value: info
+      required: false
+      type: array
   post_deploy: '<< module.input.post_deploy_enabled && len(module.input.post_deploy_command) > 0 ? {"container_overrides": [{"name": stack.output.container_name, "command": module.input.post_deploy_command, "environment": module.input.post_deploy_environment_variables, "cpu": (module.input.post_deploy_cpu ? int(float(module.input.post_deploy_cpu) * 1024) : nil), "memory": (module.input.post_deploy_memory ? int(float(module.input.post_deploy_memory) * 1024) : nil)}], "cpu": string(module.input.post_deploy_cpu ? int(float(module.input.post_deploy_cpu) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024))), "memory": string(module.input.post_deploy_memory ? int(float(module.input.post_deploy_memory) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024))), "ephemeral_storage": (module.input.post_deploy_ephemeral_storage_size_gib ? {size_in_gib: module.input.post_deploy_ephemeral_storage_size_gib} : nil), "task_role_arn": stack.output.task_role_arn, "execution_role_arn": stack.output.execution_role_arn, "capacity_provider_strategy": (get(module.input.advanced_terraform_variables, "capacity_provider_strategies") != nil ? get(module.input.advanced_terraform_variables, "capacity_provider_strategies") : ((module.input.capacity_provider == "fargate" || module.input.additional_fargate_capacity_enabled ? [{capacity_provider: module.input.fargate_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "fargate_spot" || module.input.additional_fargate_spot_capacity_enabled ? [{capacity_provider: module.input.fargate_spot_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "ec2" || module.input.additional_ec2_capacity_enabled ? [{capacity_provider: module.input.ec2_capacity_provider_name, weight: 1, base: 0}] : []))), "network_configuration": {"awsvpc_configuration": {"subnets": (module.input.private_subnet_placement_enabled ? module.input.private_subnet_ids : module.input.public_subnet_ids), "security_groups": ([stack.output.security_group_id] | concat(module.input.security_group_ids != nil ? module.input.security_group_ids : [])), "assign_public_ip": (module.input.private_subnet_placement_enabled ? "DISABLED" : "ENABLED")}}, "enable_execute_command": module.input.execute_command_enabled, "timeout": module.input.post_deploy_timeout} : nil >>'
   pre_deploy: '<< module.input.pre_deploy_enabled && len(module.input.pre_deploy_command) > 0 ? {"container_overrides": [{"name": stack.output.container_name, "command": module.input.pre_deploy_command, "environment": module.input.pre_deploy_environment_variables, "cpu": (module.input.pre_deploy_cpu ? int(float(module.input.pre_deploy_cpu) * 1024) : nil), "memory": (module.input.pre_deploy_memory ? int(float(module.input.pre_deploy_memory) * 1024) : nil)}], "cpu": string(module.input.pre_deploy_cpu ? int(float(module.input.pre_deploy_cpu) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024))), "memory": string(module.input.pre_deploy_memory ? int(float(module.input.pre_deploy_memory) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024))), "ephemeral_storage": (module.input.pre_deploy_ephemeral_storage_size_gib ? {size_in_gib: module.input.pre_deploy_ephemeral_storage_size_gib} : nil), "task_role_arn": stack.output.task_role_arn, "execution_role_arn": stack.output.execution_role_arn, "capacity_provider_strategy": (get(module.input.advanced_terraform_variables, "capacity_provider_strategies") != nil ? get(module.input.advanced_terraform_variables, "capacity_provider_strategies") : ((module.input.capacity_provider == "fargate" || module.input.additional_fargate_capacity_enabled ? [{capacity_provider: module.input.fargate_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "fargate_spot" || module.input.additional_fargate_spot_capacity_enabled ? [{capacity_provider: module.input.fargate_spot_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "ec2" || module.input.additional_ec2_capacity_enabled ? [{capacity_provider: module.input.ec2_capacity_provider_name, weight: 1, base: 0}] : []))), "network_configuration": {"awsvpc_configuration": {"subnets": (module.input.private_subnet_placement_enabled ? module.input.private_subnet_ids : module.input.public_subnet_ids), "security_groups": ([stack.output.security_group_id] | concat(module.input.security_group_ids != nil ? module.input.security_group_ids : [])), "assign_public_ip": (module.input.private_subnet_placement_enabled ? "DISABLED" : "ENABLED")}}, "enable_execute_command": module.input.execute_command_enabled, "timeout": module.input.pre_deploy_timeout} : nil >>'
   strategy: |
@@
     }
     >>
   task_definition:
-    container_definitions: "<< (module.input.firelens_enabled ? [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"depends_on\": [{\"container_name\": \"log_router\", \"condition\": \"START\"}], \"environment\": ([{name: \"PORT\", value: string(module.input.container_port)}] | concat(module.input.environment_variables != nil ? module.input.environment_variables : [])), \"essential\": true, \"image\": (module.input.build_source == \"image_registry\" ? (deploy.input.image_ref contains \"sha256:\" ? module.input.image_repository + \"@\" + deploy.input.image_ref : module.input.image_repository + \":\" + deploy.input.image_ref) : (deploy.input.image_ref contains \"sha256:\" ? stack.output.ecr_repository_url + \"@\" + deploy.input.image_ref : stack.output.ecr_repository_url + \":\" + deploy.input.image_ref)), \"linux_parameters\": {\"init_process_enabled\": true}, \"log_configuration\": {\"log_driver\": \"awsfirelens\"}, \"memory\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024)), \"mount_points\": (module.input.efs_enabled ? [{\"source_volume\": \"efs\", \"container_path\": module.input.efs_mount_path, \"read_only\": module.input.efs_read_only}] : []), \"name\": (stack.output.container_name), \"port_mappings\": [{\"app_protocol\": \"http\", \"container_port\": (module.input.container_port), \"protocol\": \"tcp\"}], \"readonly_root_filesystem\": false, \"repository_credentials\": (module.input.image_registry_credentials_secret_arn ? {credentials_parameter: module.input.image_registry_credentials_secret_arn} : nil), \"secrets\": (module.input.secrets), \"stop_timeout\": (module.input.stop_timeout != nil ? module.input.stop_timeout : 30)}, {\"name\": \"log_router\", \"image\": module.input.firelens_image, \"cpu\": 0, \"memory_reservation\": 51, \"essential\": true, \"environment\": ([{name: \"FIRELENS_CONFIG_CONTENT\", value: \"[SERVICE]\\n    Flush 1\\n    Grace 30\\n\\n\" + (module.input.firelens_config ? module.input.firelens_config + \"\\n\" : \"\") + (module.input.firelens_cloudwatch_output_enabled ? \"\\n[OUTPUT]\\n    Name cloudwatch\\n    Match *\\n    region \" + stack.output.region + \"\\n    log_group_name \" + stack.output.log_group_name + \"\\n    auto_create_group true\\n    log_stream_prefix \" + stack.output.log_stream_prefix + \"/\\n    retry_limit 2\\n    log_key log\\n    log_format json/emf\\n\" : \"\")}] | concat(module.input.firelens_environment_variables != nil ? module.input.firelens_environment_variables : [])), \"secrets\": module.input.firelens_secrets != nil ? module.input.firelens_secrets : [], \"command\": [\"/bin/sh\", \"-c\", \"printf '%s' \\\"$FIRELENS_CONFIG_CONTENT\\\" > /flightcontrol-firelens.conf && exec /entrypoint.sh\"], \"user\": \"0\", \"log_configuration\": {\"log_driver\": \"awslogs\", \"options\": {\"awslogs-group\": stack.output.log_group_name, \"awslogs-region\": stack.output.region, \"awslogs-stream-prefix\": stack.output.log_stream_prefix + \"/firelens\"}}, \"firelens_configuration\": {\"type\": \"fluentbit\", \"options\": {\"config-file-type\": \"file\", \"config-file-value\": \"/flightcontrol-firelens.conf\", \"enable-ecs-log-metadata\": string(module.input.firelens_ecs_metadata_enabled)}}}] : [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"environment\": ([{name: \"PORT\", value: string(module.input.container_port)}] | concat(module.input.environment_variables != nil ? module.input.environment_variables : [])), \"essential\": true, \"image\": (module.input.build_source == \"image_registry\" ? (deploy.input.image_ref contains \"sha256:\" ? module.input.image_repository + \"@\" + deploy.input.image_ref : module.input.image_repository + \":\" + deploy.input.image_ref) : (deploy.input.image_ref contains \"sha256:\" ? stack.output.ecr_repository_url + \"@\" + deploy.input.image_ref : stack.output.ecr_repository_url + \":\" + deploy.input.image_ref)), \"linux_parameters\": {\"init_process_enabled\": true}, \"log_configuration\": {\"log_driver\": \"awslogs\", \"options\": {\"awslogs-group\": stack.output.log_group_name, \"awslogs-region\": stack.output.region, \"awslogs-stream-prefix\": stack.output.log_stream_prefix}}, \"memory\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024)), \"mount_points\": (module.input.efs_enabled ? [{\"source_volume\": \"efs\", \"container_path\": module.input.efs_mount_path, \"read_only\": module.input.efs_read_only}] : []), \"name\": (stack.output.container_name), \"port_mappings\": [{\"app_protocol\": \"http\", \"container_port\": (module.input.container_port), \"protocol\": \"tcp\"}], \"readonly_root_filesystem\": false, \"repository_credentials\": (module.input.image_registry_credentials_secret_arn ? {credentials_parameter: module.input.image_registry_credentials_secret_arn} : nil), \"secrets\": (module.input.secrets), \"stop_timeout\": (module.input.stop_timeout != nil ? module.input.stop_timeout : 30)}]) | concat(module.input.sidecars ? map(module.input.sidecars, {\"name\": #.name, \"image\": #.image, \"essential\": #.essential, \"cpu\": (#.cpu ? int(float(#.cpu) * 1024) : nil), \"memory\": (#.memory ? int(float(#.memory) * 1024) : nil), \"memory_reservation\": (#.memory_reservation ? int(float(#.memory_reservation) * 1024) : nil), \"environment\": #.environment, \"secrets\": #.secrets, \"port_mappings\": #.port_mappings, \"mount_points\": #.mount_points, \"depends_on\": #.depends_on, \"command\": #.command, \"entry_point\": #.entry_point, \"working_directory\": #.working_directory}) : []) >>"
+    container_definitions: "<< (module.input.firelens_enabled ? [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(f
... diff truncated ...

rvn-ecs-worker 2.4.0 -> 2.5.0

--- remote
+++ compiled
       placeholder: sha256:... or latest or <run-id>-railpack
       required: true
       type: string
+    - description: Plain environment variables to set for this deploy. Only names listed in the module's Deploy-provided environment variables input are applied; others are ignored. Can't replace a runtime variable or secret.
+      id: environment_variables
+      label: Environment variables
+      placeholder: |-
+        - name: LOG_LEVEL
+          value: info
+      required: false
+      type: array
   post_deploy: '<< module.input.post_deploy_enabled && len(module.input.post_deploy_command) > 0 ? {"container_overrides": [{"name": stack.output.container_name, "command": module.input.post_deploy_command, "environment": module.input.post_deploy_environment_variables, "cpu": (module.input.post_deploy_cpu ? int(float(module.input.post_deploy_cpu) * 1024) : nil), "memory": (module.input.post_deploy_memory ? int(float(module.input.post_deploy_memory) * 1024) : nil)}], "cpu": string(module.input.post_deploy_cpu ? int(float(module.input.post_deploy_cpu) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024))), "memory": string(module.input.post_deploy_memory ? int(float(module.input.post_deploy_memory) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024))), "ephemeral_storage": (module.input.post_deploy_ephemeral_storage_size_gib ? {size_in_gib: module.input.post_deploy_ephemeral_storage_size_gib} : nil), "task_role_arn": stack.output.task_role_arn, "execution_role_arn": stack.output.execution_role_arn, "capacity_provider_strategy": (get(module.input.advanced_terraform_variables, "capacity_provider_strategies") != nil ? get(module.input.advanced_terraform_variables, "capacity_provider_strategies") : ((module.input.capacity_provider == "fargate" || module.input.additional_fargate_capacity_enabled ? [{capacity_provider: module.input.fargate_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "fargate_spot" || module.input.additional_fargate_spot_capacity_enabled ? [{capacity_provider: module.input.fargate_spot_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "ec2" || module.input.additional_ec2_capacity_enabled ? [{capacity_provider: module.input.ec2_capacity_provider_name, weight: 1, base: 0}] : []))), "network_configuration": {"awsvpc_configuration": {"subnets": (module.input.private_subnet_placement_enabled ? module.input.private_subnet_ids : module.input.public_subnet_ids), "security_groups": ([stack.output.security_group_id] | concat(module.input.security_group_ids != nil ? module.input.security_group_ids : [])), "assign_public_ip": (module.input.private_subnet_placement_enabled ? "DISABLED" : "ENABLED")}}, "enable_execute_command": module.input.execute_command_enabled, "timeout": module.input.post_deploy_timeout} : nil >>'
   pre_deploy: '<< module.input.pre_deploy_enabled && len(module.input.pre_deploy_command) > 0 ? {"container_overrides": [{"name": stack.output.container_name, "command": module.input.pre_deploy_command, "environment": module.input.pre_deploy_environment_variables, "cpu": (module.input.pre_deploy_cpu ? int(float(module.input.pre_deploy_cpu) * 1024) : nil), "memory": (module.input.pre_deploy_memory ? int(float(module.input.pre_deploy_memory) * 1024) : nil)}], "cpu": string(module.input.pre_deploy_cpu ? int(float(module.input.pre_deploy_cpu) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024))), "memory": string(module.input.pre_deploy_memory ? int(float(module.input.pre_deploy_memory) * 1024) : (module.input.capacity_provider == "ec2" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024))), "ephemeral_storage": (module.input.pre_deploy_ephemeral_storage_size_gib ? {size_in_gib: module.input.pre_deploy_ephemeral_storage_size_gib} : nil), "task_role_arn": stack.output.task_role_arn, "execution_role_arn": stack.output.execution_role_arn, "capacity_provider_strategy": (get(module.input.advanced_terraform_variables, "capacity_provider_strategies") != nil ? get(module.input.advanced_terraform_variables, "capacity_provider_strategies") : ((module.input.capacity_provider == "fargate" || module.input.additional_fargate_capacity_enabled ? [{capacity_provider: module.input.fargate_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "fargate_spot" || module.input.additional_fargate_spot_capacity_enabled ? [{capacity_provider: module.input.fargate_spot_capacity_provider_name, weight: 1, base: 0}] : []) | concat(module.input.capacity_provider == "ec2" || module.input.additional_ec2_capacity_enabled ? [{capacity_provider: module.input.ec2_capacity_provider_name, weight: 1, base: 0}] : []))), "network_configuration": {"awsvpc_configuration": {"subnets": (module.input.private_subnet_placement_enabled ? module.input.private_subnet_ids : module.input.public_subnet_ids), "security_groups": ([stack.output.security_group_id] | concat(module.input.security_group_ids != nil ? module.input.security_group_ids : [])), "assign_public_ip": (module.input.private_subnet_placement_enabled ? "DISABLED" : "ENABLED")}}, "enable_execute_command": module.input.execute_command_enabled, "timeout": module.input.pre_deploy_timeout} : nil >>'
   strategy:
@@
     minimum_healthy_percent: "<< module.input.deployment_minimum_healthy_percent != nil ? module.input.deployment_minimum_healthy_percent : 100 >>"
     type: rolling
   task_definition:
-    container_definitions: "<< (module.input.firelens_enabled ? [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"depends_on\": [{\"container_name\": \"log_router\", \"condition\": \"START\"}], \"environment\": (module.input.environment_variables != nil ? module.input.environment_variables : []), \"essential\": true, \"image\": (module.input.build_source == \"image_registry\" ? (deploy.input.image_ref contains \"sha256:\" ? module.input.image_repository + \"@\" + deploy.input.image_ref : module.input.image_repository + \":\" + deploy.input.image_ref) : (deploy.input.image_ref contains \"sha256:\" ? stack.output.ecr_repository_url + \"@\" + deploy.input.image_ref : stack.output.ecr_repository_url + \":\" + deploy.input.image_ref)), \"linux_parameters\": {\"init_process_enabled\": true}, \"log_configuration\": {\"log_driver\": \"awsfirelens\"}, \"memory\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024)), \"mount_points\": (module.input.efs_enabled ? [{\"source_volume\": \"efs\", \"container_path\": module.input.efs_mount_path, \"read_only\": module.input.efs_read_only}] : []), \"name\": (stack.output.container_name), \"readonly_root_filesystem\": false, \"repository_credentials\": (module.input.image_registry_credentials_secret_arn ? {credentials_parameter: module.input.image_registry_credentials_secret_arn} : nil), \"secrets\": (module.input.secrets), \"stop_timeout\": (module.input.stop_timeout != nil ? module.input.stop_timeout : 30)}, {\"name\": \"log_router\", \"image\": module.input.firelens_image, \"cpu\": 0, \"memory_reservation\": 51, \"essential\": true, \"environment\": ([{name: \"FIRELENS_CONFIG_CONTENT\", value: \"[SERVICE]\\n    Flush 1\\n    Grace 30\\n\\n\" + (module.input.firelens_config ? module.input.firelens_config + \"\\n\" : \"\") + (module.input.firelens_cloudwatch_output_enabled ? \"\\n[OUTPUT]\\n    Name cloudwatch\\n    Match *\\n    region \" + stack.output.region + \"\\n    log_group_name \" + stack.output.log_group_name + \"\\n    auto_create_group true\\n    log_stream_prefix \" + stack.output.log_stream_prefix + \"/\\n    retry_limit 2\\n    log_key log\\n    log_format json/emf\\n\" : \"\")}] | concat(module.input.firelens_environment_variables != nil ? module.input.firelens_environment_variables : [])), \"secrets\": module.input.firelens_secrets != nil ? module.input.firelens_secrets : [], \"command\": [\"/bin/sh\", \"-c\", \"printf '%s' \\\"$FIRELENS_CONFIG_CONTENT\\\" > /flightcontrol-firelens.conf && exec /entrypoint.sh\"], \"user\": \"0\", \"log_configuration\": {\"log_driver\": \"awslogs\", \"options\": {\"awslogs-group\": stack.output.log_group_name, \"awslogs-region\": stack.output.region, \"awslogs-stream-prefix\": stack.output.log_stream_prefix + \"/firelens\"}}, \"firelens_configuration\": {\"type\": \"fluentbit\", \"options\": {\"config-file-type\": \"file\", \"config-file-value\": \"/flightcontrol-firelens.conf\", \"enable-ecs-log-metadata\": string(module.input.firelens_ecs_metadata_enabled)}}}] : [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"environment\": (module.input.environment_variables != nil ? module.input.environment_variables : []), \"essential\": true, \"image\": (module.input.build_source == \"image_registry\" ? (deploy.input.image_ref contains \"sha256:\" ? module.input.image_repository + \"@\" + deploy.input.image_ref : module.input.image_repository + \":\" + deploy.input.image_ref) : (deploy.input.image_ref contains \"sha256:\" ? stack.output.ecr_repository_url + \"@\" + deploy.input.image_ref : stack.output.ecr_repository_url + \":\" + deploy.input.image_ref)), \"linux_parameters\": {\"init_process_enabled\": true}, \"log_configuration\": {\"log_driver\": \"awslogs\", \"options\": {\"awslogs-group\": stack.output.log_group_name, \"awslogs-region\": stack.output.region, \"awslogs-stream-prefix\": stack.output.log_stream_prefix}}, \"memory\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_memory) * 1024) : int(float(module.input.fargate_size.memory_gb) * 1024)), \"mount_points\": (module.input.efs_enabled ? [{\"source_volume\": \"efs\", \"container_path\": module.input.efs_mount_path, \"read_only\": module.input.efs_read_only}] : []), \"name\": (stack.output.container_name), \"readonly_root_filesystem\": false, \"repository_credentials\": (module.input.image_registry_credentials_secret_arn ? {credentials_parameter: module.input.image_registry_credentials_secret_arn} : nil), \"secrets\": (module.input.secrets), \"stop_timeout\": (module.input.stop_timeout != nil ? module.input.stop_timeout : 30)}]) | concat(module.input.sidecars ? map(module.input.sidecars, {\"name\": #.name, \"image\": #.image, \"essential\": #.essential, \"cpu\": (#.cpu ? int(float(#.cpu) * 1024) : nil), \"memory\": (#.memory ? int(float(#.memory) * 1024) : nil), \"memory_reservation\": (#.memory_reservation ? int(float(#.memory_reservation) * 1024) : nil), \"environment\": #.environment, \"secrets\": #.secrets, \"port_mappings\": #.port_mappings, \"mount_points\": #.mount_points, \"depends_on\": #.depends_on, \"command\": #.command, \"entry_point\": #.entry_point, \"working_directory\": #.working_directory}) : []) >>"
+    container_definitions: "<< (module.input.firelens_enabled ? [{\"command\": (len(module.input.image_start_command) > 0 ? module.input.image_start_command : nil), \"cpu\": (module.input.capacity_provider == \"ec2\" ? int(float(module.input.task_cpu) * 1024) : int(float(module.input.fargate_size.vcpu) * 1024)), \"depends_on\": [{\"container_name\": \"log_router\", \"condition\": \"START\"}], \"environment\": ((module.input.environment_variables != nil ? module.input.environment_variables : []) | concat(mod
... diff truncated ...

rvn-eks-addons 0.28.0 -> 1.0.0

--- remote
+++ compiled
   - Each load balancer's security group is automatically allowed to reach pods through the EKS cluster security group (all TCP ports).
   - Because `TargetGroupBinding` depends on the controller, enabling any load balancer automatically installs the **load balancer controller** - there is nothing extra to configure.
 
-  Terraform source: [ravionhq/modules/compute/eks/addons](https://github.com/ravionhq/modules/tree/rvn-eks-addons@0.28.0/compute/eks/addons)
+  Terraform source: [ravionhq/modules/compute/eks/addons](https://github.com/ravionhq/modules/tree/rvn-eks-addons@1.0.0/compute/eks/addons)
 
   ## Prerequisites
 
@@
         execution_environment_overrides:
           security_group: << module.input.ravion_runner_security_group_id >>
         plan_permissions: '<< module.input.terraform_plan_default_policies_enabled == false ? {"replace": module.input.terraform_plan_iam_policy_arns} : (module.input.terraform_plan_iam_policy_arns ? {"attach": module.input.terraform_plan_iam_policy_arns} : nil) >>'
-        ref: rvn-eks-addons@0.28.0
+        ref: rvn-eks-addons@1.0.0
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-eks-addons 0.28.0 -> 1.0.0

--- remote
+++ compiled
-isGlobalPublished: false
+isGlobalPublished: true

rvn-eks-chart 0.3.3 -> 1.0.0

--- remote
+++ compiled
 
   Unlike EKS Web Service and EKS Worker, this module has no build and no image. The chart decides which Kubernetes resources to create, and your values configure them.
 
-  Terraform source: [ravionhq/modules/compute/eks_service](https://github.com/ravionhq/modules/tree/rvn-eks-chart@0.3.3/compute/eks_service)
+  Terraform source: [ravionhq/modules/compute/eks_service](https://github.com/ravionhq/modules/tree/rvn-eks-chart@1.0.0/compute/eks_service)
 
   ## Use cases
 
@@
         execution_environment_overrides:
           security_group: << module.input.ravion_runner_security_group_id >>
         plan_permissions: '<< module.input.terraform_plan_default_policies_enabled == false ? {"replace": module.input.terraform_plan_iam_policy_arns} : (module.input.terraform_plan_iam_policy_arns ? {"attach": module.input.terraform_plan_iam_policy_arns} : nil) >>'
-        ref: rvn-eks-chart@0.3.3
+        ref: rvn-eks-chart@1.0.0
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-eks-chart 0.3.3 -> 1.0.0

--- remote
+++ compiled
-isGlobalPublished: false
+isGlobalPublished: true

rvn-eks-cluster 0.10.0 -> 1.0.0

--- remote
+++ compiled
 
   This module talks only to the AWS API, so it provisions in a single apply. It installs the Metrics Server EKS community add-on by default for CPU/memory autoscaling and `kubectl top`. Metrics Server is independent of the observability destinations in the separate **EKS Add-ons** module. Optional extensions - Karpenter autoscaling, the AWS Load Balancer Controller, the EBS CSI driver, and Container Insights - are added by that module.
 
-  Terraform source: [ravionhq/modules/compute/eks](https://github.com/ravionhq/modules/tree/rvn-eks-cluster@0.10.0/compute/eks)
+  Terraform source: [ravionhq/modules/compute/eks](https://github.com/ravionhq/modules/tree/rvn-eks-cluster@1.0.0/compute/eks)
 
   **Metrics Server** provides the Kubernetes `metrics.k8s.io` resource metrics API used by CPU/memory HorizontalPodAutoscalers and `kubectl top`. The AWS-managed community add-on is on by default and uses port 10251 for its server to avoid Fargate's port 10250 conflict; it still needs access to kubelets on port 10250. To use an existing Metrics Server instead, set `metrics_server_enabled: false` under **Advanced Terraform variables**. You can also set `metrics_server_addon_version` there to pin a tested EKS add-on version; without a pin, EKS selects a compatible version when the add-on is created, not on every apply.
 
@@
         branch: main
         execution_environment_id: << module.input.execution_environment_id >>
         plan_permissions: '<< module.input.terraform_plan_default_policies_enabled == false ? {"replace": module.input.terraform_plan_iam_policy_arns} : (module.input.terraform_plan_iam_policy_arns ? {"attach": module.input.terraform_plan_iam_policy_arns} : nil) >>'
-        ref: rvn-eks-cluster@0.10.0
+        ref: rvn-eks-cluster@1.0.0
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-eks-cluster 0.10.0 -> 1.0.0

--- remote
+++ compiled
-isGlobalPublished: false
+isGlobalPublished: true

rvn-eks-web 1.16.0 -> 1.17.0

--- remote
+++ compiled
     source:
       base_path: charts/rvn-eks-web
       branch: main
-      ref: rvn-eks-web@1.16.0
+      ref: rvn-eks-web@1.17.0
       repo_url: https://github.com/ravionhq/modules
       type: git
     type: helm
@@
         targetMemoryUtilizationPercentage: << module.input.autoscaling_memory_target >>
       command: "<< module.input.start_command != nil ? module.input.start_command : [] >>"
       containerPort: << module.input.container_port >>
-      env: '<< [{"name": "PORT", "value": string(module.input.container_port)}] | concat(module.input.environment_variables != nil ? module.input.environment_variables : []) >>'
+      env: '<< [{"name": "PORT", "value": string(module.input.container_port)}] | concat(module.input.environment_variables != nil ? module.input.environment_variables : []) | concat(module.input.deploy_environment_variable_names != nil && deploy.input.environment_variables != nil ? map(filter(deploy.input.environment_variables, #.name != "PORT" && #.name in module.input.deploy_environment_variable_names && #.value != nil && !(#.name in map(module.input.environment_variables ?? [], .name)) && !(#.name in map(module.input.secrets ?? [], .name))), {"name": #.name, "value": string(#.value)}) : []) >>'
       fullnameOverride: << module.input.name >>
       image:
         digest: '<< deploy.input.image_ref contains "sha256:" ? deploy.input.image_ref : "" >>'
@@
       placeholder: sha256:... or latest
       required: true
       type: string
+    - description: Plain environment variables to set for this deploy. Only names listed in the module's Deploy-provided environment variables input are applied; others are ignored. Can't replace a runtime variable or secret.
+      id: environment_variables
+      label: Environment variables
+      placeholder: |-
+        - name: LOG_LEVEL
+          value: info
+      required: false
+      type: array
   timeout: 1800
   type: aws:eks
 inputs:
@@
       - name: DATABASE_URL
         value_from: arn:aws:secretsmanager:us-east-1:123456789012:secret:db-AbCdEf:url::
     type: array
+  - add_button_label: Add env var name
+    collapsible: true
+    description: Names a pipeline deploy step may set with `input.environment_variables`. Plain values only; can't replace a runtime variable or secret.
+    id: deploy_environment_variable_names
+    label: Deploy-provided environment variables
+    required: false
+    type: string_array
   - id: section_iam
     label: IAM roles and policies
     type: section
@@
 
   Terraform owns the `aws_lb_target_group` and `aws_lb_listener_rule` against a shared load balancer, and the AWS Load Balancer Controller registers pod IPs into that target group. The chart does not create an Ingress, so no per-service load balancer is provisioned. This is the same routing shape as ECS Web Server, so a service moving from ECS keeps its routing model.
 
-  Chart source: [ravionhq/modules/charts/rvn-eks-web](https://github.com/ravionhq/modules/tree/rvn-eks-web@1.16.0/charts/rvn-eks-web)
+  Chart source: [ravionhq/modules/charts/rvn-eks-web](https://github.com/ravionhq/modules/tree/rvn-eks-web@1.17.0/charts/rvn-eks-web)
 
-  Terraform source: [ravionhq/modules/compute/eks_service](https://github.com/ravionhq/modules/tree/rvn-eks-web@1.16.0/compute/eks_service)
+  Terraform source: [ravionhq/modules/compute/eks_service](https://github.com/ravionhq/modules/tree/rvn-eks-web@1.17.0/compute/eks_service)
 
   ## Use cases
 
@@
 
   Use **Runtime environment variables** for plain values, as an array of `{name, value}` objects.
 
+  Use **Deploy-provided environment variables** to allow a pipeline deploy step to set selected plain values. They cannot replace a Runtime environment variable or Runtime secret, and `PORT` is reserved for the web service.
+
   Use **Runtime secrets** for sensitive values, as an array of `{name, value_from}` objects - the same shape as ECS, so a service migrating from ECS Web Server carries its secret configuration unchanged. `value_from` must be a full Secrets Manager or SSM Parameter Store ARN, including the JSON-key extraction suffix when you want a single key out of a JSON secret.
 
   Ravion never reads these values. The ARNs travel to the chart as references, the chart renders an `ExternalSecret`, and the External Secrets Operator materializes the Kubernetes Secret in the cluster. No secret value reaches Ravion, the Helm values document, or the Helm release history.
@@
   | Minimum available pods | No | 1 | Pods kept running during a node drain when the disruption budget is on |
   | Runtime environment variables | No | - | Array of {name, value} objects |
   | Runtime secrets | No | - | Array of {name, value_from} ARN references |
+  | Deploy-provided environment variables | No | - | Names a pipeline deploy step may set to plain values |
   | Create IAM role | No | false | Create an IAM role for the workload and bind it to its pods through EKS Pod Identity |
   | IAM role name | No | {service}-task | Explicit role name, for a service whose ECS task role already holds the default |
   | IAM policy ARNs | No | [] | Managed policy ARNs attached to the workload role |
@@
         execution_environment_overrides:
           security_group: << module.input.ravion_runner_security_group_id >>
         plan_permissions: '<< module.input.terraform_plan_default_policies_enabled == false ? {"replace": module.input.terraform_plan_iam_policy_arns} : (module.input.terraform_plan_iam_policy_arns ? {"attach": module.input.terraform_plan_iam_policy_arns} : nil) >>'
-        ref: rvn-eks-web@1.16.0
+        ref: rvn-eks-web@1.17.0
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-eks-web 1.16.0 -> 1.17.0

--- remote
+++ compiled
-isGlobalPublished: false
+isGlobalPublished: true

rvn-eks-worker 0.17.0 -> 1.0.0

--- remote
+++ compiled
     source:
       base_path: charts/rvn-eks-worker
       branch: main
-      ref: rvn-eks-worker@0.17.0
+      ref: rvn-eks-worker@1.0.0
       repo_url: https://github.com/ravionhq/modules
       type: git
     type: helm
@@
         targetCPUUtilizationPercentage: "<< module.input.autoscaling_cpu_target != nil ? module.input.autoscaling_cpu_target : 70 >>"
         targetMemoryUtilizationPercentage: << module.input.autoscaling_memory_target >>
       command: "<< module.input.start_command != nil ? module.input.start_command : [] >>"
-      env: "<< module.input.environment_variables != nil ? module.input.environment_variables : [] >>"
+      env: '<< (module.input.environment_variables != nil ? module.input.environment_variables : []) | concat(module.input.deploy_environment_variable_names != nil && deploy.input.environment_variables != nil ? map(filter(deploy.input.environment_variables, #.name in module.input.deploy_environment_variable_names && #.value != nil && !(#.name in map(module.input.environment_variables ?? [], .name)) && !(#.name in map(module.input.secrets ?? [], .name))), {"name": #.name, "value": string(#.value)}) : []) >>'
       fullnameOverride: << module.input.name >>
       image:
         digest: '<< deploy.input.image_ref contains "sha256:" ? deploy.input.image_ref : "" >>'
@@
       placeholder: sha256:... or latest
       required: true
       type: string
+    - description: Plain environment variables to set for this deploy. Only names listed in the module's Deploy-provided environment variables input are applied; others are ignored. Can't replace a runtime variable or secret.
+      id: environment_variables
+      label: Environment variables
+      placeholder: |-
+        - name: LOG_LEVEL
+          value: info
+      required: false
+      type: array
   timeout: 1800
   type: aws:eks
 inputs:
@@
       - name: DATABASE_URL
         value_from: arn:aws:secretsmanager:us-east-1:123456789012:secret:db-AbCdEf:url::
     type: array
+  - add_button_label: Add env var name
+    collapsible: true
+    description: Names a pipeline deploy step may set with `input.environment_variables`. Plain values only; can't replace a runtime variable or secret.
+    id: deploy_environment_variable_names
+    label: Deploy-provided environment variables
+    required: false
+    type: string_array
   - id: section_iam
     label: IAM roles and policies
     type: section
@@
 
   The Terraform stack creates the ECR repository that Dockerfile and Railpack builds push to and, when Fargate is selected, a workload-specific EKS Fargate profile and pod execution role. On the Pull from image registry path with automatic or EC2 compute, the stack creates no AWS resources. Everything else the module needs - cluster endpoint, certificate authority data, private subnet IDs, and the Ravion Runner role - comes from the selected EKS Cluster module.
 
-  Chart source: [ravionhq/modules/charts/rvn-eks-worker](https://github.com/ravionhq/modules/tree/rvn-eks-worker@0.17.0/charts/rvn-eks-worker)
+  Chart source: [ravionhq/modules/charts/rvn-eks-worker](https://github.com/ravionhq/modules/tree/rvn-eks-worker@1.0.0/charts/rvn-eks-worker)
 
-  Terraform source: [ravionhq/modules/compute/eks_service](https://github.com/ravionhq/modules/tree/rvn-eks-worker@0.17.0/compute/eks_service)
+  Terraform source: [ravionhq/modules/compute/eks_service](https://github.com/ravionhq/modules/tree/rvn-eks-worker@1.0.0/compute/eks_service)
 
   ## Use cases
 
@@
 
   Use **Runtime environment variables** for plain values, as an array of `{name, value}` objects.
 
+  Use **Deploy-provided environment variables** to allow a pipeline deploy step to set selected plain values. They cannot replace a Runtime environment variable or Runtime secret.
+
   Use **Runtime secrets** for sensitive values, as an array of `{name, value_from}` objects - the same shape as ECS. `value_from` must be a full Secrets Manager or SSM Parameter Store ARN, including the JSON-key extraction suffix when you want a single key out of a JSON secret.
 
   Ravion never reads these values. The ARNs travel to the chart as references, the chart renders an `ExternalSecret`, and the External Secrets Operator materializes the Kubernetes Secret in the cluster. No secret value reaches Ravion, the Helm values document, or the Helm release history.
@@
   | Stop timeout (secs) | No | 30 | Drain window after SIGTERM |
   | Runtime environment variables | No | - | Array of {name, value} objects |
   | Runtime secrets | No | - | Array of {name, value_from} ARN references |
+  | Deploy-provided environment variables | No | - | Names a pipeline deploy step may set to plain values |
   | Create IAM role | No | false | Create an IAM role for the workload and bind it to its pods through EKS Pod Identity |
   | IAM role name | No | {service}-task | Explicit role name, for a service whose ECS task role already holds the default |
   | IAM policy ARNs | No | [] | Managed policy ARNs attached to the workload role |
@@
         execution_environment_overrides:
           security_group: << module.input.ravion_runner_security_group_id >>
         plan_permissions: '<< module.input.terraform_plan_default_policies_enabled == false ? {"replace": module.input.terraform_plan_iam_policy_arns} : (module.input.terraform_plan_iam_policy_arns ? {"attach": module.input.terraform_plan_iam_policy_arns} : nil) >>'
-        ref: rvn-eks-worker@0.17.0
+        ref: rvn-eks-worker@1.0.0
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:

rvn-eks-worker 0.17.0 -> 1.0.0

--- remote
+++ compiled
-isGlobalPublished: false
+isGlobalPublished: true

@github-actions
github-actions Bot requested a review from flybayer October 31, 2026 17:08
@ravion-ops
ravion-ops Bot merged commit ee09452 into main Oct 31, 2026
34 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant