diff --git a/.github/workflows/deployments.yml b/.github/workflows/deployments.yml
index 91b02f92717..852986f2f0a 100644
--- a/.github/workflows/deployments.yml
+++ b/.github/workflows/deployments.yml
@@ -869,6 +869,26 @@ jobs:
environment: ghcr-deployment
run_validation: false # validation runs in the Validation workflow
+ realtime_binaries:
+ name: Create CUDA Quantum Realtime installer
+ needs: metadata
+ if: >-
+ needs.metadata.outputs.create_packages == 'true'
+ && ! inputs.devcontainer_only
+ strategy:
+ matrix:
+ platform: [amd64, arm64]
+ cuda_version: ["12.6", "13.0"]
+ fail-fast: false
+ uses: ./.github/workflows/realtime_prebuilt_binaries.yml
+ secrets:
+ DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
+ DOCKERHUB_READONLY_TOKEN: ${{ secrets.DOCKERHUB_READONLY_TOKEN }}
+ with:
+ platform: ${{ matrix.platform }}
+ cuda_version: ${{ matrix.cuda_version }}
+ environment: ghcr-deployment
+
macos_ci:
name: macOS CI
needs: metadata
@@ -884,7 +904,7 @@ jobs:
# Deployments; this job is the opt-in path for manual dispatches.
trigger_validation:
name: Trigger Validation
- needs: [summary, python_wheels, binaries]
+ needs: [summary, python_wheels, binaries, realtime_binaries]
if: inputs.run_validation_after
runs-on: ubuntu-latest
permissions:
diff --git a/.github/workflows/validation.yml b/.github/workflows/validation.yml
index be693f33ce7..0336d527b9d 100644
--- a/.github/workflows/validation.yml
+++ b/.github/workflows/validation.yml
@@ -632,6 +632,61 @@ jobs:
retention-days: 1
if-no-files-found: error
+ realtime_artifacts:
+ name: Realtime installers
+ needs: metadata
+ runs-on: ubuntu-latest
+ permissions:
+ actions: read
+
+ outputs:
+ has_realtime_installers: ${{ steps.fetch.outputs.has_realtime_installers }}
+
+ steps:
+ - name: Fetch realtime installers from Deployments run
+ id: fetch
+ run: |
+ retry() { for n in 1 2 3; do "$@" && return 0; [ $n -lt 3 ] && sleep $((15*n*n)); done; return 1; }
+ artifacts_url="${{ needs.metadata.outputs.artifacts_url }}"
+ if [ -z "$artifacts_url" ]; then
+ echo "No artifacts URL available."
+ echo "has_realtime_installers=false" >> $GITHUB_OUTPUT
+ exit 0
+ fi
+
+ artifacts=$(retry gh api $artifacts_url --paginate -q '.artifacts[] | {name: .name, url: .archive_download_url}')
+
+ has_realtime_installers=false
+ mkdir -p installers
+
+ while IFS= read -r artifact; do
+ name=$(echo "$artifact" | jq -r '.name')
+ url=$(echo "$artifact" | jq -r '.url')
+
+ if [[ "$name" == install_cuda_quantum_realtime_* ]]; then
+ echo "Downloading realtime installer: $name"
+ retry gh api "$url" > "${name}.zip"
+ unzip "${name}.zip" -d installers/
+ rm "${name}.zip"
+ has_realtime_installers=true
+ fi
+ done <<< "$(echo "$artifacts" | jq -c '.')"
+
+ echo "has_realtime_installers=$has_realtime_installers" >> $GITHUB_OUTPUT
+ env:
+ GH_TOKEN: ${{ github.token }}
+
+ # Re-upload under a single name so create_release can pull them with one
+ # download step (they are built in Deployments, i.e. a different run).
+ - name: Upload realtime installers
+ if: steps.fetch.outputs.has_realtime_installers == 'true'
+ uses: actions/upload-artifact@v7
+ with:
+ name: realtime-installers
+ path: installers/
+ retention-days: 1
+ if-no-files-found: error
+
installer_validation:
name: Installer validation
needs: [metadata, cudaq_installers]
@@ -1049,7 +1104,7 @@ jobs:
name: CUDA-Q Release (draft)
# Validation jobs stay in needs so the draft runs after them, but the if:
# does not require them to pass.
- needs: [metadata, cudaq_installers, cudaq_wheels, cudaq_metapackages, macos_artifacts, release_image_validation, debug_image_validation, installer_validation, wheel_validation_piponly, metapackage_validation_conda, metapackage_validation_macos]
+ needs: [metadata, cudaq_installers, cudaq_wheels, cudaq_metapackages, macos_artifacts, realtime_artifacts, release_image_validation, debug_image_validation, installer_validation, wheel_validation_piponly, metapackage_validation_conda, metapackage_validation_macos]
# Draft on a requested release title; tolerate validation flakes but require
# the build jobs (nothing to attach otherwise).
if: >-
@@ -1078,6 +1133,13 @@ jobs:
pattern: '*-wheels'
path: wheelhouse
+ - name: Download CUDA-Q Realtime installer
+ if: needs.realtime_artifacts.outputs.has_realtime_installers == 'true'
+ uses: actions/download-artifact@v8
+ with:
+ name: realtime-installers
+ path: installers
+
- name: Download CUDA-Q metapackages
uses: actions/download-artifact@v8
with:
@@ -1128,6 +1190,13 @@ jobs:
rel_notes+="
:warning: Created despite one or more validation failures; review the Validation run before publishing."
fi
+ # Realtime installers are built in Deployments, so a gap there would
+ # otherwise cut a release without them and go unnoticed.
+ if [ "${{ needs.realtime_artifacts.outputs.has_realtime_installers }}" != "true" ]; then
+ echo "::warning::No realtime installers found in the deployment run."
+ rel_notes+="
:warning: No realtime installers were attached; check the Deployments run."
+ fi
+
gh release create $release_id --title $release_id -R ${{ github.repository }} \
--target $github_commit --draft $prerelease \
--generate-notes --notes-start-tag $latest_tag --notes "$rel_notes"