|
| 1 | +# .buildkite/pipeline.yml |
| 2 | +steps: |
| 3 | + # -------------------------------------------------------- |
| 4 | + # STEP 1 — Get changed files |
| 5 | + # -------------------------------------------------------- |
| 6 | + - label: ":git: Detect changed files" |
| 7 | + key: detect-changes |
| 8 | + commands: |
| 9 | + - echo "--- Detecting changed files" |
| 10 | + - git fetch origin main |
| 11 | + - git diff --name-only origin/main...HEAD > changed_files.txt |
| 12 | + - echo "Changed files:" |
| 13 | + - cat changed_files.txt |
| 14 | + # Save for later steps |
| 15 | + - buildkite-agent artifact upload changed_files.txt |
| 16 | + |
| 17 | + # -------------------------------------------------------- |
| 18 | + # STEP 2 — Determine languages based on changed files |
| 19 | + # -------------------------------------------------------- |
| 20 | + - label: ":mag: Identify languages" |
| 21 | + key: list-languages |
| 22 | + depends_on: detect-changes |
| 23 | + commands: |
| 24 | + - buildkite-agent artifact download changed_files.txt . |
| 25 | + - echo "--- Extracting top-level folders" |
| 26 | + - awk -F/ '{print $1}' changed_files.txt | sort -u > languages.txt |
| 27 | + - echo "Languages found:" |
| 28 | + - cat languages.txt |
| 29 | + - buildkite-agent artifact upload languages.txt |
| 30 | + |
| 31 | + # -------------------------------------------------------- |
| 32 | + # STEP 3 — Discover frameworks per language |
| 33 | + # -------------------------------------------------------- |
| 34 | + - label: ":gear: Discover frameworks" |
| 35 | + key: list-frameworks |
| 36 | + depends_on: list-languages |
| 37 | + commands: |
| 38 | + - buildkite-agent artifact download languages.txt . |
| 39 | + - echo "--- Listing frameworks per language" |
| 40 | + - mkdir frameworks |
| 41 | + - | |
| 42 | + while read lang; do |
| 43 | + echo "Finding frameworks in $lang/" |
| 44 | + find "$lang" -maxdepth 1 -type d ! -path "$lang" -printf "%f\n" \ |
| 45 | + | grep -v '^\.$' > "frameworks/${lang}.txt" || true |
| 46 | + echo "$lang frameworks:" |
| 47 | + cat "frameworks/${lang}.txt" || echo "(none)" |
| 48 | + done < languages.txt |
| 49 | +
|
| 50 | + # Combine all into JSON pairs for clarity |
| 51 | + - | |
| 52 | + echo "[" > pairs.json |
| 53 | + first=true |
| 54 | + while read lang; do |
| 55 | + while read fw; do |
| 56 | + if [ -n "$fw" ]; then |
| 57 | + if [ "$first" = false ]; then echo "," >> pairs.json; fi |
| 58 | + echo "{\"language\":\"$lang\",\"framework\":\"$fw\"}" >> pairs.json |
| 59 | + first=false |
| 60 | + fi |
| 61 | + done < "frameworks/${lang}.txt" |
| 62 | + done < languages.txt |
| 63 | + echo "]" >> pairs.json |
| 64 | +
|
| 65 | + - echo "Discovered pairs:" |
| 66 | + - cat pairs.json |
| 67 | + - buildkite-agent artifact upload pairs.json |
| 68 | + |
| 69 | + # -------------------------------------------------------- |
| 70 | + # STEP 4 — Dynamically create one job per (language, framework) |
| 71 | + # -------------------------------------------------------- |
| 72 | + - label: ":rocket: Expand pipeline dynamically" |
| 73 | + key: expand |
| 74 | + depends_on: list-frameworks |
| 75 | + commands: |
| 76 | + - buildkite-agent artifact download pairs.json . |
| 77 | + - echo "--- Expanding pipeline dynamically" |
| 78 | + |
| 79 | + # Split into individual steps and upload |
| 80 | + - | |
| 81 | + jq -c '.[]' pairs.json | while read pair; do |
| 82 | + lang=$(echo "$pair" | jq -r '.language') |
| 83 | + fw=$(echo "$pair" | jq -r '.framework') |
| 84 | +
|
| 85 | + cat <<YAML > step.yml |
| 86 | +steps: |
| 87 | + - label: ":test_tube: Run tests - ${lang}/${fw}" |
| 88 | + command: |
| 89 | + - echo "Running tests for ${lang}/${fw}" |
| 90 | + - ./scripts/run-tests.sh ${lang} ${fw} |
| 91 | +YAML |
| 92 | + buildkite-agent pipeline upload step.yml |
| 93 | + done |
| 94 | + |
0 commit comments