{"id":4553,"date":"2025-10-09T15:41:08","date_gmt":"2025-10-09T19:41:08","guid":{"rendered":"https:\/\/www.wholetomato.com\/blog\/?p=4553"},"modified":"2025-10-09T16:03:27","modified_gmt":"2025-10-09T20:03:27","slug":"beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap","status":"publish","type":"post","link":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/","title":{"rendered":"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]"},"content":{"rendered":"<p class=\"whitespace-normal break-words\">This is the second session in a three-part webinar series on Unreal Engine 5 workflows with Assembla and Visual Assist. Today&#8217;s presenters are John Scott, chief architect at Assembla with over 35 years of game development experience including 20 years with Unreal Engine and time as a senior programmer at Epic Games, and Montana Mendy, solutions engineer at Assembla.<\/p>\n<p class=\"whitespace-normal break-words\">This session demonstrates downloading Unreal Engine 5 source from GitHub and adding it to a single tenant Perforce instance in Assembla. The focus is on building practical workflows using Perforce streams for version control, configuring security properly, and setting up branching strategies that scale with team development.<\/p>\n<p style=\"text-align: center;\"><iframe loading=\"lazy\" title=\"YouTube video player\" src=\"https:\/\/www.youtube.com\/embed\/oselMD7GIKA?si=lXtx09-waHepjjH9\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"allowfullscreen\"><\/iframe><\/p>\n<p style=\"text-align: center;\">Watch the webinar replay here.<\/p>\n<h3 style=\"text-align: left;\">Hardware Requirements for Source Compilation<\/h3>\n<p class=\"whitespace-normal break-words\">Before proceeding, Scott emphasizes the hardware demands of compiling Unreal Engine 5 from source. The machine used in this demonstration includes a Threadripper Pro with 32 cores and 64 threads, 128 GB of RAM at 3200 MHz, and 5 TB of NVME storage.<\/p>\n<p class=\"whitespace-normal break-words\">According to Scott, the goal is approximately 2 GB of RAM per CPU thread for compilation. NVME storage is critical for compile times. Scott recommends hardware of this caliber, warning that &#8220;otherwise, you&#8217;ll be spending the vast majority of your day waiting for compilation to finish.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Without powerful hardware or a build farm, source compilation becomes impractical for daily development.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Linking Epic Games and GitHub Accounts<\/h3>\n<p class=\"whitespace-normal break-words\">The first step requires creating an Epic Games account and a GitHub account, then linking them. Scott walks through the process: go to epicgames.com, click on your profile, navigate to Account, select Linked Accounts, and choose GitHub. Follow the instructions to authorize the connection.<\/p>\n<p class=\"whitespace-normal break-words\">Epic Games will send an email welcoming you to the Epic Games GitHub repository. This grants access to the Unreal Engine 5 source code.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Downloading Unreal Engine 5 Source<\/h3>\n<p class=\"whitespace-normal break-words\">After linking accounts, Epic sends an invitation to the organization on GitHub. Scott navigates to the Unreal Engine branch and downloads the source code. He notes that clicking &#8220;Open in GitHub Desktop&#8221; still uses Git, which isn&#8217;t helpful when the goal is using Perforce, so he downloads the ZIP file instead.<\/p>\n<p class=\"whitespace-normal break-words\">The download and decompression take approximately 15 to 20 minutes depending on internet connection speed. Scott creates a dedicated folder structure for the engine source.<\/p>\n<p class=\"whitespace-normal break-words\">Once decompressed, the next step is running <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">Setup.bat<\/code> from the engine source directory. This downloads necessary dependencies and takes considerable time to complete.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Critical Advice Before Compilation<\/h3>\n<p class=\"whitespace-normal break-words\">Scott offers important guidance here. &#8220;At this point, you&#8217;ll be tempted to run generate project files, load in the project, and try to compile it. I would recommend that I would check everything in first so you don&#8217;t check in any temporary files.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">This prevents generated and temporary files from polluting the repository.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Creating and Configuring the Perforce Depot<\/h3>\n<p class=\"whitespace-normal break-words\">Scott connects to a Perforce server that Andre (from Assembla&#8217;s team) prepared for the demonstration. He creates a new depot and explains why streams are essential.<\/p>\n<p class=\"whitespace-normal break-words\">&#8220;We want it to be stream,&#8221; Scott says. &#8220;We definitely for better branching strategies down the road.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">The depot is created as a stream depot, which enables the branching model that supports multiple engine versions and development workflows.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Securing Your Perforce Server<\/h3>\n<p class=\"whitespace-normal break-words\">Before setting up streams, Scott addresses security configuration. This section is critical for production environments.<\/p>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">User Permissions<\/h4>\n<p class=\"whitespace-normal break-words\">Scott navigates to Tools &gt; Administration &gt; Permissions. He points out that by default, the &#8220;remote&#8221; user has full access to everything, which he describes as &#8220;quite strange.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">His recommendation: &#8220;Use this line here to block every user from everything in all depots and then specifically enable specific users or groups as and when needed.&#8221;<\/p>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Configurables for Security<\/h4>\n<p class=\"whitespace-normal break-words\">Scott reviews several important server configurables:<\/p>\n<ul>\n<li class=\"whitespace-normal break-words\"><strong>Security level<\/strong> should be set to at least 2 or 3 for strong passwords and ticket-based authentication. Scott warns that setting it to zero means &#8220;you don&#8217;t even need a password, which for a server that&#8217;s available on the internet, that is a very bad idea.&#8221;<\/li>\n<li class=\"whitespace-normal break-words\"><strong>MinClient<\/strong> version should be set to prevent older P4V clients from connecting. Scott sets it to 2023.1, explaining that older versions &#8220;can be a performance hit as the server has to jump through hoops to support older versions.&#8221;<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Run.users<\/strong> should be set to &#8220;authorize&#8221; to prevent unauthenticated users from listing users on the server. Scott notes this prevents attackers from obtaining user lists for brute force attacks.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>dm.user.noautocreate<\/strong> prevents the server from automatically creating users when someone tries to access a nonexistent account. Scott emphasizes this is important when &#8220;you&#8217;re paying on a per license basis.&#8221;<\/li>\n<li class=\"whitespace-normal break-words\"><strong>dm.password.minlength<\/strong> should be set to at least 8 characters, though Scott notes &#8220;you can go to 10 or 12 or 27 if you like.&#8221;<\/li>\n<li class=\"whitespace-normal break-words\"><strong>dm.user.setinitialpassword<\/strong> ensures only super users can set initial passwords for new users.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>dm.user.resetpassword<\/strong> requires new users to change their initial password on first login.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>dm.info<\/strong> hides private information from the <code class=\"bg-text-200\/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded-[0.4rem] px-1 py-px text-[0.9rem]\">p4 info<\/code> command. &#8220;The less information out there, the better,&#8221; Scott explains.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>dm.user.hideinvalid<\/strong> prevents error messages on authentication failures to mitigate brute force attacks.<\/li>\n<\/ul>\n<p>Multi-Factor Authentication Alternatives<\/p>\n<p class=\"whitespace-normal break-words\">Scott discusses multi-factor authentication for Perforce servers. While MFA plugins exist, he notes they require compilation and installing plugins from GitHub, which is &#8220;quite a pain to set up.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">His recommended alternative: &#8220;What is much easier is to install a VPN and a VPN with multi-factor authentication. So then you&#8217;re behind the VPN and the multi-factor authentication is built in at that point.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Cloud providers can typically whitelist IP addresses or ranges. If developers work from the same office, IP whitelisting helps significantly. For distributed teams with dynamic IPs, VPNs provide a more practical solution.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Creating the Stream Structure<\/h3>\n<p class=\"whitespace-normal break-words\">Scott creates a branching structure designed for managing multiple Unreal Engine versions and team development.<\/p>\n<ul>\n<li class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\"><strong>Mainline Stream<br \/>\n<\/strong>First, he creates the mainline stream. This serves as the stable integration point where builds are generated.<\/li>\n<li><strong>Master Streams for Engine Versions<\/strong><br \/>\nScott creates a stream called &#8220;master UE 5.6&#8221; as a development branch under mainline. This stream holds the unmodified source from Epic Games for that specific engine version.<\/li>\n<li class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\"><strong>Development Streams<\/strong><br \/>\nHe creates personal development streams (dev\/John, dev\/Montana) where individual developers work on their changes.<\/li>\n<li class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\"><strong>Release Streams<\/strong><br \/>\nScott creates an alpha release stream as a release branch from mainline. This is where stable releases are tagged.<\/li>\n<\/ul>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Planning for Future Engine Versions<\/h4>\n<p class=\"whitespace-normal break-words\">For future engine upgrades, Scott demonstrates creating a &#8220;UE 5.7 merge&#8221; development branch from mainline, then a &#8220;master UE 5.7&#8221; branch underneath it.<\/p>\n<p class=\"whitespace-normal break-words\">He explains the workflow: &#8220;What will happen is the developer working on this will sync from mainline every day to get your latest changes that you&#8217;ve been working on in your company.&#8221; The developer copies up from the new engine master to the merge branch, works through all conflicts in the merge branch, and once everything works correctly, copies up to mainline.<\/p>\n<p class=\"whitespace-normal break-words\">This structure isolates the upgrade work and allows the team to continue mainline development without disruption.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Creating Workspaces and Adding Files<\/h3>\n<p class=\"whitespace-normal break-words\">Scott creates a workspace mapped to the UE 5.6 master stream. He begins adding files to Perforce, starting with small root files to verify everything works correctly.<\/p>\n<p class=\"whitespace-normal break-words\">&#8220;As there are quarter of a million files here, adding them all in one changelist is very time consuming and should anything go wrong, you&#8217;ll have to start from scratch,&#8221; Scott explains. His approach is to add folders one at a time.<\/p>\n<p class=\"whitespace-normal break-words\">He submits the templates folder with 5,085 files as a test. For the demonstration, Scott skips the tedious process of adding every folder individually, but he recommends this approach for production setups.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Handling Text Encoding Issues<\/h3>\n<p class=\"whitespace-normal break-words\">After adding all files, Scott runs &#8220;Reconcile Offline Work&#8221; to check for missing files. This reveals resource files in the Nvidia texture tools that have encoding problems.<\/p>\n<p class=\"whitespace-normal break-words\">&#8220;That&#8217;s the classic problem with UTF-16 getting confused with regular text files,&#8221; Scott says. &#8220;This has annoyed me in the past to the point where I actually made a utility to fix up and remove all UTF files from a repo.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">He runs a utility called &#8220;UTF-16 Must Die&#8221; (available on GitHub) to convert these files to UTF-8. The tool converts all UTF-16 files in the repository to proper UTF-8 text files that Perforce handles correctly.<\/p>\n<p class=\"whitespace-normal break-words\">Scott mentions that if developers want to understand why UTF-8 should always be used, they should visit utf8everywhere.org.<\/p>\n<p class=\"whitespace-normal break-words\">He reverts most of these conversions because the goal is keeping the master stream as similar as possible to Epic&#8217;s source. However, he notes that teams can optionally remove unnecessary localization files to save space.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Copying to Mainline<\/h3>\n<p class=\"whitespace-normal break-words\">Once the UE 5.6 master stream is populated, Scott copies all files to the mainline stream. He creates a new workspace for mainline and uses the stream graph to copy files from the master to mainline.<\/p>\n<p class=\"whitespace-normal break-words\">The copy operation takes considerable time given the repository size.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Generating Project Files and Compiling<\/h3>\n<p class=\"whitespace-normal break-words\">With files in mainline, Scott generates the Visual Studio project files. The generation completes successfully, though it doesn&#8217;t generate for all platforms since not all platform SDKs are installed. As long as Windows builds work, development can proceed.<\/p>\n<p class=\"whitespace-normal break-words\">Scott opens the generated solution in Visual Studio. The solution contains numerous projects representing different engine components.<\/p>\n<p class=\"whitespace-normal break-words\">Visual Studio indicates missing components for full development. Scott pauses the recording to install required NuGet packages and additional tools.<\/p>\n<p class=\"whitespace-normal break-words\">After updating dependencies and reverting unchanged files, Scott builds the Development Editor 64-bit target. The compilation finally completes successfully.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Creating Test Projects<\/h3>\n<p class=\"whitespace-normal break-words\">Scott runs the Unreal Engine editor for the second time. He notes the first run spent significant time compiling shaders, which he skips for the demonstration.<\/p>\n<p class=\"whitespace-normal break-words\">He recommends creating two projects: &#8220;The main project you do production work in and a sandbox to play around in.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">To make the sandbox project appear in Visual Studio&#8217;s Solution Explorer, Scott explains a specific workflow: open the sandbox project in Unreal Engine, go to Tools &gt; New Class, add a blank class (it doesn&#8217;t need functionality), then regenerate project files. This makes the project appear properly in the solution.<\/p>\n<p class=\"whitespace-normal break-words\">He sets the sandbox project as the startup project so pressing F5 runs it directly.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Making Engine Changes<\/h3>\n<p class=\"whitespace-normal break-words\">Scott demonstrates making a sample change to engine code. He opens an audio editor source file and adds a comment with a specific format.<\/p>\n<p class=\"whitespace-normal break-words\">&#8220;Any change you make to the engine, I&#8217;d recommend you comment with your company name begin and then your initials,&#8221; Scott advises. He uses the format:<\/p>\n<div class=\"wp-block-codemirror-blocks code-block\">\n<pre class=\"CodeMirror\" data-setting=\"{&quot;mode&quot;:&quot;clike&quot;,&quot;mime&quot;:&quot;text\/x-c++src&quot;,&quot;theme&quot;:&quot;idea&quot;,&quot;lineNumbers&quot;:false,&quot;lineWrapping&quot;:false,&quot;styleActiveLine&quot;:false,&quot;readOnly&quot;:true,&quot;align&quot;:&quot;&quot;}\">\/\/ ANDUIN-BEGIN JJS \r\n\/\/ Pointless comment \r\n\/\/ ANDUIN-END<\/pre>\n<\/div>\n<p class=\"whitespace-normal break-words\">This tagging system serves a critical purpose: &#8220;Whenever you&#8217;re upgrading to a new version, you can search for ANDUIN. It will have any changes you make and the person to talk to about why they made those changes.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">After making the change, Scott connects to Perforce, checks out the file, and submits it. The stream graph now shows that changes exist in the personal branch that need to be copied to mainline.<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Q&amp;A session<\/h3>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Branching Strategy for Engine Versions<\/h4>\n<p class=\"whitespace-normal break-words\">A participant asks about the UE 5.7 merged stream and the branch underneath it.<\/p>\n<p class=\"whitespace-normal break-words\">Scott explains: &#8220;The 5.7 wants to be an unmodified master of UE 5.7 which has no changes whatsoever. So then you always have you can do a difference between the files in the 5.6 master to the 5.7 master to see what has changed.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">This structure maintains a source of truth for what Epic supplied versus the team&#8217;s working version. Montana follows up asking if this simplifies future upgrades, and Scott confirms: &#8220;Yes, it does. It keeps everything more contained.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Scott elaborates that from experience, branching different engine versions can create significant confusion. &#8220;Having a source of truth for what is supplied from Epic versus your working version is a definite boon.&#8221;<\/p>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Single Stream vs. Multiple Streams for Engine Versions<\/h4>\n<p class=\"whitespace-normal break-words\">Another question asks about using a single stream and merging different Unreal Engine versions progressively instead of having separate streams for each version.<\/p>\n<p class=\"whitespace-normal break-words\">Scott responds that both approaches work. His method allows diffing between UE 5.6 and 5.7 directly rather than using history in a single master branch. &#8220;So up to you your preferred method of doing it.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Montana suggests creating task streams as another option. Scott adds that having completely separate masters helps with debugging: &#8220;Sometimes it&#8217;s handy when you find a bug and did this bug exist in UE 5.6, did this bug exist in 5.7.&#8221;<\/p>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Working Without Streams<\/h4>\n<p class=\"whitespace-normal break-words\">A participant mentions their company has IT-controlled Perforce servers without streams enabled and asks for tips on branch flows without streams.<\/p>\n<p class=\"whitespace-normal break-words\">Scott&#8217;s short answer: &#8220;No. It&#8217;s been over a decade since I&#8217;ve actually done that. So I wouldn&#8217;t feel confident on commenting on that.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Andre from Assembla provides more technical detail. He explains that migrating from depot to streams is non-trivial. If a Perforce server is IT-controlled and hasn&#8217;t been upgraded, it needs gradual updates to support modern features.<\/p>\n<p class=\"whitespace-normal break-words\">&#8220;When you create a branch you won&#8217;t be using too much storage&#8221; with streams, Andre explains. &#8220;But when you create a full copy of a depot as a branch it will be as large as the initial depot.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Without streams, branching requires full depot copies, which consumes massive storage and makes branch management impractical. Andre notes that Assembla can assist with migrating older Perforce servers to versions supporting streams.<\/p>\n<h4 class=\"text-lg font-bold text-text-100 mt-1 -mb-1.5\">Repository Size<\/h4>\n<p class=\"whitespace-normal break-words\">When asked how large the repository gets with UE5 and project files, Scott clarifies that project files aren&#8217;t shipped. &#8220;They&#8217;re generated on each client.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">For repository size, Scott mentions the largest Perforce depot he&#8217;s heard of is 56 terabytes. For the vanilla setup demonstrated, he asks Andre to check the actual size of the test server.<\/p>\n<p class=\"whitespace-normal break-words\">Andre confirms: &#8220;About 40 gigabytes.&#8221;<\/p>\n<p class=\"whitespace-normal break-words\">Scott notes that content drives repository growth. &#8220;As soon as you start generating assets, especially Nanite assets, then that is going to explode.&#8221;<\/p>\n<h3 class=\"text-xl font-bold text-text-100 mt-1 -mb-0.5\">Key Takeaways<\/h3>\n<p class=\"whitespace-normal break-words\">Scott and Montana&#8217;s demonstration provides several critical insights for teams working with Unreal Engine 5 source:<\/p>\n<ul>\n<li class=\"whitespace-normal break-words\"><strong>Hardware matters significantly.<\/strong> Without adequate CPU cores, RAM, and fast storage, source compilation becomes impractical for daily development.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Security configuration is essential.<\/strong> Default Perforce settings are permissive and unsuitable for production environments. Proper user permissions, password policies, and access controls must be configured before adding production code.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Stream structure enables scalability.<\/strong> Properly designed streams isolate engine versions, support parallel development, and simplify upgrades. The &#8220;merge down, copy up&#8221; workflow keeps mainline stable while allowing experimental work in isolated branches.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Tagging engine modifications is critical.<\/strong> Consistent comment formatting identifying company and developer makes future engine upgrades manageable.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Incremental file addition prevents problems.<\/strong> Adding quarter-million file repositories in single operations risks failure. Adding folders incrementally provides recovery points if issues occur.<\/li>\n<li class=\"whitespace-normal break-words\"><strong>Text encoding matters.<\/strong> UTF-16 files cause problems with Perforce and build tools. Converting to UTF-8 prevents these issues.<\/li>\n<\/ul>\n<p class=\"whitespace-normal break-words\">For teams serious about Unreal Engine 5 source compilation, these workflows provide a foundation that scales from small teams to large studios. The next session in this series will cover CI\/CD pipelines that understand game development realities.<\/p>\n<p class=\"whitespace-normal break-words\">Teams interested in single tenant Perforce instances managed by Assembla can visit getassembla.com or contact the team directly for assistance with setup and migration.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is the second session in a three-part webinar series on Unreal Engine 5 workflows with Assembla and Visual Assist. Today&#8217;s presenters are John Scott, chief architect at Assembla with over 35 years of game&#8230;<\/p>\n","protected":false},"author":213500340,"featured_media":4560,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_newsletter_tier_id":0,"footnotes":"","jetpack_publicize_message":"","jetpack_is_tweetstorm":false,"jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[726359896],"tags":[726360497,726360493,726360495,726359791],"class_list":["post-4553","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-webinar-recap","tag-assembla-p4","tag-game-development-workflow","tag-perforce-streams","tag-unreal-engine-5"],"jetpack_publicize_connections":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2025\/10\/WT-PPT-Webinar-VISUAL-ASSIST-Assembla-Code-Collaborate-1.png?fit=1920%2C1080&ssl=1","jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pfpLS4-1br","aioseo_head":"\n\t\t<!-- All in One SEO Pro 4.9.5.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.\" \/>\n\t<meta name=\"robots\" content=\"max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n\t<meta name=\"author\" content=\"Tristan Soliven\"\/>\n\t<meta name=\"google-site-verification\" content=\"DtHrwoEjg0KG_fbuPSp5j_wNIf-g5hSh4EH6tZBoCIw\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO Pro (AIOSEO) 4.9.5.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"Tomato Soup - Visual Assist Team Blog\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Setting up UE5 Source Builds and CI that works - Tomato Soup\" \/>\n\t\t<meta property=\"og:description\" content=\"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2025-10-09T19:41:08+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2025-10-09T20:03:27+00:00\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Setting up UE5 Source Builds and CI that works - Tomato Soup\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#blogposting\",\"name\":\"Setting up UE5 Source Builds and CI that works - Tomato Soup\",\"headline\":\"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]\",\"author\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/WT-PPT-Webinar-VISUAL-ASSIST-Assembla-Code-Collaborate-1.png?fit=1920%2C1080&ssl=1\",\"width\":1920,\"height\":1080},\"datePublished\":\"2025-10-09T15:41:08-04:00\",\"dateModified\":\"2025-10-09T16:03:27-04:00\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#webpage\"},\"articleSection\":\"Webinar Recap, Assembla P4, game development workflow, Perforce streams, unreal engine 5, English\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/webinar-recap\\\/#listItem\",\"name\":\"Webinar Recap\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/webinar-recap\\\/#listItem\",\"position\":2,\"name\":\"Webinar Recap\",\"item\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/webinar-recap\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#listItem\",\"name\":\"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#listItem\",\"position\":3,\"name\":\"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/category\\\/webinar-recap\\\/#listItem\",\"name\":\"Webinar Recap\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\",\"name\":\"Tomato Soup\",\"description\":\"Visual Assist Team Blog\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/\",\"name\":\"Tristan Soliven\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#webpage\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/\",\"name\":\"Setting up UE5 Source Builds and CI that works - Tomato Soup\",\"description\":\"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/author\\\/tristansoliven\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.wholetomato.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/WT-PPT-Webinar-VISUAL-ASSIST-Assembla-Code-Collaborate-1.png?fit=1920%2C1080&ssl=1\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#mainImage\",\"width\":1920,\"height\":1080},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\\\/#mainImage\"},\"datePublished\":\"2025-10-09T15:41:08-04:00\",\"dateModified\":\"2025-10-09T16:03:27-04:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/\",\"name\":\"Tomato Soup\",\"description\":\"Visual Assist Team Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.wholetomato.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO Pro -->\r\n\t\t<title>Setting up UE5 Source Builds and CI that works - Tomato Soup<\/title>\n\n","aioseo_head_json":{"title":"Setting up UE5 Source Builds and CI that works - Tomato Soup","description":"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.","canonical_url":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/","robots":"max-snippet:-1, max-image-preview:large, max-video-preview:-1","keywords":"","webmasterTools":{"google-site-verification":"DtHrwoEjg0KG_fbuPSp5j_wNIf-g5hSh4EH6tZBoCIw","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#blogposting","name":"Setting up UE5 Source Builds and CI that works - Tomato Soup","headline":"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]","author":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author"},"publisher":{"@id":"https:\/\/www.wholetomato.com\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2025\/10\/WT-PPT-Webinar-VISUAL-ASSIST-Assembla-Code-Collaborate-1.png?fit=1920%2C1080&ssl=1","width":1920,"height":1080},"datePublished":"2025-10-09T15:41:08-04:00","dateModified":"2025-10-09T16:03:27-04:00","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#webpage"},"isPartOf":{"@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#webpage"},"articleSection":"Webinar Recap, Assembla P4, game development workflow, Perforce streams, unreal engine 5, English"},{"@type":"BreadcrumbList","@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog#listItem","position":1,"name":"Home","item":"https:\/\/www.wholetomato.com\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/webinar-recap\/#listItem","name":"Webinar Recap"}},{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/webinar-recap\/#listItem","position":2,"name":"Webinar Recap","item":"https:\/\/www.wholetomato.com\/blog\/category\/webinar-recap\/","nextItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#listItem","name":"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]"},"previousItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#listItem","position":3,"name":"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]","previousItem":{"@type":"ListItem","@id":"https:\/\/www.wholetomato.com\/blog\/category\/webinar-recap\/#listItem","name":"Webinar Recap"}}]},{"@type":"Organization","@id":"https:\/\/www.wholetomato.com\/blog\/#organization","name":"Tomato Soup","description":"Visual Assist Team Blog","url":"https:\/\/www.wholetomato.com\/blog\/"},{"@type":"Person","@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author","url":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/","name":"Tristan Soliven"},{"@type":"WebPage","@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#webpage","url":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/","name":"Setting up UE5 Source Builds and CI that works - Tomato Soup","description":"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/www.wholetomato.com\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#breadcrumblist"},"author":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author"},"creator":{"@id":"https:\/\/www.wholetomato.com\/blog\/author\/tristansoliven\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/i0.wp.com\/www.wholetomato.com\/blog\/wp-content\/uploads\/2025\/10\/WT-PPT-Webinar-VISUAL-ASSIST-Assembla-Code-Collaborate-1.png?fit=1920%2C1080&ssl=1","@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#mainImage","width":1920,"height":1080},"primaryImageOfPage":{"@id":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/#mainImage"},"datePublished":"2025-10-09T15:41:08-04:00","dateModified":"2025-10-09T16:03:27-04:00"},{"@type":"WebSite","@id":"https:\/\/www.wholetomato.com\/blog\/#website","url":"https:\/\/www.wholetomato.com\/blog\/","name":"Tomato Soup","description":"Visual Assist Team Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/www.wholetomato.com\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"Tomato Soup - Visual Assist Team Blog","og:type":"article","og:title":"Setting up UE5 Source Builds and CI that works - Tomato Soup","og:description":"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.","og:url":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/","article:published_time":"2025-10-09T19:41:08+00:00","article:modified_time":"2025-10-09T20:03:27+00:00","twitter:card":"summary_large_image","twitter:title":"Setting up UE5 Source Builds and CI that works - Tomato Soup","twitter:description":"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system."},"aioseo_meta_data":{"post_id":"4553","title":"Setting up UE5 Source Builds and CI that works #separator_sa #site_title","description":"Learn how to efficiently set up Unreal Engine 5 with Perforce streams using Assembla, optimize your game development workflow, and secure your version control system.","keywords":null,"keyphrases":{"focus":{"keyphrase":"unreal engine","score":73,"analysis":{"keyphraseInTitle":{"score":3,"maxScore":9,"error":1},"keyphraseInDescription":{"score":9,"maxScore":9,"error":0},"keyphraseLength":{"score":9,"maxScore":9,"error":0,"length":2},"keyphraseInURL":{"score":1,"maxScore":5,"error":1},"keyphraseInIntroduction":{"score":9,"maxScore":9,"error":0},"keyphraseInSubHeadings":{"score":3,"maxScore":9,"error":1},"keyphraseInImageAlt":[],"keywordDensity":{"type":"best","score":9,"maxScore":9,"error":0}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"BlogPosting","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"open_ai":null,"ai":{"faqs":[],"keyPoints":[],"titles":[],"descriptions":[],"socialPosts":{"email":[],"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"created":"2025-10-08 19:43:22","updated":"2025-10-09 20:13:28"},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.wholetomato.com\/blog\" title=\"Home\">Home<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\t<a href=\"https:\/\/www.wholetomato.com\/blog\/category\/webinar-recap\/\" title=\"Webinar Recap\">Webinar Recap<\/a>\n<\/span><span class=\"aioseo-breadcrumb-separator\">\u00bb<\/span><span class=\"aioseo-breadcrumb\">\n\tBeyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]\n<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/www.wholetomato.com\/blog"},{"label":"Webinar Recap","link":"https:\/\/www.wholetomato.com\/blog\/category\/webinar-recap\/"},{"label":"Beyond the Basics: Setting up UE5 Source Builds and CI that works [Webinar Recap]","link":"https:\/\/www.wholetomato.com\/blog\/beyond-the-basics-setting-up-ue5-source-builds-and-ci-that-works-webinar-recap\/"}],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4553","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/users\/213500340"}],"replies":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/comments?post=4553"}],"version-history":[{"count":7,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4553\/revisions"}],"predecessor-version":[{"id":4562,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/posts\/4553\/revisions\/4562"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/media\/4560"}],"wp:attachment":[{"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/media?parent=4553"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/categories?post=4553"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.wholetomato.com\/blog\/wp-json\/wp\/v2\/tags?post=4553"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}