diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 9c676ec17..1079f8eac 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -13,6 +13,24 @@ jobs: steps: - name: Check out code uses: actions/checkout@v5 + - name: Detect changed files + uses: dorny/paths-filter@v3 + id: filter + with: + list-files: shell + filters: | + shared: + - 'test/**' + - 'package.json' + - 'bun.lock' + - 'bunfig.toml' + - 'tsconfig.json' + - '.github/workflows/ci.yaml' + - 'scripts/ts_test_auto.sh' + modules: + - 'registry/**/modules/**' + all: + - '**' - name: Set up Terraform uses: coder/coder/.github/actions/setup-tf@main - name: Set up Bun @@ -27,7 +45,11 @@ jobs: - name: Install dependencies run: bun install - name: Run TypeScript tests - run: bun test + env: + ALL_CHANGED_FILES: ${{ steps.filter.outputs.all_files }} + SHARED_CHANGED: ${{ steps.filter.outputs.shared }} + MODULE_CHANGED_FILES: ${{ steps.filter.outputs.modules_files }} + run: ./scripts/ts_test_auto.sh - name: Run Terraform tests run: ./scripts/terraform_test_all.sh - name: Run Terraform Validate diff --git a/scripts/ts_test_auto.sh b/scripts/ts_test_auto.sh new file mode 100755 index 000000000..5f28e3385 --- /dev/null +++ b/scripts/ts_test_auto.sh @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Auto-detect which TypeScript tests to run based on changed files from paths-filter +# Uses paths-filter outputs from GitHub Actions: +# ALL_CHANGED_FILES - all files changed in the PR (for logging) +# SHARED_CHANGED - boolean indicating if shared infrastructure changed +# MODULE_CHANGED_FILES - only files in registry/**/modules/** (for processing) +# Runs all tests if shared infrastructure changes +# +# This script only runs tests for changed modules. Documentation and template changes are ignored. + +echo "==> Detecting changed files..." + +if [[ -n "${ALL_CHANGED_FILES:-}" ]]; then + echo "Changed files in PR:" + echo "$ALL_CHANGED_FILES" | tr ' ' '\n' | sed 's/^/ - /' + echo "" +fi + +if [[ "${SHARED_CHANGED:-false}" == "true" ]]; then + echo "==> Shared infrastructure changed" + echo "==> Running all tests for safety" + exec bun test +fi + +if [[ -z "${MODULE_CHANGED_FILES:-}" ]]; then + echo "✓ No module files changed, skipping tests" + exit 0 +fi + +CHANGED_FILES=$(echo "$MODULE_CHANGED_FILES" | tr ' ' '\n') + +MODULE_DIRS=() +while IFS= read -r file; do + if [[ "$file" =~ \.(md|png|jpg|jpeg|svg)$ ]]; then + continue + fi + + if [[ "$file" =~ ^registry/([^/]+)/modules/([^/]+)/ ]]; then + namespace="${BASH_REMATCH[1]}" + module="${BASH_REMATCH[2]}" + module_dir="registry/${namespace}/modules/${module}" + + if [[ -f "$module_dir/main.test.ts" ]] && [[ ! " ${MODULE_DIRS[*]} " =~ " ${module_dir} " ]]; then + MODULE_DIRS+=("$module_dir") + fi + fi +done <<< "$CHANGED_FILES" + +if [[ ${#MODULE_DIRS[@]} -eq 0 ]]; then + echo "✓ No TypeScript tests to run" + echo " (documentation, templates, namespace files, or modules without tests)" + exit 0 +fi + +echo "==> Running TypeScript tests for ${#MODULE_DIRS[@]} changed module(s):" +for dir in "${MODULE_DIRS[@]}"; do + echo " - $dir" +done +echo "" + +exec bun test "${MODULE_DIRS[@]}"