Build, upload, and promote — getting artifacts from the build machine into HydraRelease.
After completing the upstream phases, the pipeline has:
latest.json pointing to the promoted build, ready for downstream consumptionBuild machine HydraRelease
┌──────────────┐ ┌─────────────────────────────────────┐
│ UE Project │──package──→ │ visit-flanders-main-experience/ │
│ + HydraUE │ │ builds/ │
└──────────────┘ │ 1/ (build artifacts) │
│ │ staging/ │
│ upload via │ latest.json → build 1, v1.0.0 │
└──Perforce/Transfer──→│ │
└─────────────────────────────────────┘
Downstream services (HydraExperienceLibrary, HydraCluster, hydrabody agents) read from latest.json to know what to deploy.
Component: HydraUnrealEngine (on the build machine) Type: Sequential — must complete before anything else
The build machine has an Unreal Engine project. The project can be sourced from Perforce, Git, or simply be local. HydraUnrealEngine wraps RunUAT to package it.
# On the Windows build machine
hydraunrealengine package MyProject.uproject \
--platform Win64 \
--config Shipping \
--output C:\Builds\MyProject
HydraUnrealEngine runs preflight checks (Live Coding, Visual Studio, GameplayStateTree), then calls RunUAT. Output is a packaged build directory.
Active components: HydraUnrealEngine only — everything else is idle.
Type: Sequential (follows Phase 1) — but the upload path has two parallel options
The build needs to get from the build machine to HydraRelease. Two paths:
If the build machine submits the output to Perforce:
//visitflanders/main/Builds/...)p4 printPOST /api/v1/builds on HydraRelease to register the buildPOST /api/v1/builds/notifyActive components: Perforce server, HydraPerforce, HydraRelease
If not using Perforce:
POST /api/v1/builds on HydraRelease directlyhydrarelease build submit \
--server https://releases.experiencenet.com \
--project visit-flanders-main-experience \
--uploaded-by ci-pipeline \
--token $HYDRARELEASE_AUTH_TOKEN \
experience.zip
hydrarelease build list --project visit-flanders-main-experience \
--server https://releases.experiencenet.com
hydrarelease build show --project visit-flanders-main-experience --build 1 \
--server https://releases.experiencenet.com
SSE event emitted: build.uploaded
Component: HydraRelease Type: Sequential (follows Phase 2)
The uploaded build is just a build — it is not deployed anywhere yet. Promotion makes it a release in a specific environment.
hydrarelease release promote \
--server https://releases.experiencenet.com \
--project visit-flanders-main-experience \
--env staging \
--build 1 \
--version "1.0.0" \
--notes "Initial staging release" \
--token $HYDRARELEASE_AUTH_TOKEN
This:
releases.yamllatest.json at /<project>/staging/latest.json with {"version":"1.0.0","build_number":1}previous_build_number for future rollbackrelease.promoted SSE eventhydrarelease release show \
--project visit-flanders-main-experience --env staging \
--server https://releases.experiencenet.com
curl https://releases.experiencenet.com/visit-flanders-main-experience/staging/latest.json
hydrarelease release rollback \
--project visit-flanders-main-experience --env staging \
--server https://releases.experiencenet.com \
--token $HYDRARELEASE_AUTH_TOKEN
This reverts to previous_build_number, writes a new latest.json, and triggers reprovisioning of all affected nodes.
SSE event emitted: release.promoted / release.rolled-back
Active components: HydraRelease only