#!/usr/bin/env bash # Splits a JSON array of app IDs proportionally between GitHub-hosted and # self-hosted CI runners. # # When CI_SELF_HOSTED_RUNNER_COUNT is 0 or unset, all apps are assigned to # the GitHub-hosted batch and the self-hosted batch is empty — CI behaves # exactly as before with no self-hosted runners registered. # # The split ratio mirrors the relative throughput of each runner pool: # github_count = floor(total × GITHUB_QUOTA / (GITHUB_QUOTA + SELF_HOSTED_COUNT)) # # Inputs (environment variables): # APPS_JSON JSON array of app IDs from the discover step # CI_SELF_HOSTED_RUNNER_COUNT self-hosted runner instance count (default: 0) # INFINITO_CI_CONCURRENCY GitHub-hosted runner slots (SPOT: default.env) # # Outputs (appended to $GITHUB_OUTPUT): # apps_github JSON array routed to GitHub-hosted runners # apps_self_hosted JSON array routed to self-hosted runners ([] when disabled) set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)" if [[ -f "${REPO_ROOT}/scripts/meta/env/load.sh" ]]; then # shellcheck source=scripts/meta/env/load.sh source "${REPO_ROOT}/scripts/meta/env/load.sh" fi APPS_JSON="${APPS_JSON:-[]}" SELF_HOSTED_COUNT="${CI_SELF_HOSTED_RUNNER_COUNT:-0}" GITHUB_QUOTA="${INFINITO_CI_CONCURRENCY:?INFINITO_CI_CONCURRENCY must be set (SPOT: default.env)}" if [[ "${SELF_HOSTED_COUNT}" -le 0 ]]; then echo "apps_github=${APPS_JSON}" >>"${GITHUB_OUTPUT}" echo "apps_self_hosted=[]" >>"${GITHUB_OUTPUT}" total="$(echo "${APPS_JSON}" | jq 'length')" echo "=== Runner split: all ${total} apps → GitHub-hosted (self-hosted disabled) ===" exit 0 fi total="$(echo "${APPS_JSON}" | jq 'length')" github_count=$((total * GITHUB_QUOTA / (GITHUB_QUOTA + SELF_HOSTED_COUNT))) self_count=$((total - github_count)) apps_github="$(echo "${APPS_JSON}" | jq -c ".[0:${github_count}]")" apps_self="$(echo "${APPS_JSON}" | jq -c ".[${github_count}:]")" echo "apps_github=${apps_github}" >>"${GITHUB_OUTPUT}" echo "apps_self_hosted=${apps_self}" >>"${GITHUB_OUTPUT}" echo "=== Runner split: ${github_count} apps → GitHub-hosted, ${self_count} apps → self-hosted (${SELF_HOSTED_COUNT} runners) ==="