[Horde](../../README.md) > [Configuration](../Config.md) > Artifacts # Artifacts An artifact in Horde refers to a set of archived files produced by a build process. The archive corresponds to a particular commit in VCS, allowing for searching for artifacts produced between in a particular stream across a range of time, and includes other indexed keys and metadata that can help it to be manipulated by external tools. Amongst other things, artifacts can be used to store: - Packaged builds - Precompiled editor builds for UnrealGameSync (often referred to as "PCBs") - Intermediate artifacts transferred between agents by BuildGraph - Test results - Logs and traces ## Configuration Settings for artifacts are configured by their **artifact type**, which are specified at upload time. Artifact types are arbitrary string identifiers (case insensitive alpha-numeric strings, or the characters `-`, `_`, `.`). Artifact types are customizable, and new types may be added as needed. They must be declared through Horde config files before Horde will allow clients to upload artifacts of that type. Types may be configured through the `artifactTypes` property at the [global](Schema/Globals.md#buildconfig), [project](Schema/Projects.md), or [stream](Schema/Streams.md) scopes. ### Standard Artifact Types Horde produces certain artifact types by default: - `step-output`: Output from a build step which can be used by other build steps. These artifacts are produced based on dependencies between steps configured through BuildGraph. - `step-saved`: Contents of the AutomationTool log folder, harvested from the agent executing a job once it completes. The Horde Agent sets the path to this output folder for jobs via the `uebp_LogFolder` environment variable (normally `Engine/Programs/AutomationTool/Saved/Logs`). - `step-trace`: Telemetry and trace data for a build step, harvested from the directory given by the `UE_TELEMETRY_DIR` environment variable (normally `Engine/Programs/AutomationTool/Saved/Telemetry`). AutomationTool and UnrealBuildTool write timing information for their execution to this folder using the in JSON format, which are replicated to the configured telemetry provider. - `step-testdata`: Data written to the directory given by the `UE_TESTDATA_DIR` environment variable by a build step (normally `Engine/Programs/AutomationTool/Saved/TestData`). Json files in this directory will also be harvested for test data results and surfaced to Automation Hub. ### Expiration Artifacts may be expired automatically using the following settings: - [KeepCount](Schema/Globals.md#artifacttypeconfig): Retains the most recent `N` artifacts of a particular type in each stream. - [KeepDays](Schema/Globals.md#artifacttypeconfig): Retains each artifact for `N` days. If both settings are specified, the artifact will be retained until neither retention policy applies. If the configuration for an artifact is removed from Horde - because a stream is deleted, for example - any orphanned artifacts will be expired according to the last configured settings. ## Uploading Artifacts Artifacts can be produced by build processes using the `CreateArtifact` BuildGraph task within a node, or using the `Artifact` element to indicate that a produced tag should be published as an artifact. Artifacts produced by build jobs will be listed at the top of the dashboard page for that job. An example of using the `CreateArtifact` task can be found in the `Engine/Build/InstalledEngineBuild.xml` script, which uploads the complete installed build as an `installed-build` artifact type: ```xml ``` An example of using the `Artifact` element can be found in the `Engine/Build/Graph/Examples/BuildEditorAndTools.xml` script, which uploads a set of files as a `ugs-pcb` artifact type. UnrealGameSync searches for this artifact type to determine which archives are available, along with their associated project and archive type. ```xml ``` Artifacts may also be uploaded programmatically using the `EpicGames.Horde` library. ## Downloading Artifacts The easiest way to download an artifact is via the Horde dashboard. While convenient, downloading a zip file directly from the dashboard can be slow and inefficient due to the work the server has to do to re-pack data in that format. To download artifacts in their native format - which is typically much faster and more efficient - the following methods are available: - **UnrealGameSync**: The Horde dashboard allows downloading an artifact as a `.uartifact` file; a JSON file containing metadata about an artifact. Double-clicking on these files will open them in UnrealGameSync and allow downloading them to a local folder. - **Command line**: The Horde command line tool allows downloading artifacts to an output folder using the following syntax: ```bat horde artifact download -Id=12345678abcd12345678abcd -OutputDir=C:\Folder ``` Artifacts can be enumerated using the `artifact find` command: ```bat horde artifact find -streamid=ue5-main -type=step-saved -jobid=670fce208961cf36f3855ff0 -stepid=4994 ``` - **Programmatically**: The `EpicGames.Horde` library provides interfaces for enumerating and downloading artifacts programmatically. The Horde command-line tool serves as an example for using this API to query artifacts. The `RetrieveArtifact` task can be used to find and download artifacts from a build script. By default, the task will search for an artifact in the current stream, at the current changelist - though the `Stream` and `Commit` attributes can be used to choose a different source. ```xml ``` Additionally, specifying the `MaxCommit` parameter will find the most recent artifact at or before the given change. ## Keys & Metadata Artifacts are designed to be consumed programmatically and include various metadata fields allowing them to be manipulated in a standard way, such as a name, type, stream, and commit identifier. Artifacts also support user-defined **keys and metadata**. Both are arbitrary strings attached to an artifact, with the difference that keys are globally indexed and support searching, and metadata is not. All artifacts uploaded by a particular job will automatically have `job:12345678abcd12345678abcd` and `job:12345678abcd12345678abcd/step:abcd` keys added to them.