Horde Build Accelerator Setup

I’ve compiled and deployed Horde from the 5.6 codebase, and I am evaluating it for a potential switch from team city.

Some general questions about Horde usage

  1. Does the build accelerator sync all local changes to the remote agents when they are assisting with builds?
  2. Console devices. I added the json configuration to facilitate adding PS5 and XSX console devices, but it’s unclear to me from the documentations where to go from there.
    1. Are the IPs you register for a device you add relative to the agent that added the device? Or are they expected to be visible by the Horde Server as well?
    2. I ask because, our studio is a fully remote one, and a number of the engineers have devkits at home, so it’s critical that there is a mechanism to make available those resources for automated testing, performance capture, etc. Obviously the IP address of my home dev kits are not reachable outside of my home network, they are only
    3. I am running an agent within my home network, with the expectation that it will be the one coordinating with the horde server, and data deployments out to the dev kits would have to come from there anyways.
  3. Are there any samples of the steps that come after merely adding the devices, to help me on the path of starting to put them to work?
  4. When it comes to giving more than 1 person compute access for build acceleration, I assume you would just add them to the array in the config file along side each other?

"entries": [ { "claim": { "type": "http://epicgames.com/ue/horde/user", "value": "jane.smith" }, "actions": ["AddComputeTasks"] }, { "claim": { "type": "http://epicgames.com/ue/horde/user", "value": "john.smith" }, "actions": ["AddComputeTasks"] }, { "claim": { "type": "http://epicgames.com/ue/horde/user", "value": "agent.smith" }, "actions": ["AddComputeTasks"] } ]Yesterday, I also did the configuration for analytics, and I could see the analytics chart graphs and stuff, though they were not populated. I did confirm our editor was sending data to it though, so I assumed maybe there is a periodic digestion of that data in order to populate the charts.

Issue

Today, after upgrading from 5.5 to 5.6 horde, trying to visit the analytics page from a user account(not admin) just spins forever. I don’t think it was doing this in the 5.5 Horde

[Image Removed]

The firefox debugger shows that this is due to missing QueryMetrics permission

{“time”:“2025-06-16T18:24:35”,“level”:“Error”,“message”:“User does not have QueryMetrics permission”,“format”:“User does not have {Action} permission”,“properties”:{“Action”:“QueryMetrics”}}

First off, this seems like it should be part of the default-read profile, ie “View” group, but I’m also having trouble making an analytics group that works

I added this to the root of globals.json

[Image Removed]and have given this group to my user

[Image Removed]But it does not work, and the action is not listed under the users profile entitlements

[Image Removed] If I nest the permissions under the analytics stores, it seems to get me closer to something

[Image Removed]Because my claims now show this

[Image Removed] However, this still doesn’t work, Trying to visit analytics still gives me a forbidden error with the text about not having QueryMetrics

Issue:

Disable Agent in the agent dropdown doesn’t seem to work. Most of the dropdown options on the agent list don’t seem to do anything.

Thanks

Hi there,

I’m going to preface my response with two main Knowledge base articles which I’ve put together that highlight practical debugging for both Horde and UBA:

>Does the build accelerator sync all local changes to the remote agents when they are assisting with builds?

  • In short - yes; in long - it’s nuanced. UBA uses detours which will effectively ‘make sure all inputs required to complete a remote action are delivered’

>Console devices (etc)…

  • We are on an internal network here at Epic, so our devices & users are going to be in the same network/subnet.
  • Any agent that is therefor executing a build (and subsequent test on device via Gauntlet) would need to be able to have access to that machine via the specified IP
    • This also is true for users who are just reserving a machine
  • For next steps, we *sort of* allude to it from the DeviceManager page, but you’d most likely want to lean into the Gauntlet integration as the defacto path forward

>When it comes to giving more than 1 person compute access for build acceleration, I assume you would just add them to the array in the config file along side each other?

  • Yes, that should be manageable at that scale. Beyond that you should be able to use an OIDC claim for this.

> Yesterday, I also did the configuration for analytics, and I could see the analytics chart graphs and stuff, though they were not populated. I did confirm our editor was sending data to it though, so I assumed maybe there is a periodic digestion of that data in order to populate the charts.

  • There shouldn’t be an elongated period for digestion; it does matter how your metrics are configured (and which telemetry is being pushed into that metric)
    • There are some slightly confusing metric aggregations that depend on Job Step name etc in the metrics ‘query’ - meaning they won’t exactly get consumed if that metadata isn’t missing. When you get to a specific metric or view you’re looking at, we can investigate a bit more.

For your authentication, are you just using the Horde auth?

  • I can dig a bit more on my end with QueryMetrics via Horde auth

Julian

Yea you should - I am curious if there’s something going on there as the setup does appear correct on my reading.

Julian

One quick note [Content removed] and inspecting your user to see what entitlements are actually being folded into the claim. I’ve also found I’ve needed to log out and log back in at times.

I’ll try debugging this path later today in my local horde dev setup.

Julian

Hey there,

So I’ve just tried locally with my user:

julian.gamble

//.. other json "acl": { "entries": [ { "claim": { "type": "http://epicgames.com/ue/horde/user", "value": "julian.gamble" }, "actions": [ "QueryMetrics" ] } ] }, //.. other jsonWithin the globals.json, and things eem to work just fine. I think it’s fundamentally the placement of the ACL information within the stores. If you move this back to the global level (and not within the plugins::analytics::stores scope) it should be OK. I’ll see if I can sort out why it’s not rolling up as it feels like this should* work.

Edit:

  • After reading the code on the TelemetryController, I can see why this is the case
  • We don’t look at the Store ACL Config for the views, as we currently just evaluate the global acl config first, authorize that level and then present the views.

I’ve added a ticket to revisit our ACL structure here to see if this makes sense, as analytics is still in experimental and we have room to modify this. In the interim, if you simply move the ACL configuration outside of stores within the global.json, you should be fine.

Julian

Yes, Horde auth. Theoretically if the entitlements section of my profile shows that I have the expected claim, I should be able to access analytics, no?

Ah. Thanks.

So the only way it works is the way that doesn’t report that it’s working in the profile entitlements. :smiley:

[Image Removed]