From c9568e329a1ef6d49021b2e973e521f7c9c7e776 Mon Sep 17 00:00:00 2001 From: Rye Mutt <rye@alchemyviewer.org> Date: Tue, 3 Jan 2023 02:12:16 -0500 Subject: [PATCH] Start to wire up installer delta generation and CI --- .gitlab-ci.yml | 6 +-- indra/cmake/Variables.cmake | 2 + indra/newview/CMakeLists.txt | 8 ++++ indra/newview/alsquirrelupdater.cpp | 33 +++++++++------- .../installers/windows/placeholder.gif | Bin 0 -> 9287 bytes .../newview/installers/windows/viewer.nuspec | 4 +- indra/newview/llappviewer.cpp | 2 +- indra/newview/llviewerbuildconfig.h.in | 3 ++ indra/newview/viewer_manifest.py | 36 +++++++++++++++--- 9 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 indra/newview/installers/windows/placeholder.gif diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a96827cc60..6a5ecca0da8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -51,7 +51,7 @@ variables: - .\.venv\Scripts\Activate.ps1 - pip install --upgrade llbase autobuild certifi script: - - autobuild configure -c Release -- -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE + - autobuild configure -c Release -- -DUSE_LTO=ON -DDISABLE_FATAL_WARNINGS=ON -DREVISION_FROM_VCS=FALSE -DENABLE_DELTA_GEN=ON - autobuild build -c Release --no-configure - autobuild graph -c Release --graph-file alchemy-windows${AUTOBUILD_ADDRSIZE}-dependencies.svg build-vc-64/autobuild-package.xml - $AlchemyPdbPath = Resolve-Path build-vc-*/newview/Release/alchemy-bin.pdb @@ -71,7 +71,7 @@ variables: - build-vc-*/newview/Release/alchemy-bin.exe - build-vc-*/newview/Release/alchemy-bin.pdb - build-vc-*/newview/Release/alchemy-bin.src.zip - - build-vc-*/newview/Release/Alchemy_*_Setup.exe + - build-vc-*/newview/Deploy/* - alchemy-*-dependencies.svg .mac_build: @@ -396,7 +396,7 @@ build:release:windows64: - Pop-Location - Push-Location ./build-vc-64/ - - Push-Location ./newview/Release/ + - Push-Location ./newview/Deploy/ - $WinFileName = Get-ChildItem -Path . -Name -Include Alchemy_*_Setup.exe - $WinFileHash = (Get-FileHash .\$WinFileName -a sha256).Hash - $WinPackageUrl = "${UploadDestURL}/${WinFileName}" diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake index 1686547cc79..73edcfacc47 100644 --- a/indra/cmake/Variables.cmake +++ b/indra/cmake/Variables.cmake @@ -282,6 +282,8 @@ set(USESYSTEMLIBS OFF CACHE BOOL "Use libraries from your system rather than Lin set(USE_PRECOMPILED_HEADERS ON CACHE BOOL "Enable use of precompiled header directives where supported.") +set(VIEWER_UPDATE_SERVICE "https://update.alchemyviewer.org" CACHE STRING "Update service URL") + source_group("CMake Rules" FILES CMakeLists.txt) endif(NOT DEFINED ${CMAKE_CURRENT_LIST_FILE}_INCLUDED) diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 8a1f2301338..a640c7ceead 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -2084,6 +2084,12 @@ if (WINDOWS) ${CMAKE_CURRENT_SOURCE_DIR}/event_host_manifest.py ) + if (ENABLE_DELTA_GEN) + set(DELTA_GEN_SETTING "--gendelta=ON") + else () + set(DELTA_GEN_SETTING "") + endif () + add_custom_command( OUTPUT ${VIEWER_BUILD_DEST_DIR}/touched.bat COMMAND ${Python3_EXECUTABLE} @@ -2105,6 +2111,8 @@ if (WINDOWS) --source=${CMAKE_CURRENT_SOURCE_DIR} --touch=${VIEWER_BUILD_DEST_DIR}/touched.bat --versionfile=${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt + --updateurl=${VIEWER_UPDATE_SERVICE} + ${DELTA_GEN_SETTING} DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py diff --git a/indra/newview/alsquirrelupdater.cpp b/indra/newview/alsquirrelupdater.cpp index 73afe03fc74..c958d7c768b 100644 --- a/indra/newview/alsquirrelupdater.cpp +++ b/indra/newview/alsquirrelupdater.cpp @@ -27,6 +27,8 @@ #include "alsquirrelupdater.h" +#include "llviewerbuildconfig.h" + #include "llappviewer.h" #include "llnotificationsutil.h" #include "llversioninfo.h" @@ -39,6 +41,14 @@ #include "llwin32headerslean.h" #include "llstartup.h" +#if LL_WINDOWS +#define UPDATER_PLATFORM "windows" +#define UPDATER_ARCH "x64" +#elif LL_DARWIN +#define UPDATER_PLATFORM "macos" +#define UPDATER_ARCH "universal" +#endif + static std::string win32_errorcode_to_string(LONG errorMessageID) { if (errorMessageID == 0) @@ -121,7 +131,7 @@ struct ALRegWriter void ALUpdateUtils::updateSlurlRegistryKeys(const std::string& protocol, const std::string& name, const std::string& executable_path) { // SecondLife slurls - std::wstring reg_path = ll_convert_string_to_wide(llformat("Software\\Classes\\%s", protocol.c_str())); + std::wstring reg_path = ll_convert_string_to_wide(fmt::format("Software\\Classes\\{}", protocol)); if (auto regpath = ALRegWriter(HKEY_CURRENT_USER, reg_path)) { regpath.setValue(name); @@ -143,7 +153,7 @@ void ALUpdateUtils::updateSlurlRegistryKeys(const std::string& protocol, const s if (auto command = open.createSubKey(TEXT("command"))) { - std::string open_cmd_string = llformat("\"%s\" -url \"%s\"", executable_path.c_str(), "%1"); + std::string open_cmd_string = fmt::format("\"{}\" -url \"%1\"", executable_path); command.setValue(open_cmd_string, REG_EXPAND_SZ); } } @@ -154,8 +164,6 @@ void ALUpdateUtils::updateSlurlRegistryKeys(const std::string& protocol, const s // static bool ALUpdateUtils::handleCommandLineParse(LLControlGroupCLP& clp) { - if(!ALUpdateHandler::isSupported()) return true; - bool is_install = clp.hasOption("squirrel-install"); bool is_update = clp.hasOption("squirrel-updated"); bool is_uninstall = clp.hasOption("squirrel-uninstall"); @@ -232,9 +240,9 @@ bool ALUpdateUtils::handleCommandLineParse(LLControlGroupCLP& clp) } LLAppViewer::instance()->removeDumpDir(); LLAppViewer::instance()->removeMarkerFiles(); - return false; + return true; } - return true; + return false; } ALUpdateHandler::ALUpdateHandler() @@ -250,8 +258,7 @@ ALUpdateHandler::ALUpdateHandler() { std::string channel = LLVersionInfo::instance().getChannel(); channel.erase(std::remove_if(channel.begin(), channel.end(), isspace), channel.end()); - - mUpdateURL = llformat("http://update.alchemyviewer.net/windows%s/channel/%s/", std::to_string(ADDRESS_SIZE).c_str(), channel.c_str()); + mUpdateURL = fmt::format("{}/{}/{}/{}/", VIEWER_UPDATE_SERVICE, UPDATER_PLATFORM, UPDATER_ARCH, channel); } LL_INFOS() << "Update service url: " << mUpdateURL << LL_ENDL; @@ -468,8 +475,8 @@ void ALUpdateHandler::updateCheckFinished(const LLSD& data) else if (update_preference == 2) { LLSD args; - args["VIEWER_VER"] = llformat("%s %s", LLVersionInfo::instance().getChannel().c_str(), LLVersionInfo::instance().getShortVersion().c_str()); - args["VIEWER_UPDATES"] = llformat("%s", new_ver.version().c_str()); + args["VIEWER_VER"] = fmt::format("{} {}", LLVersionInfo::instance().getChannel(), LLVersionInfo::instance().getShortVersion()); + args["VIEWER_UPDATES"] = fmt::format("{}", new_ver.version()); LLSD payload; payload["user_update_action"] = LLSD(E_DOWNLOAD_INSTALL); LLNotificationsUtil::add("UpdateDownloadRequest", args, payload, boost::bind(&ALUpdateHandler::onUpdateNotification, this, _1, _2)); @@ -507,7 +514,7 @@ void ALUpdateHandler::updateDownloadFinished(const LLSD& data) } } LLSD args; - args["VIEWER_VER"] = llformat("%s %s", LLVersionInfo::instance().getChannel().c_str(), new_ver.version().c_str()); + args["VIEWER_VER"] = fmt::format("{} {}", LLVersionInfo::instance().getChannel(), new_ver.version()); args["VIEWER_UPDATES"] = releases; LLSD payload; payload["user_update_action"] = LLSD(E_DOWNLOADED); @@ -524,8 +531,8 @@ void ALUpdateHandler::updateInstallFinished(const LLSD& data) ALVersionInfo new_ver; if (mSavedUpdateInfo.has("futureVersion")) new_ver.parse(mSavedUpdateInfo["futureVersion"].asString()); LLSD args; - args["VIEWER_VER"] = llformat("%s %s", LLVersionInfo::instance().getChannel().c_str(), LLVersionInfo::instance().getShortVersion().c_str()); - args["VIEWER_UPDATES"] = llformat("%s", new_ver.version().c_str()); + args["VIEWER_VER"] = fmt::format("{} {}", LLVersionInfo::instance().getChannel(), LLVersionInfo::instance().getShortVersion()); + args["VIEWER_UPDATES"] = fmt::format("{}", new_ver.version()); LLSD payload; payload["user_update_action"] = LLSD(E_INSTALLED_RESTART); LLNotificationsUtil::add((LLStartUp::getStartupState() < STATE_STARTED ? "UpdateInstalledRestart" : "UpdateInstalledRestartToast"), args, payload, boost::bind(&ALUpdateHandler::onUpdateNotification, this, _1, _2)); diff --git a/indra/newview/installers/windows/placeholder.gif b/indra/newview/installers/windows/placeholder.gif new file mode 100644 index 0000000000000000000000000000000000000000..fe374f1c6176cf7f82bd49741a2b6fb7721ac12d GIT binary patch literal 9287 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 Z*zlOx44(KvoY=~q_*j0)niCGv{y)Stiq!xB literal 0 HcmV?d00001 diff --git a/indra/newview/installers/windows/viewer.nuspec b/indra/newview/installers/windows/viewer.nuspec index af8fb411ab8..6325fd4a38d 100644 --- a/indra/newview/installers/windows/viewer.nuspec +++ b/indra/newview/installers/windows/viewer.nuspec @@ -5,12 +5,12 @@ <version>${VIEWER_VERSION_MAJOR}.${VIEWER_VERSION_MINOR}.${VIEWER_VERSION_PATCH}</version> <authors>Alchemy Development Group</authors> <owners>Alchemy Development Group</owners> - <title>${VIEWER_CHANNEL}</title> + <title>${VIEWER_CHANNEL}</title> <description>${VIEWER_CHANNEL}</description> <copyright>Copyright (C) 2013-2023 Alchemy Development Group</copyright> <projectUrl>https://www.alchemyviewer.org</projectUrl> </metadata> <files> - <file src="Release\**\*.*" target="lib\net45\" exclude="Release\**\*.pdb;Release\**\*.vshost.*;Release\**\*.nsi;Release\**\*.bat;Release\**\*_Setup.exe;Release\**\*-bin.exe"/> + <file src="Release\**\*.*" target="lib\net45\" exclude="Release\**\*.pdb;Release\**\*.vshost.*;Release\**\*.nsi;Release\**\*.bat;Release\**\*_Setup.exe;Release\**\*-bin.exe;Release\**\*.exp;Release\**\*.lib"/> </files> </package> diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 6f5fe3352ce..3aa83d8c981 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -2560,7 +2560,7 @@ bool LLAppViewer::initConfiguration() } #if LL_WINDOWS - if (ALUpdateHandler::isSupported() && !ALUpdateUtils::handleCommandLineParse(clp)) + if (ALUpdateUtils::handleCommandLineParse(clp)) { return false; } diff --git a/indra/newview/llviewerbuildconfig.h.in b/indra/newview/llviewerbuildconfig.h.in index a408ccd56a5..4e975df04b0 100644 --- a/indra/newview/llviewerbuildconfig.h.in +++ b/indra/newview/llviewerbuildconfig.h.in @@ -42,6 +42,9 @@ #define LL_VIEWER_VERSION_MINOR @VIEWER_VERSION_MINOR@ #define LL_VIEWER_VERSION_PATCH @VIEWER_VERSION_PATCH@ +// Updater URL +#define VIEWER_UPDATE_SERVICE "@VIEWER_UPDATE_SERVICE@" + // Sentry #define SENTRY_DSN "@SENTRY_DSN@" diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py index d7b4f56e2b0..139b93d1c62 100755 --- a/indra/newview/viewer_manifest.py +++ b/indra/newview/viewer_manifest.py @@ -617,22 +617,46 @@ def package_finish(self): '-Properties', 'NoWarn=NU5128', os.path.join(self.args['build'], 'viewer.nuspec')]) + #Build installer and update delta squirrel_exe = os.path.join(self.args['build'], os.pardir, 'packages', 'squirrel', 'Squirrel.exe') + + # Download previous build for delta generation + temp_installdir = os.path.join(self.args['build'], 'Installer') + if 'gendelta' in self.args and 'updateurl' in self.args: + if (self.address_size == 64): + updater_arch = 'x64' + else: + updater_arch = 'x86' + + self.run_command( + [squirrel_exe, + 'http-down', + '--releaseDir', temp_installdir, + '--url', '{}/windows/{}/{}/'.format(self.args['updateurl'], updater_arch, self.app_name_oneword())]) + + # Build installer files + temp_nupkg = os.path.join(self.args['build'], '{}.{}.nupkg'.format(self.app_name_oneword(), '.'.join(self.args['version']))) self.run_command( [squirrel_exe, 'releasify', - '--releaseDir', os.path.join(self.args['build'], 'Releases'), + '--releaseDir', temp_installdir, '--framework', 'vcredist143-x64', '--icon', os.path.join(self.args['source'], 'installers', 'windows', 'install_icon.ico'), - '--splashImage', os.path.join(self.args['source'], 'installers', 'windows', 'splash.gif'), - '--package', os.path.join(self.args['build'], '{}.{}.nupkg'.format(self.app_name_oneword(), '.'.join(self.args['version'])))]) + '--splashImage', os.path.join(self.args['source'], 'installers', 'windows', 'placeholder.gif'), + '--package', temp_nupkg]) + # Copy to final installer destination installer_file = self.installer_base_name() + '_Setup.exe' + with self.prefix(src=temp_installdir, dst=os.path.join(self.args['build'], 'Deploy')): # everything goes in Contents + self.path(src=self.app_name_oneword() + 'Setup.exe', dst=installer_file) + self.path('{}-{}-*.nupkg'.format(self.app_name_oneword(), '.'.join(self.args['version']))) + self.path('RELEASES') - os.rename(os.path.join('Releases', self.app_name_oneword() + 'Setup.exe'), os.path.join('Release', installer_file)) + # Clean up temporary files + os.remove(temp_nupkg) + shutil.rmtree(temp_installdir, True) - self.sign(installer_file) - self.created_path(self.dst_path_of(installer_file)) + self.created_path(os.path.join(self.args['build'], 'Deploy', installer_file)) self.package_file = installer_file def sign(self, exe): -- GitLab