diff --git a/cmake/Packaging.cmake b/cmake/Packaging.cmake index 39d49653fe..1656b49e88 100644 --- a/cmake/Packaging.cmake +++ b/cmake/Packaging.cmake @@ -120,7 +120,7 @@ function(strip_trailing_slash in_url out_url) endif() endfunction() -set(_versioned_target_url_tag ${LY_VERSION_STRING}/${PAL_HOST_PLATFORM_NAME}) +set(CPACK_VERSIONED_TARGET_TAG "${PAL_HOST_PLATFORM_NAME}-${LY_VERSION_STRING}") if(NOT LY_INSTALLER_UPLOAD_URL AND DEFINED ENV{LY_INSTALLER_UPLOAD_URL}) set(LY_INSTALLER_UPLOAD_URL $ENV{LY_INSTALLER_UPLOAD_URL}) @@ -139,7 +139,7 @@ if(LY_INSTALLER_UPLOAD_URL) endif() strip_trailing_slash(${LY_INSTALLER_UPLOAD_URL} LY_INSTALLER_UPLOAD_URL) - set(CPACK_UPLOAD_URL ${LY_INSTALLER_UPLOAD_URL}/${_versioned_target_url_tag}) + set(CPACK_UPLOAD_URL ${LY_INSTALLER_UPLOAD_URL}) endif() # IMPORTANT: required to be included AFTER setting all property overrides @@ -189,7 +189,7 @@ if(LY_INSTALLER_DOWNLOAD_URL) # this will set the following variables: CPACK_DOWNLOAD_SITE, CPACK_DOWNLOAD_ALL, and CPACK_UPLOAD_DIRECTORY (local) cpack_configure_downloads( - ${LY_INSTALLER_DOWNLOAD_URL}/${_versioned_target_url_tag} + ${LY_INSTALLER_DOWNLOAD_URL} UPLOAD_DIRECTORY ${CMAKE_BINARY_DIR}/_CPack_Uploads # to match the _CPack_Packages directory ALL ) diff --git a/cmake/Platform/Windows/PackagingPostBuild.cmake b/cmake/Platform/Windows/PackagingPostBuild.cmake index 63f60994c5..a28ce51f41 100644 --- a/cmake/Platform/Windows/PackagingPostBuild.cmake +++ b/cmake/Platform/Windows/PackagingPostBuild.cmake @@ -24,10 +24,24 @@ set(_ext_flags -ext WixBalExtension ) +set(_build_id_file ${CPACK_BINARY_DIR}/build_id.txt) +if(EXISTS ${_build_id_file}) + file(READ ${_build_id_file} _build_id) + + set(_full_download_url ${CPACK_DOWNLOAD_SITE}/${_build_id}/${CPACK_VERSIONED_TARGET_TAG}) + set(_full_upload_url ${CPACK_UPLOAD_URL}/${_build_id}/${CPACK_VERSIONED_TARGET_TAG}) +else() + # format: YYYY-MM-DD-HHmm UTC + string(TIMESTAMP _timestamp "%Y%-%m-%d-%H%m" UTC) + + set(_full_download_url ${CPACK_DOWNLOAD_SITE}/notag/${_timestamp}/${CPACK_VERSIONED_TARGET_TAG}) + set(_full_upload_url ${CPACK_UPLOAD_URL}/notag/${_timestamp}/${CPACK_VERSIONED_TARGET_TAG}) +endif() + set(_addtional_defines -dCPACK_BOOTSTRAP_THEME_FILE=${CPACK_BINARY_DIR}/BootstrapperTheme -dCPACK_BOOTSTRAP_UPGRADE_GUID=${CPACK_WIX_BOOTSTRAP_UPGRADE_GUID} - -dCPACK_DOWNLOAD_SITE=${CPACK_DOWNLOAD_SITE} + -dCPACK_DOWNLOAD_SITE=${_full_download_url} -dCPACK_LOCAL_INSTALLER_DIR=${_cpack_wix_out_dir} -dCPACK_PACKAGE_FILE_NAME=${CPACK_PACKAGE_FILE_NAME} -dCPACK_PACKAGE_INSTALL_DIRECTORY=${_fixed_package_install_dir} @@ -109,7 +123,7 @@ file(TO_NATIVE_PATH "${_root_path}/scripts/build/tools/upload_to_s3.py" _upload_ file(TO_NATIVE_PATH "${_cpack_wix_out_dir}" _cpack_wix_out_dir) # strip the scheme and extract the bucket/key prefix from the URL -string(REPLACE "s3://" "" _stripped_url ${CPACK_UPLOAD_URL}) +string(REPLACE "s3://" "" _stripped_url ${_full_upload_url}) string(REPLACE "/" ";" _tokens ${_stripped_url}) list(POP_FRONT _tokens _bucket) @@ -127,12 +141,15 @@ set(_upload_command --profile ${CPACK_AWS_PROFILE} ) +message(STATUS "Uploading artifacts to ${_full_upload_url}") execute_process( COMMAND ${_upload_command} RESULT_VARIABLE _upload_result ERROR_VARIABLE _upload_errors ) -if (NOT ${_upload_result} EQUAL 0) +if (${_upload_result} EQUAL 0) + message(STATUS "Artifact uploading complete!") +else() message(FATAL_ERROR "An error occurred uploading artifacts. ${_upload_errors}") endif() diff --git a/scripts/build/Platform/Windows/installer_windows.cmd b/scripts/build/Platform/Windows/installer_windows.cmd index d4f3482aba..5caf8b7b80 100644 --- a/scripts/build/Platform/Windows/installer_windows.cmd +++ b/scripts/build/Platform/Windows/installer_windows.cmd @@ -50,10 +50,25 @@ IF ERRORLEVEL 1 ( GOTO :popd_error ) +REM generate the build ID for artifact upload tagging +PUSHD "%~dp0/../../../.." +SET "ENGINE_ROOT=%cd%" +POPD + +SET "GEN_BUILD_ID_SCRIPT=%ENGINE_ROOT%/scripts/build/tools/generate_build_tag.py" +SET "BUILD_ID_FILE=_CPack/build_id.txt" + +ECHO [ci_build] "%ENGINE_ROOT%/python/python.cmd" -u "%GEN_BUILD_ID_SCRIPT%" "%BUILD_ID_FILE%" +CALL "%ENGINE_ROOT%/python/python.cmd" -u "%GEN_BUILD_ID_SCRIPT%" "%BUILD_ID_FILE%" +IF ERRORLEVEL 1 ( + ECHO [ci_build] Failed to generate build ID + GOTO :popd_error +) + ECHO [ci_build] "!CPACK_PATH!" -C %CONFIGURATION% "!CPACK_PATH!" -C %CONFIGURATION% IF NOT %ERRORLEVEL%==0 ( - rem dump the log file generated by cpack specifically for WIX + REM dump the log file generated by cpack specifically for WIX ECHO **************************************************************** TYPE "_CPack_Packages\\WIX\\wix.log" ECHO **************************************************************** diff --git a/scripts/build/tools/generate_build_tag.py b/scripts/build/tools/generate_build_tag.py new file mode 100644 index 0000000000..56817c064f --- /dev/null +++ b/scripts/build/tools/generate_build_tag.py @@ -0,0 +1,66 @@ +# +# All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or +# its licensors. +# +# For complete copyright and license terms please see the LICENSE at the root of this +# distribution (the "License"). All use of this software is governed by the License, +# or, if provided, by the license below or the license accompanying this file. Do not +# remove or modify any license notices. This file is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# + +import argparse +import os +import pathlib +import shutil +import subprocess +import sys + + +def run_git_command(args, repo_root): + + process = subprocess.run(['git', *args], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + cwd=repo_root, + env=os.environ.copy(), + universal_newlines=True, + ) + + if process.returncode != 0: + print( + f'An error occurred while running a command\n' + f'Command: git {subprocess.list2cmdline(args)}\n' + f'Return Code: {process.returncode}\n' + f'Error: {process.stderr}' + ) + exit(1) + + output = process.stdout.splitlines() + # something went wrong and we somehow got more information then requested + if len(output) != 1: + print(f'Unexpected output received from command: git {subprocess.list2cmdline(args)}') + exit(1) + + return output[0].strip('"') + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description='Generates a build ID based on the state of the git repository') + parser.add_argument('output_file', help='Path to the output file where the build ID will be written to') + parsed_args = parser.parse_args() + + repo_root = os.path.realpath(os.path.join(os.path.dirname(__file__), '..', '..')) + + branch = run_git_command(['branch', '--show-current'], repo_root) + branch = branch.replace('/', '-') + + commit_hash = run_git_command(['show', '--format="%h"', '--no-patch'], repo_root) + + # include the commit date to allow some sensible way of sorting + commit_date = run_git_command(['show', '-s', '--format="%cs"', commit_hash], repo_root) + + with open(parsed_args.output_file, 'w') as out_file: + out_file.write(f'{branch}/{commit_date}-{commit_hash}') + + sys.exit(0)