@@ -526,7 +526,8 @@ jobs:
526526 ENVIRONMENT : ${{ needs.setup_deployment.outputs.environment }}
527527 TAG : ${{ needs.setup_deployment.outputs.tag }}
528528 CM_URL : ${{ needs.setup_deployment.outputs.cm_url }}
529- SCHEDULE_INSTANCES : ${{ vars.SCHEDULE_INSTANCES }}
529+ SCHEDULE_INSTANCES_DEV : ${{ vars.SCHEDULE_INSTANCES_DEV }}
530+ SCHEDULE_INSTANCES_PROD : ${{ vars.SCHEDULE_INSTANCES_PROD }}
530531 run : |
531532 # Use AI changelog for production releases, generic for dev.
532533 if [ "$ENVIRONMENT" != "dev" ] && [ -n "$CHANGELOG_CONTENT" ]; then
@@ -547,10 +548,16 @@ jobs:
547548 id=$(echo "$cmAuth" | jq -r '.id')
548549 key=$(echo "$cmAuth" | jq -r '.key')
549550
550- # CM-dev already has the products schema (same as v12). CM-prod
551- # doesn't yet, so production keeps registering one version with no
552- # product_id, exactly as before -- only dev goes through the
553- # per-product loop.
551+ # Both CM-dev and CM-prod use the products schema. The register loop
552+ # (dev) needs the per-product instance var to know which product
553+ # UUIDs to register against; prod registers once without product_id
554+ # and CM auto-assigns the owning product.
555+ if [ "$ENVIRONMENT" = "dev" ]; then
556+ SCHEDULE_INSTANCES="$SCHEDULE_INSTANCES_DEV"
557+ else
558+ SCHEDULE_INSTANCES="$SCHEDULE_INSTANCES_PROD"
559+ fi
560+
554561 if [ "$ENVIRONMENT" = "dev" ]; then
555562 if ! echo "$SCHEDULE_INSTANCES" | jq empty > /dev/null 2>&1; then
556563 echo "❌ SCHEDULE_INSTANCES is not valid JSON: $SCHEDULE_INSTANCES"
@@ -601,7 +608,8 @@ jobs:
601608 ENVIRONMENT : ${{ needs.setup_deployment.outputs.environment }}
602609 TAG : ${{ needs.setup_deployment.outputs.tag }}
603610 CM_URL : ${{ needs.setup_deployment.outputs.cm_url }}
604- SCHEDULE_INSTANCES : ${{ vars.SCHEDULE_INSTANCES }}
611+ SCHEDULE_INSTANCES_DEV : ${{ vars.SCHEDULE_INSTANCES_DEV }}
612+ SCHEDULE_INSTANCES_PROD : ${{ vars.SCHEDULE_INSTANCES_PROD }}
605613 CM_AUTH_DEV : ${{ secrets.CM_SERVICE_ACCOUNT_DEV }}
606614 CM_AUTH_PROD : ${{ secrets.CM_SERVICE_ACCOUNT_PROD }}
607615 steps :
@@ -621,52 +629,30 @@ jobs:
621629
622630 scheduled=0
623631
624- # CM-dev has the products schema (same as v12). CM-prod doesn't
625- # yet, so production keeps scheduling against the flat instance
626- # list with no product_id, exactly as before -- only dev goes
627- # through the per-product loop .
632+ # Both CM-dev and CM-prod use the products schema, so both
633+ # environments schedule per product. SCHEDULE_INSTANCES is a JSON
634+ # object mapping product UUID -> list of instance UUIDs; select the
635+ # env-specific variable .
628636 if [ "$ENVIRONMENT" = "dev" ]; then
629- if ! echo "$SCHEDULE_INSTANCES" | jq empty > /dev/null 2>&1; then
630- echo "❌ SCHEDULE_INSTANCES is not valid JSON: $SCHEDULE_INSTANCES"
631- exit 1
632- fi
633-
634- for product_id in $(echo "$SCHEDULE_INSTANCES" | jq -r 'keys[]'); do
635- for instance_id in $(echo "$SCHEDULE_INSTANCES" | jq -r --arg p "$product_id" '.[$p][]'); do
636- echo "📅 Scheduling release for instance: $instance_id (product: $product_id)"
637-
638- response=$(curl -s -w "\n%{http_code}" -X POST "${CM_URL}/api/v1/updates" \
639- -H "Content-Type: application/json" \
640- -H "id: $auth_id" \
641- -H "key: $auth_key" \
642- -d "{\"instances_ids\": [\"$instance_id\"], \"version\": \"$TAG\", \"product_id\": \"$product_id\"}")
643-
644- http_code=$(echo "$response" | tail -n1)
645- body=$(echo "$response" | sed '$d')
646-
647- if [ "$http_code" -ge 200 ] && [ "$http_code" -lt 300 ]; then
648- echo "✅ Successfully scheduled for instance: $instance_id"
649- scheduled=$((scheduled + 1))
650- else
651- echo "❌ Failed to schedule for instance: $instance_id (HTTP $http_code)"
652- echo "Response: $body"
653- exit 1
654- fi
655- done
656- done
637+ SCHEDULE_INSTANCES="$SCHEDULE_INSTANCES_DEV"
657638 else
658- IFS=',' read -ra ID_ARRAY <<< "$SCHEDULE_INSTANCES"
639+ SCHEDULE_INSTANCES="$SCHEDULE_INSTANCES_PROD"
640+ fi
659641
660- for instance_id in "${ID_ARRAY[@]}"; do
661- instance_id=$(echo "$instance_id" | xargs)
642+ if ! echo "$SCHEDULE_INSTANCES" | jq empty > /dev/null 2>&1; then
643+ echo "❌ SCHEDULE_INSTANCES is not valid JSON: $SCHEDULE_INSTANCES"
644+ exit 1
645+ fi
662646
663- echo "📅 Scheduling release for instance: $instance_id"
647+ for product_id in $(echo "$SCHEDULE_INSTANCES" | jq -r 'keys[]'); do
648+ for instance_id in $(echo "$SCHEDULE_INSTANCES" | jq -r --arg p "$product_id" '.[$p][]'); do
649+ echo "📅 Scheduling release for instance: $instance_id (product: $product_id)"
664650
665651 response=$(curl -s -w "\n%{http_code}" -X POST "${CM_URL}/api/v1/updates" \
666652 -H "Content-Type: application/json" \
667653 -H "id: $auth_id" \
668654 -H "key: $auth_key" \
669- -d "{\"instances_ids\": [\"$instance_id\"], \"version\": \"$TAG\"}")
655+ -d "{\"instances_ids\": [\"$instance_id\"], \"version\": \"$TAG\", \"product_id\": \"$product_id\" }")
670656
671657 http_code=$(echo "$response" | tail -n1)
672658 body=$(echo "$response" | sed '$d')
@@ -680,7 +666,7 @@ jobs:
680666 exit 1
681667 fi
682668 done
683- fi
669+ done
684670
685671 if [ "$scheduled" -eq 0 ]; then
686672 echo "❌ No instances were scheduled — check SCHEDULE_INSTANCES for this environment"
0 commit comments