From a7d5d28c47e3c2c264b5c640780fabf4d1200137 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 10 May 2023 11:06:24 +0800 Subject: [PATCH 01/10] Init --- build_scripts/windows/scripts/build.cmd | 2 +- src/azure-cli/azure/cli/command_modules/util/custom.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build_scripts/windows/scripts/build.cmd b/build_scripts/windows/scripts/build.cmd index 3944e96b925..9dcb2833eb0 100644 --- a/build_scripts/windows/scripts/build.cmd +++ b/build_scripts/windows/scripts/build.cmd @@ -13,7 +13,7 @@ if "%CLI_VERSION%"=="" ( echo Please set the CLI_VERSION environment variable, e.g. 2.0.13 goto ERROR ) -set PYTHON_VERSION=3.10.10 +set PYTHON_VERSION=3.10.11 set WIX_DOWNLOAD_URL="https://azurecliprod.blob.core.windows.net/msi/wix310-binaries-mirror.zip" set PYTHON_DOWNLOAD_URL="https://www.python.org/ftp/python/%PYTHON_VERSION%/python-%PYTHON_VERSION%-embed-win32.zip" diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index eae026dc189..1c9e1c80502 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -53,6 +53,7 @@ def upgrade_version(cmd, update_all=None, yes=None): # pylint: disable=too-many from azure.cli.core.util import get_latest_from_github try: latest_version = get_latest_from_github() + local_version = '2.48.0' if latest_version and parse(latest_version) <= parse(local_version): logger.warning("You already have the latest azure-cli version: %s", local_version) update_cli = False @@ -65,6 +66,7 @@ def upgrade_version(cmd, update_all=None, yes=None): # pylint: disable=too-many exit_code = 0 installer = os.getenv(_ENV_AZ_INSTALLER) or '' installer = installer.upper() + installer = 'MSI' if update_cli: latest_version_msg = 'It will be updated to {}.'.format(latest_version) if yes \ else 'Latest version available is {}.'.format(latest_version) @@ -187,10 +189,14 @@ def _upgrade_on_windows(): """ logger.warning("Updating Azure CLI with MSI from https://aka.ms/installazurecliwindows") tmp_dir, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') + # C:\Users\hanglei\AppData\Local\Temp\tmpnl6ypp4t\azure-cli-2.48.1.msi + print(msi_path) logger.warning("Installing MSI") import subprocess - exit_code = subprocess.call(['msiexec.exe', '/i', msi_path]) + subprocess.call(['msiexec.exe', '/i', msi_path]) + logger.warning("Installation started, please wait for a few minutes.") + return 0 if exit_code: logger.warning("Installation Failed. You may manually install %s", msi_path) From 5bbb874e41d7a38bb0bff91cba15c90d5875d42b Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Wed, 17 May 2023 17:10:03 +0800 Subject: [PATCH 02/10] Minor fix --- build_scripts/windows/scripts/build.cmd | 2 +- .../azure/cli/command_modules/util/custom.py | 11 ++++------- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/build_scripts/windows/scripts/build.cmd b/build_scripts/windows/scripts/build.cmd index 9dcb2833eb0..0f9fcffd7e8 100644 --- a/build_scripts/windows/scripts/build.cmd +++ b/build_scripts/windows/scripts/build.cmd @@ -13,7 +13,7 @@ if "%CLI_VERSION%"=="" ( echo Please set the CLI_VERSION environment variable, e.g. 2.0.13 goto ERROR ) -set PYTHON_VERSION=3.10.11 +set PYTHON_VERSION=3.10.8 set WIX_DOWNLOAD_URL="https://azurecliprod.blob.core.windows.net/msi/wix310-binaries-mirror.zip" set PYTHON_DOWNLOAD_URL="https://www.python.org/ftp/python/%PYTHON_VERSION%/python-%PYTHON_VERSION%-embed-win32.zip" diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 1c9e1c80502..354d10e61d9 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -53,7 +53,7 @@ def upgrade_version(cmd, update_all=None, yes=None): # pylint: disable=too-many from azure.cli.core.util import get_latest_from_github try: latest_version = get_latest_from_github() - local_version = '2.48.0' + local_version = '2.45.0' if latest_version and parse(latest_version) <= parse(local_version): logger.warning("You already have the latest azure-cli version: %s", local_version) update_cli = False @@ -66,7 +66,6 @@ def upgrade_version(cmd, update_all=None, yes=None): # pylint: disable=too-many exit_code = 0 installer = os.getenv(_ENV_AZ_INSTALLER) or '' installer = installer.upper() - installer = 'MSI' if update_cli: latest_version_msg = 'It will be updated to {}.'.format(latest_version) if yes \ else 'Latest version available is {}.'.format(latest_version) @@ -189,14 +188,12 @@ def _upgrade_on_windows(): """ logger.warning("Updating Azure CLI with MSI from https://aka.ms/installazurecliwindows") tmp_dir, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') - # C:\Users\hanglei\AppData\Local\Temp\tmpnl6ypp4t\azure-cli-2.48.1.msi - print(msi_path) - logger.warning("Installing MSI") import subprocess - subprocess.call(['msiexec.exe', '/i', msi_path]) + subprocess.Popen(['msiexec.exe', '/i', msi_path]) logger.warning("Installation started, please wait for a few minutes.") - return 0 + import sys + sys.exit(0) if exit_code: logger.warning("Installation Failed. You may manually install %s", msi_path) From fd1c7026cff84d949032f3c6343dd279b32e0ce9 Mon Sep 17 00:00:00 2001 From: Hang Date: Fri, 19 May 2023 16:07:15 +0800 Subject: [PATCH 03/10] Update src/azure-cli/azure/cli/command_modules/util/custom.py Co-authored-by: Jiashuo Li <4003950+jiasli@users.noreply.github.com> --- src/azure-cli/azure/cli/command_modules/util/custom.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 354d10e61d9..f94840d9ef6 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -191,7 +191,7 @@ def _upgrade_on_windows(): logger.warning("Installing MSI") import subprocess subprocess.Popen(['msiexec.exe', '/i', msi_path]) - logger.warning("Installation started, please wait for a few minutes.") + logger.warning("Installation started. Please complete upgrade in the opened window.") import sys sys.exit(0) From 14a80a5a94794c3b9b169c82253b7d7bc580fc37 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 19 May 2023 16:08:47 +0800 Subject: [PATCH 04/10] Minor fix --- .../azure/cli/command_modules/util/custom.py | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index f94840d9ef6..3e1d380f1a7 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -186,23 +186,15 @@ def _upgrade_on_windows(): Directly installing from URL may be blocked by policy: https://github.com/Azure/azure-cli/issues/19171 This also gives the user a chance to manually install the MSI in case of msiexec.exe failure. """ + import subprocess + import sys logger.warning("Updating Azure CLI with MSI from https://aka.ms/installazurecliwindows") tmp_dir, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') logger.warning("Installing MSI") - import subprocess subprocess.Popen(['msiexec.exe', '/i', msi_path]) logger.warning("Installation started. Please complete upgrade in the opened window.") - import sys sys.exit(0) - if exit_code: - logger.warning("Installation Failed. You may manually install %s", msi_path) - else: - from azure.cli.core.util import rmtree_with_retry - logger.warning("Succeeded. Deleting %s", tmp_dir) - rmtree_with_retry(tmp_dir) - return exit_code - def _download_from_url(url): import requests From 11f4647b9adc0be1cfdf86c9cf840856731b9485 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 19 May 2023 16:20:57 +0800 Subject: [PATCH 05/10] Add instruction --- src/azure-cli/azure/cli/command_modules/util/custom.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 3e1d380f1a7..18cf711f2a1 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -192,7 +192,8 @@ def _upgrade_on_windows(): tmp_dir, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') logger.warning("Installing MSI") subprocess.Popen(['msiexec.exe', '/i', msi_path]) - logger.warning("Installation started. Please complete upgrade in the opened window.") + logger.warning("Installation started. Please complete upgrade in the opened window.\nTo update extensions, you " + "need to run 'az upgrade' again after completing the upgrade.") sys.exit(0) From 89f4f78148890e7552e6a670278efdfba3a38495 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 19 May 2023 16:24:50 +0800 Subject: [PATCH 06/10] Minor fix --- build_scripts/windows/scripts/build.cmd | 2 +- src/azure-cli/azure/cli/command_modules/util/custom.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/build_scripts/windows/scripts/build.cmd b/build_scripts/windows/scripts/build.cmd index 0f9fcffd7e8..3944e96b925 100644 --- a/build_scripts/windows/scripts/build.cmd +++ b/build_scripts/windows/scripts/build.cmd @@ -13,7 +13,7 @@ if "%CLI_VERSION%"=="" ( echo Please set the CLI_VERSION environment variable, e.g. 2.0.13 goto ERROR ) -set PYTHON_VERSION=3.10.8 +set PYTHON_VERSION=3.10.10 set WIX_DOWNLOAD_URL="https://azurecliprod.blob.core.windows.net/msi/wix310-binaries-mirror.zip" set PYTHON_DOWNLOAD_URL="https://www.python.org/ftp/python/%PYTHON_VERSION%/python-%PYTHON_VERSION%-embed-win32.zip" diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 18cf711f2a1..ae8c4ab9de0 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -53,7 +53,6 @@ def upgrade_version(cmd, update_all=None, yes=None): # pylint: disable=too-many from azure.cli.core.util import get_latest_from_github try: latest_version = get_latest_from_github() - local_version = '2.45.0' if latest_version and parse(latest_version) <= parse(local_version): logger.warning("You already have the latest azure-cli version: %s", local_version) update_cli = False From b049e8b110c4bdac8e0a94f010380ab6653ea095 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 19 May 2023 16:27:12 +0800 Subject: [PATCH 07/10] Minor fix --- src/azure-cli/azure/cli/command_modules/util/custom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index ae8c4ab9de0..0c1dd6b30a0 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -191,8 +191,8 @@ def _upgrade_on_windows(): tmp_dir, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') logger.warning("Installing MSI") subprocess.Popen(['msiexec.exe', '/i', msi_path]) - logger.warning("Installation started. Please complete upgrade in the opened window.\nTo update extensions, you " - "need to run 'az upgrade' again after completing the upgrade.") + logger.warning("Installation started. Please complete the upgrade in the opened window.\nTo update extensions, " + "please run `az upgrade` again after completing the upgrade.") sys.exit(0) From a65cb46561769c8a45f1ebe6fb742b7bb1063423 Mon Sep 17 00:00:00 2001 From: Hang Lei Date: Fri, 19 May 2023 17:52:52 +0800 Subject: [PATCH 08/10] Minor fix --- src/azure-cli/azure/cli/command_modules/util/custom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 0c1dd6b30a0..f78eb68a11e 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -137,7 +137,7 @@ def upgrade_version(cmd, update_all=None, yes=None): # pylint: disable=too-many logger.warning("Exit the container to pull latest image with 'docker pull mcr.microsoft.com/azure-cli' " "or run 'pip install --upgrade azure-cli' in this container") elif installer == 'MSI': - exit_code = _upgrade_on_windows() + _upgrade_on_windows() else: logger.warning(UPGRADE_MSG) if exit_code: @@ -188,7 +188,7 @@ def _upgrade_on_windows(): import subprocess import sys logger.warning("Updating Azure CLI with MSI from https://aka.ms/installazurecliwindows") - tmp_dir, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') + _, msi_path = _download_from_url('https://aka.ms/installazurecliwindows') logger.warning("Installing MSI") subprocess.Popen(['msiexec.exe', '/i', msi_path]) logger.warning("Installation started. Please complete the upgrade in the opened window.\nTo update extensions, " From c8bb0f3b22c18d8e497d0d3ad9f0b68445711162 Mon Sep 17 00:00:00 2001 From: Hang Date: Thu, 28 Sep 2023 14:54:05 +0800 Subject: [PATCH 09/10] Save MSI to ~\AppData\Local\Temp\azure-cli-msi --- .../azure/cli/command_modules/util/custom.py | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 1b991b5f60f..4563df5f62f 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -190,22 +190,31 @@ def _upgrade_on_windows(): import platform import subprocess import sys + import tempfile + + from pathlib import Path + from azure.cli.core.util import rmtree_with_retry if platform.architecture()[0] == '32bit': msi_url = 'https://aka.ms/installazurecliwindows' else: msi_url = 'https://aka.ms/installazurecliwindowsx64' logger.warning("Updating Azure CLI with MSI from %s", msi_url) - _, msi_path = _download_from_url(msi_url) - logger.warning("Installing MSI") + # Save MSI to ~\AppData\Local\Temp\azure-cli-msi, clean up the folder first + msi_dir = Path(tempfile.gettempdir()) / 'azure-cli-msi' + rmtree_with_retry(msi_dir) + msi_dir.mkdir() + + msi_path = _download_from_url(msi_url, msi_dir) + subprocess.Popen(['msiexec.exe', '/i', msi_path]) logger.warning("Installation started. Please complete the upgrade in the opened window.\nTo update extensions, " "please run `az upgrade` again after completing the upgrade.") sys.exit(0) -def _download_from_url(url): +def _download_from_url(url, target_dir): import requests from azure.cli.core.util import should_disable_connection_verify r = requests.get(url, stream=True, verify=(not should_disable_connection_verify())) @@ -214,19 +223,14 @@ def _download_from_url(url): # r.url is the real path of the msi, like'https://azcliprod.blob.core.windows.net/msi/azure-cli-2.27.1.msi' file_name = r.url.rsplit('/')[-1] - import tempfile - tmp_dir = tempfile.mkdtemp() - msi_path = os.path.join(tmp_dir, file_name) + msi_path = os.path.join(target_dir, file_name) logger.warning("Downloading MSI to %s", msi_path) with open(msi_path, 'wb') as f: for chunk in r.iter_content(chunk_size=1024): f.write(chunk) - # Return both the temp directory and MSI path, like - # 'C:\Users\\AppData\Local\Temp\tmpzv4pelsf', - # 'C:\Users\\AppData\Local\Temp\tmpzv4pelsf\azure-cli-2.27.1.msi' - return tmp_dir, msi_path + return msi_path def demo_style(cmd, theme=None): # pylint: disable=unused-argument From ffcd51d73a84d3f01acab1788024bfe2f393dc64 Mon Sep 17 00:00:00 2001 From: Hang Date: Mon, 16 Oct 2023 15:54:29 +0800 Subject: [PATCH 10/10] Remove pathlib --- src/azure-cli/azure/cli/command_modules/util/custom.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/util/custom.py b/src/azure-cli/azure/cli/command_modules/util/custom.py index 4563df5f62f..f8631a49d5b 100644 --- a/src/azure-cli/azure/cli/command_modules/util/custom.py +++ b/src/azure-cli/azure/cli/command_modules/util/custom.py @@ -192,7 +192,6 @@ def _upgrade_on_windows(): import sys import tempfile - from pathlib import Path from azure.cli.core.util import rmtree_with_retry if platform.architecture()[0] == '32bit': @@ -202,9 +201,9 @@ def _upgrade_on_windows(): logger.warning("Updating Azure CLI with MSI from %s", msi_url) # Save MSI to ~\AppData\Local\Temp\azure-cli-msi, clean up the folder first - msi_dir = Path(tempfile.gettempdir()) / 'azure-cli-msi' + msi_dir = os.path.join(tempfile.gettempdir(), 'azure-cli-msi') rmtree_with_retry(msi_dir) - msi_dir.mkdir() + os.makedirs(msi_dir, exist_ok=True) msi_path = _download_from_url(msi_url, msi_dir)