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
The Upstream (Ingest) card on the hydrapipeline admin dashboard (/admin) shows two sub-sections:
When jobs_url and admin_token are set for hydraunrealengine-server in hydrapipeline's config, a collapsible UE Jobs panel appears inline under hydraunrealengine-server — shows the last packaging job with status, platform, config, started time, and a download link when the job completed with delivery.
The panel is hidden when no job has run since the server last started (status = idle). It appears after the first packaging job runs and persists until the server restarts.
| Column | Description |
|---|---|
| Status | preflight / packaging / uploading / completed / failed / cancelled |
| Platform | Win64 |
| Config | Development / Shipping |
| Started | ISO 8601 timestamp |
| Download | Link to the delivered build on HydraTransfer (completed jobs only) |
Config fields in hydrapipeline's /var/lib/hydrapipeline/config.yaml:
- name: hydraunrealengine-server
type: service
url: https://hydraunrealengine.experiencenet.com
health_url: https://hydraunrealengine.experiencenet.com/api/v1/health
jobs_url: https://hydraunrealengine.experiencenet.com/api/v1/jobs
admin_token: "<token>"
group: upstream