Merge branch 'main' into github/staging

This commit is contained in:
Alex Peterson
2021-04-13 09:46:26 -07:00
committed by GitHub
15 changed files with 173 additions and 239 deletions
+10 -10
View File
@@ -96,7 +96,7 @@ def IsJobEnabled(buildTypeMap, pipelineName, platformName) {
if (params[platformName]) {
if(buildTypeMap.value.TAGS) {
return buildTypeMap.value.TAGS.contains(pipelineName)
}
}
}
}
return false
@@ -194,9 +194,9 @@ def GetBuildEnvVars(Map platformEnv, Map buildTypeEnv, String pipelineName) {
}
buildTypeEnv.each { var ->
// This may override the above one if there is an entry defined by the job
envVarMap[var.key] = var.value
envVarMap[var.key] = var.value
}
// Environment that only applies to to Jenkins tweaks.
// For 3rdParty downloads, we store them in the EBS volume so we can reuse them across node
// instances. This allow us to scale up and down without having to re-download 3rdParty
@@ -223,7 +223,7 @@ def PullFilesFromGit(String filenamePath, String branchName, boolean failIfNotFo
folderPathParts.remove(folderPathParts.size()-1) // remove the filename
def folderPath = folderPathParts.join('/')
if (folderPath.contains('*')) {
def currentPath = ''
for (int i = 0; i < folderPathParts.size(); i++) {
if (folderPathParts[i] == '*') {
@@ -259,7 +259,7 @@ def PullFilesFromGit(String filenamePath, String branchName, boolean failIfNotFo
} else {
def errorFile = "${folderPath}/error.txt"
def errorFile = "${folderPath}/error.txt"
palMkdir(folderPath)
retry(3) {
try {
@@ -273,7 +273,7 @@ def PullFilesFromGit(String filenamePath, String branchName, boolean failIfNotFo
win_filenamePath = filenamePath.replace('/', '\\')
bat label: "Downloading ${win_filenamePath}",
script: "aws codecommit get-file --repository-name ${repositoryName} --commit-specifier ${branchName} --file-path ${filenamePath} --query fileContent --output text 2>${errorFile} > ${win_filenamePath}_encoded"
bat label: 'Decoding',
bat label: 'Decoding',
script: "certutil -decode ${win_filenamePath}_encoded ${win_filenamePath}"
}
palRm("${filenamePath}_encoded")
@@ -296,7 +296,7 @@ def SetLfsCredentials(cmd, lbl = '') {
if (env.IS_UNIX) {
sh label: lbl,
script: cmd
} else {
} else {
bat label: lbl,
script: cmd
}
@@ -330,7 +330,7 @@ def CheckoutRepo(boolean disableSubmodules = false) {
if(fileExists('.git')) {
// If the repository after checkout is locked, likely we took a snapshot while git was running,
// to leave the repo in a usable state, garbagecollect. This also helps in situations where
// to leave the repo in a usable state, garbagecollect. This also helps in situations where
def indexLockFile = '.git/index.lock'
if(fileExists(indexLockFile)) {
palSh('git gc', 'Git GarbageCollect')
@@ -380,7 +380,7 @@ def CheckoutRepo(boolean disableSubmodules = false) {
// Add folder where we will store the 3rdParty downloads and packages
if(!fileExists('3rdParty')) {
palMkdir('3rdParty')
}
}
dir(ENGINE_REPOSITORY_NAME) {
// Run lfs in a separate step. Jenkins is unable to load the credentials for the custom LFS endpoint
@@ -419,7 +419,7 @@ def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline,
sh label: 'Setting volume\'s ownership',
script: """
if sudo test ! -d "${workspace}"; then
sudo mkdir -p ${workspace}
sudo mkdir -p ${workspace}
cd ${workspace}/..
sudo chown -R lybuilder:root .
fi
+61 -108
View File
@@ -30,6 +30,7 @@
#include <AzCore/Component/EntityId.h>
#include <AzCore/Interface/Interface.h>
#include <AzCore/Math/VectorConversions.h>
#include <AzCore/Console/IConsole.h>
// AzFramework
#include <AzFramework/Components/CameraBus.h>
@@ -98,6 +99,10 @@
#include <QtGui/private/qhighdpiscaling_p.h>
AZ_CVAR(
bool, ed_visibility_logTiming, false, nullptr, AZ::ConsoleFunctorFlags::Null,
"Output the timing of the new IVisibilitySystem query");
EditorViewportWidget* EditorViewportWidget::m_pPrimaryViewport = nullptr;
#if AZ_TRAIT_OS_PLATFORM_APPLE
@@ -145,35 +150,6 @@ namespace AZ::ViewportHelpers
};
} // namespace AZ::ViewportHelpers
struct EditorViewportWidget::SScopedCurrentContext
{
const EditorViewportWidget* m_viewport;
EditorViewportWidget::SPreviousContext m_previousContext;
explicit SScopedCurrentContext(const EditorViewportWidget* viewport)
: m_viewport(viewport)
{
m_previousContext = viewport->SetCurrentContext();
// During normal updates of RenderViewport the value of m_cameraSetForWidgetRenderingCount is expected to be 0.
// This is to guarantee no loss in performance by tracking unnecessary calls to SetCurrentContext/RestorePreviousContext.
// If some code makes additional calls to Pre/PostWidgetRendering then the assert will be triggered because
// m_cameraSetForWidgetRenderingCount will be greater than 0.
// There is a legitimate case where the counter can be greater than 0. This is when QtViewport is processing mouse callbacks.
// QtViewport::MouseCallback() is surrounded by Pre/PostWidgetRendering and the m_processingMouseCallbacksCounter
// tracks this specific case. If an update of a RenderViewport happens while processing the mouse callback,
// for example when showing a QMessageBox, then both counters must match.
AZ_Assert(viewport->m_cameraSetForWidgetRenderingCount == viewport->m_processingMouseCallbacksCounter,
"SScopedCurrentContext constructor was called while viewport widget context is active "
"- this is unnecessary");
}
~SScopedCurrentContext()
{
m_viewport->RestorePreviousContext(m_previousContext);
}
};
//////////////////////////////////////////////////////////////////////////
// EditorViewportWidget
//////////////////////////////////////////////////////////////////////////
@@ -230,7 +206,7 @@ EditorViewportWidget::EditorViewportWidget(const QString& name, QWidget* parent)
m_manipulatorManager = GetIEditor()->GetViewManager()->GetManipulatorManager();
if (!m_pPrimaryViewport)
{
m_pPrimaryViewport = this;
SetAsActiveViewport();
}
}
@@ -495,7 +471,7 @@ void EditorViewportWidget::Update()
{
if (CheckRespondToInput()) // If this is the focused window, set primary viewport.
{
m_pPrimaryViewport = this;
SetAsActiveViewport();
}
else if (!m_bUpdateViewport) // Skip this viewport.
{
@@ -552,8 +528,6 @@ void EditorViewportWidget::Update()
// Render
{
SScopedCurrentContext context(this);
// TODO: Move out this logic to a controller and refactor to work with Atom
// m_renderer->SetClearColor(Vec3(0.4f, 0.4f, 0.4f));
// 3D engine stats
@@ -587,6 +561,19 @@ void EditorViewportWidget::Update()
gEnv->pSystem->SetViewCamera(CurCamera);
}
{
auto start = std::chrono::steady_clock::now();
m_entityVisibilityQuery.UpdateVisibility(GetCameraState());
if (ed_visibility_logTiming)
{
auto stop = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = stop - start;
AZ_Printf("Visibility", "FindVisibleEntities (new) - Duration: %f", diff);
}
}
QtViewport::Update();
PopDisableRendering();
@@ -686,17 +673,13 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event)
if (deviceInfo)
{
// Note: This may also need to adjust the viewport size
outputToHMD->Set(1);
m_previousContext = SetCurrentContext(deviceInfo->renderWidth, deviceInfo->renderHeight);
SetActiveWindow();
SetFocus();
SetSelected(true);
}
}
else
{
m_previousContext = SetCurrentContext();
}
SetCurrentCursor(STD_CURSOR_GAME);
}
}
@@ -710,7 +693,6 @@ void EditorViewportWidget::OnEditorNotifyEvent(EEditorNotifyEvent event)
{
outputToHMD->Set(0);
}
RestorePreviousContext(m_previousContext);
m_bInRotateMode = false;
m_bInMoveMode = false;
m_bInOrbitMode = false;
@@ -1180,15 +1162,7 @@ void EditorViewportWidget::FindVisibleEntities(AZStd::vector<AZ::EntityId>& visi
{
FUNCTION_PROFILER(GetIEditor()->GetSystem(), PROFILE_EDITOR);
if (m_displayContext.GetView() == nullptr)
{
return;
}
const AZStd::vector<AZ::EntityId>& entityIdCache =
m_displayContext.GetView()->GetVisibleObjectsCache()->GetEntityIdCache();
visibleEntitiesOut.assign(entityIdCache.begin(), entityIdCache.end());
visibleEntitiesOut.assign(m_entityVisibilityQuery.Begin(), m_entityVisibilityQuery.End());
}
QPoint EditorViewportWidget::ViewportWorldToScreen(const AZ::Vector3& worldPosition)
@@ -1233,6 +1207,7 @@ void EditorViewportWidget::SetViewportId(int id)
// Now that we have an ID, we can initialize our viewport.
m_renderViewport = new AtomToolsFramework::RenderViewportWidget(id, this);
m_defaultViewportContextName = m_renderViewport->GetViewportContext()->GetName();
QBoxLayout* layout = new QBoxLayout(QBoxLayout::Direction::TopToBottom, this);
layout->setContentsMargins(QMargins());
layout->addWidget(m_renderViewport);
@@ -1253,6 +1228,11 @@ void EditorViewportWidget::SetViewportId(int id)
}
UpdateScene();
if (m_pPrimaryViewport == this)
{
SetAsActiveViewport();
}
}
void EditorViewportWidget::ConnectViewportInteractionRequestBus()
@@ -1999,9 +1979,6 @@ void EditorViewportWidget::RenderSelectedRegion()
Vec3 EditorViewportWidget::WorldToView3D(const Vec3& wp, [[maybe_unused]] int nFlags) const
{
AZ_Assert(m_cameraSetForWidgetRenderingCount > 0,
"WorldToView3D was called but viewport widget rendering was not set. PreWidgetRendering must be called before.");
Vec3 out(0, 0, 0);
float x, y, z;
@@ -2020,10 +1997,6 @@ Vec3 EditorViewportWidget::WorldToView3D(const Vec3& wp, [[maybe_unused]] int nF
//////////////////////////////////////////////////////////////////////////
QPoint EditorViewportWidget::WorldToView(const Vec3& wp) const
{
AZ_Assert(m_cameraSetForWidgetRenderingCount > 0,
"WorldToView was called but viewport widget rendering was not set. PreWidgetRendering must be called before.");
return m_renderViewport->ViewportWorldToScreen(LYVec3ToAZVec3(wp));
}
//////////////////////////////////////////////////////////////////////////
@@ -2191,9 +2164,6 @@ void EditorViewportWidget::ProjectToScreen(float ptx, float pty, float ptz, floa
//////////////////////////////////////////////////////////////////////////
void EditorViewportWidget::ViewToWorldRay(const QPoint& vp, Vec3& raySrc, Vec3& rayDir) const
{
AZ_Assert(m_cameraSetForWidgetRenderingCount > 0,
"ViewToWorldRay was called but SScopedCurrentContext was not set at a higher scope! This means the camera for this call is incorrect.");
QRect rc = m_rcClient;
Vec3 pos0, pos1;
@@ -2258,7 +2228,7 @@ bool EditorViewportWidget::CheckRespondToInput() const
return false;
}
if (!hasFocus())
if (!hasFocus() && !m_renderViewport->hasFocus())
{
return false;
}
@@ -2663,55 +2633,6 @@ void EditorViewportWidget::OnStopPlayInEditor()
}
}
//////////////////////////////////////////////////////////////////////////
EditorViewportWidget::SPreviousContext EditorViewportWidget::SetCurrentContext(int /*newWidth*/, int /*newHeight*/) const
{
SPreviousContext x;
return x;
}
//////////////////////////////////////////////////////////////////////////
EditorViewportWidget::SPreviousContext EditorViewportWidget::SetCurrentContext() const
{
const auto r = rect();
return SetCurrentContext(r.width(), r.height());
}
//////////////////////////////////////////////////////////////////////////
void EditorViewportWidget::RestorePreviousContext(const SPreviousContext& /*x*/) const
{
}
void EditorViewportWidget::PreWidgetRendering()
{
// if we have not already set the render context for the viewport, do it now
// based on the current state of the renderer/viewport, record the previous
// context to restore afterwards
if (m_cameraSetForWidgetRenderingCount == 0)
{
m_preWidgetContext = SetCurrentContext();
}
// keep track of how many times we've attempted to update the context
m_cameraSetForWidgetRenderingCount++;
}
void EditorViewportWidget::PostWidgetRendering()
{
if (m_cameraSetForWidgetRenderingCount > 0)
{
m_cameraSetForWidgetRenderingCount--;
// unwinding - when the viewport context is no longer required,
// restore the previous context when widget rendering first began
if (m_cameraSetForWidgetRenderingCount == 0)
{
RestorePreviousContext(m_preWidgetContext);
}
}
}
//////////////////////////////////////////////////////////////////////////
void EditorViewportWidget::OnCameraFOVVariableChanged([[maybe_unused]] IVariable* var)
{
@@ -2915,4 +2836,36 @@ void EditorViewportWidget::UpdateCameraFromViewportContext()
m_Camera.SetZRange(cameraState.m_nearClip, cameraState.m_farClip);
}
void EditorViewportWidget::SetAsActiveViewport()
{
auto viewportContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get();
const AZ::Name defaultContextName = viewportContextManager->GetDefaultViewportContextName();
// If another viewport was active before, restore its name to its per-ID one.
if (m_pPrimaryViewport && m_pPrimaryViewport != this && m_pPrimaryViewport->m_renderViewport)
{
auto viewportContext = m_pPrimaryViewport->m_renderViewport->GetViewportContext();
if (viewportContext)
{
// Remove the old viewport's camera from the stack, as it's no longer the owning viewport
viewportContextManager->PopView(defaultContextName, viewportContext->GetDefaultView());
viewportContextManager->RenameViewportContext(viewportContext, m_pPrimaryViewport->m_defaultViewportContextName);
}
}
m_pPrimaryViewport = this;
if (m_renderViewport)
{
auto viewportContext = m_renderViewport->GetViewportContext();
if (viewportContext)
{
// Push our camera onto the default viewport's view stack to preserve camera state continuity
// Other views can still be pushed on top of our view for e.g. game mode
viewportContextManager->PushView(defaultContextName, viewportContext->GetDefaultView());
viewportContextManager->RenameViewportContext(viewportContext, defaultContextName);
}
}
}
#include <moc_EditorViewportWidget.cpp>
+3 -23
View File
@@ -354,26 +354,6 @@ protected:
void RenderAll();
struct SPreviousContext
{
CCamera rendererCamera;
HWND window;
int width;
int height;
bool mainViewport;
};
SPreviousContext m_preWidgetContext;
// Create an auto-sized render context that is sized based on the Editor's current
// viewport.
SPreviousContext SetCurrentContext() const;
SPreviousContext SetCurrentContext(int newWidth, int newHeight) const;
void RestorePreviousContext(const SPreviousContext& x) const;
void PreWidgetRendering() override;
void PostWidgetRendering() override;
void OnBeginPrepareRender() override;
// Update the safe frame, safe action, safe title, and borders rectangles based on
@@ -579,6 +559,7 @@ protected:
void BuildDragDropContext(AzQtComponents::ViewportDragContext& context, const QPoint& pt) override;
private:
void SetAsActiveViewport();
void PushDisableRendering();
void PopDisableRendering();
bool IsRenderingDisabled() const;
@@ -606,13 +587,10 @@ private:
AzFramework::EntityVisibilityQuery m_entityVisibilityQuery;
SPreviousContext m_previousContext;
QSet<int> m_keyDown;
bool m_freezeViewportInput = false;
size_t m_cameraSetForWidgetRenderingCount = 0; ///< How many calls to PreWidgetRendering happened before
///< subsequent calls to PostWidetRendering.
AZStd::shared_ptr<AzToolsFramework::ManipulatorManager> m_manipulatorManager;
// Used to prevent circular set camera events
@@ -627,5 +605,7 @@ private:
AZ::RPI::ViewportContext::MatrixChangedEvent::Handler m_cameraProjectionMatrixChangeHandler;
AzFramework::DebugDisplayRequests* m_debugDisplay = nullptr;
AZ::Name m_defaultViewportContextName;
AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
};
-10
View File
@@ -94,9 +94,6 @@
AZ_CVAR(
bool, ed_visibility_use, true, nullptr, AZ::ConsoleFunctorFlags::Null,
"Enable/disable using the new IVisibilitySystem for Entity visibility determination");
AZ_CVAR(
bool, ed_visibility_logTiming, false, nullptr, AZ::ConsoleFunctorFlags::Null,
"Output the timing of the new IVisibilitySystem query");
CRenderViewport* CRenderViewport::m_pPrimaryViewport = nullptr;
@@ -1394,13 +1391,6 @@ void CRenderViewport::Update()
auto start = std::chrono::steady_clock::now();
m_entityVisibilityQuery.UpdateVisibility(GetCameraState());
if (ed_visibility_logTiming)
{
auto stop = std::chrono::steady_clock::now();
std::chrono::duration<double> diff = stop - start;
AZ_Printf("Visibility", "FindVisibleEntities (new) - Duration: %f", diff);
}
}
{
+2 -1
View File
@@ -218,10 +218,11 @@ QtViewport::QtViewport(QWidget* parent)
// Create drop target to handle Qt drop events.
setAcceptDrops(true);
m_renderOverlay.setVisible(false);
m_renderOverlay.setVisible(true);
m_renderOverlay.setUpdatesEnabled(false);
m_renderOverlay.setMouseTracking(true);
m_renderOverlay.setObjectName("renderOverlay");
m_renderOverlay.winId(); // Force the render overlay to create a backing native window
m_viewportUi.InitializeViewportUi(this, &m_renderOverlay);
+1 -1
View File
@@ -280,7 +280,7 @@ public:
virtual CViewport *asCViewport() { return this; }
protected:
CLayoutViewPane* m_viewPane;
CLayoutViewPane* m_viewPane = nullptr;
CViewManager* m_viewManager;
AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
// Viewport matrix.
@@ -21,8 +21,8 @@
#include <QApplication>
static const auto ManipulatorPriority = AzFramework::ViewportControllerPriority::High;
static const auto InteractionPriority = AzFramework::ViewportControllerPriority::Low;
static const auto ManipulatorPriority = AzFramework::ViewportControllerPriority::Highest;
static const auto InteractionPriority = AzFramework::ViewportControllerPriority::High;
namespace SandboxEditor
{
@@ -126,12 +126,20 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram
m_state.m_mouseButtons.m_mouseButtons |= static_cast<AZ::u32>(mouseButton);
if (IsDoubleClick(mouseButton))
{
m_pendingDoubleClicks.erase(mouseButton);
// Only remove the double click flag once we're done processing both Manipulator and Interaction events
if (event.m_priority == InteractionPriority)
{
m_pendingDoubleClicks.erase(mouseButton);
}
eventType = MouseEvent::DoubleClick;
}
else
{
m_pendingDoubleClicks[mouseButton] = m_curTime;
// Only insert the double click timing once we're done processing both Manipulator and Interaction events, to avoid a false IsDoubleClick positive
if (event.m_priority == InteractionPriority)
{
m_pendingDoubleClicks[mouseButton] = m_curTime;
}
eventType = MouseEvent::Down;
}
}
@@ -160,7 +168,7 @@ bool ViewportManipulatorControllerInstance::HandleInputChannelEvent(const AzFram
{
mouseInteraction.m_mouseButtons.m_mouseButtons = static_cast<AZ::u32>(overrideButton.value());
}
MouseInteractionEvent mouseEvent = MouseInteractionEvent(mouseInteraction, eventType.value());
mouseInteraction.m_interactionId.m_viewportId = GetViewportId();
// Depending on priority, we dispatch to either the manipulator or viewport interaction event
const auto& targetInteractionEvent =
@@ -195,6 +195,9 @@ namespace AZ
{
m_defaultView = view;
UpdatePipelineView();
m_viewMatrixChangedEvent.Signal(view->GetWorldToViewMatrix());
m_projectionMatrixChangedEvent.Signal(view->GetViewToClipMatrix());
}
}
@@ -143,7 +143,7 @@ namespace AZ
params.renderScene
);
viewportContext->GetWindowContext()->RegisterAssociatedViewportContext(viewportContext);
RegisterViewportContext(contextName, viewportContext);
RegisterViewportContext(nameToUse, viewportContext);
return viewportContext;
}
@@ -171,7 +171,9 @@ namespace AZ
AZ_Assert(false, "Attempted to rename ViewportContext \"%s\" to \"%s\", but \"%s\" is already assigned to another ViewportContext", viewportContext->m_name.GetCStr(), newContextName.GetCStr(), newContextName.GetCStr());
return;
}
RegisterViewportContext(newContextName, viewportContext);
GetOrCreateViewStackForContext(newContextName);
viewportContext->m_name = newContextName;
UpdateViewForContext(newContextName);
}
void ViewportContextManager::EnumerateViewportContexts(AZStd::function<void(ViewportContextPtr)> visitorFunction)
@@ -43,6 +43,7 @@ namespace AtomToolsFramework
params.device = AZ::RHI::RHISystemInterface::Get()->GetDevice();
params.windowHandle = reinterpret_cast<AzFramework::NativeWindowHandle>(winId());
params.id = id;
AzFramework::WindowRequestBus::Handler::BusConnect(params.windowHandle);
m_viewportContext = viewportContextManager->CreateViewportContext(AZ::Name(), params);
SetControllerList(AZStd::make_shared<AzFramework::ViewportControllerList>());
@@ -21,7 +21,7 @@ ly_add_target(
Include
COMPILE_DEFINITIONS
PRIVATE
ENABLE_ATOM_DEBUG_DISPLAY=0
ENABLE_ATOM_DEBUG_DISPLAY=1
BUILD_DEPENDENCIES
PUBLIC
AZ::AtomCore
@@ -43,7 +43,7 @@ ly_add_target(
Include
COMPILE_DEFINITIONS
PRIVATE
ENABLE_ATOM_DEBUG_DISPLAY=0
ENABLE_ATOM_DEBUG_DISPLAY=1
BUILD_DEPENDENCIES
PRIVATE
Gem::Atom_AtomBridge.Static
@@ -163,7 +163,7 @@ void CAtomShimRenderer::EF_EndEf3D([[maybe_unused]] const int nFlags, [[maybe_un
// Only render the UI Canvas and the Console on the main window
// If we're not in the editor, don't bother to check viewport.
if (!gEnv->IsEditor() || m_currContext->m_isMainViewport)
if (!gEnv->IsEditor() || m_currContext == nullptr || m_currContext->m_isMainViewport)
{
EBUS_EVENT(AZ::RenderNotificationsBus, OnScene3DEnd);
}
@@ -294,7 +294,12 @@ void CAtomShimRenderer::EndFrame()
if (!m_viewportContext)
{
auto viewContextManager = AZ::Interface<AZ::RPI::ViewportContextRequestsInterface>::Get();
m_viewportContext = viewContextManager->GetViewportContextByName(viewContextManager->GetDefaultViewportContextName());
auto viewportContext = viewContextManager->GetViewportContextByName(viewContextManager->GetDefaultViewportContextName());
// If the viewportContext exists and is created with the default ID, we can safely assume control
if (viewportContext && viewportContext->GetId() == -10)
{
m_viewportContext = viewportContext;
}
}
if (m_viewportContext)
-1
View File
@@ -1,4 +1,3 @@
# Python Asset Builder
This gem is meant to run Python scripts that want to run as asset builders in the Lumberyard asset processing system.
+66 -74
View File
@@ -84,7 +84,7 @@ def IsJobEnabled(buildTypeMap, pipelineName, platformName) {
if (params[platformName]) {
if(buildTypeMap.value.TAGS) {
return buildTypeMap.value.TAGS.contains(pipelineName)
}
}
}
}
return false
@@ -161,9 +161,9 @@ def GetBuildEnvVars(Map platformEnv, Map buildTypeEnv, String pipelineName) {
}
buildTypeEnv.each { var ->
// This may override the above one if there is an entry defined by the job
envVarMap[var.key] = var.value
envVarMap[var.key] = var.value
}
// Environment that only applies to to Jenkins tweaks.
// For 3rdParty downloads, we store them in the EBS volume so we can reuse them across node
// instances. This allow us to scale up and down without having to re-download 3rdParty
@@ -185,7 +185,7 @@ def SetLfsCredentials(cmd, lbl = '') {
if (env.IS_UNIX) {
sh label: lbl,
script: cmd
} else {
} else {
bat label: lbl,
script: cmd
}
@@ -214,19 +214,17 @@ def CheckoutBootstrapScripts(String branchName) {
}
def CheckoutRepo(boolean disableSubmodules = false) {
dir(ENGINE_REPOSITORY_NAME) {
palSh('git lfs uninstall', 'Git LFS Uninstall') // Prevent git from pulling lfs objects during checkout
palSh('git lfs uninstall', 'Git LFS Uninstall') // Prevent git from pulling lfs objects during checkout
if(fileExists('.git')) {
// If the repository after checkout is locked, likely we took a snapshot while git was running,
// to leave the repo in a usable state, garbagecollect. This also helps in situations where
def indexLockFile = '.git/index.lock'
if(fileExists(indexLockFile)) {
palSh('git gc', 'Git GarbageCollect')
}
if(fileExists(indexLockFile)) { // if it is still there, remove it
palRm(indexLockFile)
}
if(fileExists('.git')) {
// If the repository after checkout is locked, likely we took a snapshot while git was running,
// to leave the repo in a usable state, garbagecollect. This also helps in situations where
def indexLockFile = '.git/index.lock'
if(fileExists(indexLockFile)) {
palSh('git gc', 'Git GarbageCollect')
}
if(fileExists(indexLockFile)) { // if it is still there, remove it
palRm(indexLockFile)
}
}
@@ -237,38 +235,29 @@ def CheckoutRepo(boolean disableSubmodules = false) {
sleep random.nextInt(60 * retryAttempt) // Stagger checkouts to prevent HTTP 429 (Too Many Requests) response from CodeCommit
}
retryAttempt = retryAttempt + 1
dir(ENGINE_REPOSITORY_NAME) {
checkout scm: [
$class: 'GitSCM',
branches: scm.branches,
extensions: [
[$class: 'SubmoduleOption', disableSubmodules: disableSubmodules, recursiveSubmodules: true],
[$class: 'CheckoutOption', timeout: 60]
],
userRemoteConfigs: scm.userRemoteConfigs
]
}
checkout scm: [
$class: 'GitSCM',
branches: scm.branches,
extensions: [
[$class: 'SubmoduleOption', disableSubmodules: disableSubmodules, recursiveSubmodules: true],
[$class: 'CheckoutOption', timeout: 60]
],
userRemoteConfigs: scm.userRemoteConfigs
]
}
// Add folder where we will store the 3rdParty downloads and packages
if(!fileExists('3rdParty')) {
palMkdir('3rdParty')
}
dir(ENGINE_REPOSITORY_NAME) {
// Run lfs in a separate step. Jenkins is unable to load the credentials for the custom LFS endpoint
withCredentials([usernamePassword(credentialsId: "${env.GITHUB_USER}", passwordVariable: 'accesstoken', usernameVariable: 'username')]) {
SetLfsCredentials("git config -f .lfsconfig lfs.url https://${username}:${accesstoken}@${env.LFS_URL}", 'Set credentials')
}
palSh('git lfs install', 'Git LFS Install')
palSh('git lfs pull', 'Git LFS Pull')
// CHANGE_ID is used by some scripts to identify uniquely the current change (usually metric jobs)
palSh('git rev-parse HEAD > commitid', 'Getting commit id')
env.CHANGE_ID = readFile file: 'commitid'
env.CHANGE_ID = env.CHANGE_ID.trim()
palRm('commitid')
// Run lfs in a separate step. Jenkins is unable to load the credentials for the custom LFS endpoint
withCredentials([usernamePassword(credentialsId: "${env.GITHUB_USER}", passwordVariable: 'accesstoken', usernameVariable: 'username')]) {
SetLfsCredentials("git config -f .lfsconfig lfs.url https://${username}:${accesstoken}@${env.LFS_URL}", 'Set credentials')
}
palSh('git lfs install', 'Git LFS Install')
palSh('git lfs pull', 'Git LFS Pull')
// CHANGE_ID is used by some scripts to identify uniquely the current change (usually metric jobs)
palSh('git rev-parse HEAD > commitid', 'Getting commit id')
env.CHANGE_ID = readFile file: 'commitid'
env.CHANGE_ID = env.CHANGE_ID.trim()
palRm('commitid')
}
def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline, String branchName, String platform, String buildType, String workspace, boolean mount = true, boolean disableSubmodules = false) {
@@ -292,7 +281,7 @@ def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline,
sh label: 'Setting volume\'s ownership',
script: """
if sudo test ! -d "${workspace}"; then
sudo mkdir -p ${workspace}
sudo mkdir -p ${workspace}
cd ${workspace}/..
sudo chown -R lybuilder:root .
fi
@@ -309,28 +298,31 @@ def PreBuildCommonSteps(Map pipelineConfig, String projectName, String pipeline,
}
dir(workspace) {
// Add folder where we will store the 3rdParty downloads and packages
if(!fileExists('3rdParty')) {
palMkdir('3rdParty')
}
}
dir("${workspace}/${ENGINE_REPOSITORY_NAME}") {
CheckoutRepo(disableSubmodules)
// Get python
dir(ENGINE_REPOSITORY_NAME) {
if(env.IS_UNIX) {
sh label: 'Getting python',
script: 'python/get_python.sh'
} else {
bat label: 'Getting python',
script: 'python/get_python.bat'
}
if(env.IS_UNIX) {
sh label: 'Getting python',
script: 'python/get_python.sh'
} else {
bat label: 'Getting python',
script: 'python/get_python.bat'
}
if(env.CLEAN_OUTPUT_DIRECTORY.toBoolean() || env.CLEAN_ASSETS.toBoolean()) {
def command = "${pipelineConfig.BUILD_ENTRY_POINT} --platform ${platform} --type clean"
if (env.IS_UNIX) {
sh label: "Running ${platform} clean",
script: "${pipelineConfig.PYTHON_DIR}/python.sh -u ${command}"
} else {
bat label: "Running ${platform} clean",
script: "${pipelineConfig.PYTHON_DIR}/python.cmd -u ${command}".replace('/','\\')
}
if(env.CLEAN_OUTPUT_DIRECTORY.toBoolean() || env.CLEAN_ASSETS.toBoolean()) {
def command = "${pipelineConfig.BUILD_ENTRY_POINT} --platform ${platform} --type clean"
if (env.IS_UNIX) {
sh label: "Running ${platform} clean",
script: "${pipelineConfig.PYTHON_DIR}/python.sh -u ${command}"
} else {
bat label: "Running ${platform} clean",
script: "${pipelineConfig.PYTHON_DIR}/python.cmd -u ${command}".replace('/','\\')
}
}
}
@@ -446,10 +438,10 @@ try {
echo "Running \"${pipelineName}\" for \"${branchName}\"..."
CheckoutBootstrapScripts(branchName)
// Load configs
pipelineConfig = LoadPipelineConfig(pipelineName, branchName)
// Add each platform as a parameter that the user can disable if needed
pipelineConfig.platforms.each { platform ->
pipelineParameters.add(booleanParam(defaultValue: true, description: '', name: platform.key))
@@ -460,13 +452,13 @@ try {
// Stash the INCREMENTAL_BUILD_SCRIPT_PATH since all nodes will use it
stash name: 'incremental_build_script',
includes: INCREMENTAL_BUILD_SCRIPT_PATH
}
}
}
}
}
if(env.BUILD_NUMBER == '1') {
// Exit pipeline early on the intial build. This allows Jenkins to load the pipeline for the branch and enables users
// Exit pipeline early on the intial build. This allows Jenkins to load the pipeline for the branch and enables users
// to select build parameters on their first actual build. See https://issues.jenkins.io/browse/JENKINS-41929
currentBuild.result = 'SUCCESS'
return
@@ -483,16 +475,16 @@ try {
envVars['JOB_NAME'] = "${branchName}_${platform.key}_${build_job.key}" // backwards compatibility, some scripts rely on this
def nodeLabel = envVars['NODE_LABEL']
buildConfigs["${platform.key} [${build_job.key}]"] = {
buildConfigs["${platform.key} [${build_job.key}]"] = {
node("${nodeLabel}") {
if(isUnix()) { // Has to happen inside a node
envVars['IS_UNIX'] = 1
}
}
withEnv(GetEnvStringList(envVars)) {
timeout(time: envVars['TIMEOUT'], unit: 'MINUTES', activity: true) {
try {
def build_job_name = build_job.key
CreateSetupStage(pipelineConfig, projectName, pipelineName, branchName, platform.key, build_job.key, envVars).call()
if(build_job.value.steps) { //this is a pipe with many steps so create all the build stages
@@ -503,7 +495,7 @@ try {
} else {
CreateBuildStage(pipelineConfig, platform.key, build_job.key, envVars).call()
}
if (env.MARS_REPO && platform.key == 'Windows' && build_job_name.startsWith('test')) {
def output_directory = platform.value.build_types[build_job_name].PARAMETERS.OUTPUT_DIRECTORY
def configuration = platform.value.build_types[build_job_name].PARAMETERS.CONFIGURATION
@@ -549,8 +541,8 @@ finally {
try {
if(env.SNS_TOPIC) {
snsPublish(
topicArn: env.SNS_TOPIC,
subject:'Build Result',
topicArn: env.SNS_TOPIC,
subject:'Build Result',
message:"${currentBuild.currentResult}:${BUILD_URL}:${env.RECREATE_VOLUME}:${env.CLEAN_OUTPUT_DIRECTORY}:${env.CLEAN_ASSETS}"
)
}