From 978ab79564cafd23e31f7bcc76fe4126aed38230 Mon Sep 17 00:00:00 2001 From: Aleksandr Chebotov <47745270+al-cheb@users.noreply.github.com> Date: Fri, 26 Nov 2021 17:49:05 +0300 Subject: [PATCH] [Windows] Invoke Move-Item and Rename-Item with retry after Extract-7Zip (#4598) --- .../scripts/ImageHelpers/ImageHelpers.psm1 | 1 + .../scripts/ImageHelpers/InstallHelpers.ps1 | 26 +++++++++++++++++++ .../scripts/Installers/Install-AndroidSDK.ps1 | 8 +++--- .../scripts/Installers/Install-JavaTools.ps1 | 4 ++- .../scripts/Installers/Install-MysqlCli.ps1 | 4 ++- .../win/scripts/Installers/Install-PyPy.ps1 | 4 ++- .../win/scripts/Installers/Install-Ruby.ps1 | 4 ++- 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/images/win/scripts/ImageHelpers/ImageHelpers.psm1 b/images/win/scripts/ImageHelpers/ImageHelpers.psm1 index bf7438f76..b6545dec3 100644 --- a/images/win/scripts/ImageHelpers/ImageHelpers.psm1 +++ b/images/win/scripts/ImageHelpers/ImageHelpers.psm1 @@ -43,6 +43,7 @@ Export-ModuleMember -Function @( 'Get-WhichTool' 'Get-EnvironmentVariable' 'Invoke-PesterTests' + 'Invoke-SBWithRetry' 'Get-VsCatalogJsonPath' 'Install-AndroidSDKPackages' 'Get-AndroidPackages' diff --git a/images/win/scripts/ImageHelpers/InstallHelpers.ps1 b/images/win/scripts/ImageHelpers/InstallHelpers.ps1 index 0791b7f30..eddac73da 100644 --- a/images/win/scripts/ImageHelpers/InstallHelpers.ps1 +++ b/images/win/scripts/ImageHelpers/InstallHelpers.ps1 @@ -533,3 +533,29 @@ function Get-WindowsUpdatesHistory { } } } + +function Invoke-SBWithRetry { + param ( + [scriptblock] $Command, + [int] $RetryCount = 10, + [int] $TimeoutInSecs = 5 + ) + + while ($RetryCount -gt 0) { + try { + & $Command + return + } + catch { + Write-Host "There is an error encounterd:`n $_" + $RetryCount-- + + if ($RetryCount -eq 0) { + exit 1 + } + + Write-Host "Waiting $TimeoutInSecs seconds before retrying. Retries left: $RetryCount" + Start-Sleep -Seconds $TimeoutInSecs + } + } +} diff --git a/images/win/scripts/Installers/Install-AndroidSDK.ps1 b/images/win/scripts/Installers/Install-AndroidSDK.ps1 index 427614d9a..dfb163cf1 100644 --- a/images/win/scripts/Installers/Install-AndroidSDK.ps1 +++ b/images/win/scripts/Installers/Install-AndroidSDK.ps1 @@ -8,11 +8,13 @@ $cmdlineToolsUrl = "https://dl.google.com/android/repository/commandlinetools-wi $cmdlineToolsArchPath = Start-DownloadWithRetry -Url $cmdlineToolsUrl -Name "cmdline-tools.zip" $sdkInstallRoot = "C:\Program Files (x86)\Android\android-sdk" $sdkRoot = "C:\Android\android-sdk" -Expand-Archive -Path $cmdlineToolsArchPath -DestinationPath "${sdkInstallRoot}\cmdline-tools" -Force +Extract-7Zip -Path $cmdlineToolsArchPath -DestinationPath "${sdkInstallRoot}\cmdline-tools" # cmdline tools should be installed in ${sdkInstallRoot}\cmdline-tools\latest\bin, but archive contains ${sdkInstallRoot}\cmdline-tools\bin # we need to create the proper folder structure -Rename-Item "${sdkInstallRoot}\cmdline-tools\cmdline-tools" "latest" +Invoke-SBWithRetry -Command { + Rename-Item "${sdkInstallRoot}\cmdline-tools\cmdline-tools" "latest" -ErrorAction Stop +} # ANDROID_NDK_PATH/HOME should not contain spaces. Otherwise, the script ndk-build.cmd gives an error https://github.com/actions/virtual-environments/issues/1122 # create "C:\Android" directory and a hardlink inside pointed to sdk in Program Files @@ -33,7 +35,7 @@ $sdkManager = "$sdkRoot\cmdline-tools\latest\bin\sdkmanager.bat" $licenseContentBase64 = "UEsDBBQAAAAAAKNK11IAAAAAAAAAAAAAAAAJAAAAbGljZW5zZXMvUEsDBAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhAAAAbGljZW5zZXMvYW5kcm9pZC1nb29nbGV0di1saWNlbnNlDQo2MDEwODViOTRjZDc3ZjBiNTRmZjg2NDA2OTU3MDk5ZWJlNzljNGQ2UEsDBAoAAAAAAKBK11LzQumJKgAAACoAAAAkAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlDQo4NTlmMzE3Njk2ZjY3ZWYzZDdmMzBhNTBhNTU2MGU3ODM0YjQzOTAzUEsDBAoAAAAAAKFK11IKSOJFKgAAACoAAAAcAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstbGljZW5zZQ0KMjQzMzNmOGE2M2I2ODI1ZWE5YzU1MTRmODNjMjgyOWIwMDRkMWZlZVBLAwQKAAAAAACiStdSec1a4SoAAAAqAAAAJAAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLXByZXZpZXctbGljZW5zZQ0KODQ4MzFiOTQwOTY0NmE5MThlMzA1NzNiYWI0YzljOTEzNDZkOGFiZFBLAwQKAAAAAACiStdSk6vQKCoAAAAqAAAAGwAAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQ0KMzNiNmEyYjY0NjA3ZjExYjc1OWYzMjBlZjlkZmY0YWU1YzQ3ZDk3YVBLAwQKAAAAAACiStdSrE3jESoAAAAqAAAAJAAAAGxpY2Vuc2VzL2ludGVsLWFuZHJvaWQtZXh0cmEtbGljZW5zZQ0KZDk3NWY3NTE2OThhNzdiNjYyZjEyNTRkZGJlZWQzOTAxZTk3NmY1YVBLAwQKAAAAAACjStdSkb1vWioAAAAqAAAAJgAAAGxpY2Vuc2VzL21pcHMtYW5kcm9pZC1zeXNpbWFnZS1saWNlbnNlDQplOWFjYWI1YjVmYmI1NjBhNzJjZmFlY2NlODk0Njg5NmZmNmFhYjlkUEsBAj8AFAAAAAAAo0rXUgAAAAAAAAAAAAAAAAkAJAAAAAAAAAAQAAAAAAAAAGxpY2Vuc2VzLwoAIAAAAAAAAQAYACIHOBcRaNcBIgc4FxFo1wHBTVQTEWjXAVBLAQI/AAoAAAAAAJ1K11K7n0IrKgAAACoAAAAhACQAAAAAAAAAIAAAACcAAABsaWNlbnNlcy9hbmRyb2lkLWdvb2dsZXR2LWxpY2Vuc2UKACAAAAAAAAEAGACUEFUTEWjXAZQQVRMRaNcB6XRUExFo1wFQSwECPwAKAAAAAACgStdS80LpiSoAAAAqAAAAJAAkAAAAAAAAACAAAACQAAAAbGljZW5zZXMvYW5kcm9pZC1zZGstYXJtLWRidC1saWNlbnNlCgAgAAAAAAABABgAsEM0FBFo1wGwQzQUEWjXAXb1MxQRaNcBUEsBAj8ACgAAAAAAoUrXUgpI4kUqAAAAKgAAABwAJAAAAAAAAAAgAAAA/AAAAGxpY2Vuc2VzL2FuZHJvaWQtc2RrLWxpY2Vuc2UKACAAAAAAAAEAGAAsMGUVEWjXASwwZRURaNcB5whlFRFo1wFQSwECPwAKAAAAAACiStdSec1a4SoAAAAqAAAAJAAkAAAAAAAAACAAAABgAQAAbGljZW5zZXMvYW5kcm9pZC1zZGstcHJldmlldy1saWNlbnNlCgAgAAAAAAABABgA7s3WFRFo1wHuzdYVEWjXAfGm1hURaNcBUEsBAj8ACgAAAAAAokrXUpOr0CgqAAAAKgAAABsAJAAAAAAAAAAgAAAAzAEAAGxpY2Vuc2VzL2dvb2dsZS1nZGstbGljZW5zZQoAIAAAAAAAAQAYAGRDRxYRaNcBZENHFhFo1wFfHEcWEWjXAVBLAQI/AAoAAAAAAKJK11KsTeMRKgAAACoAAAAkACQAAAAAAAAAIAAAAC8CAABsaWNlbnNlcy9pbnRlbC1hbmRyb2lkLWV4dHJhLWxpY2Vuc2UKACAAAAAAAAEAGADGsq0WEWjXAcayrRYRaNcBxrKtFhFo1wFQSwECPwAKAAAAAACjStdSkb1vWioAAAAqAAAAJgAkAAAAAAAAACAAAACbAgAAbGljZW5zZXMvbWlwcy1hbmRyb2lkLXN5c2ltYWdlLWxpY2Vuc2UKACAAAAAAAAEAGAA4LjgXEWjXATguOBcRaNcBIgc4FxFo1wFQSwUGAAAAAAgACACDAwAACQMAAAAA" $licenseContent = [System.Convert]::FromBase64String($licenseContentBase64) Set-Content -Path "$sdkInstallRoot\android-sdk-licenses.zip" -Value $licenseContent -Encoding Byte -Expand-Archive "$sdkInstallRoot\android-sdk-licenses.zip" $sdkInstallRoot +Extract-7Zip -Path "$sdkInstallRoot\android-sdk-licenses.zip" -DestinationPath $sdkInstallRoot # install platform-tools $platformToolsPath = Join-Path -Path $sdkInstallRoot -ChildPath "platform-tools" diff --git a/images/win/scripts/Installers/Install-JavaTools.ps1 b/images/win/scripts/Installers/Install-JavaTools.ps1 index 4a798a7c7..7f8492ef0 100644 --- a/images/win/scripts/Installers/Install-JavaTools.ps1 +++ b/images/win/scripts/Installers/Install-JavaTools.ps1 @@ -92,7 +92,9 @@ function Install-JavaJDK { # Complete the installation by extarcting Java binaries to toolcache and creating the complete file Extract-7Zip -Path $archivePath -DestinationPath $javaVersionPath - Get-ChildItem -Path $javaVersionPath | Rename-Item -NewName $javaArchPath + Invoke-SBWithRetry -Command { + Get-ChildItem -Path $javaVersionPath | Rename-Item -NewName $javaArchPath -ErrorAction Stop + } New-Item -ItemType File -Path $javaVersionPath -Name "$Architecture.complete" | Out-Null } diff --git a/images/win/scripts/Installers/Install-MysqlCli.ps1 b/images/win/scripts/Installers/Install-MysqlCli.ps1 index af07d5ad2..3feecfb01 100644 --- a/images/win/scripts/Installers/Install-MysqlCli.ps1 +++ b/images/win/scripts/Installers/Install-MysqlCli.ps1 @@ -22,7 +22,9 @@ Extract-7Zip -Path $MysqlArchPath -DestinationPath "C:\" # Rename mysql-version to mysql folder $MysqlPath = "C:\mysql" -Rename-Item -Path "C:\mysql-${MysqlFullVersion}-winx64" -NewName $MysqlPath +Invoke-SBWithRetry -Command { + Rename-Item -Path "C:\mysql-${MysqlFullVersion}-winx64" -NewName $MysqlPath -ErrorAction Stop +} # Adding mysql in system environment path Add-MachinePathItem "${MysqlPath}\bin" diff --git a/images/win/scripts/Installers/Install-PyPy.ps1 b/images/win/scripts/Installers/Install-PyPy.ps1 index 6a8f1a9ee..dd7d8efb2 100644 --- a/images/win/scripts/Installers/Install-PyPy.ps1 +++ b/images/win/scripts/Installers/Install-PyPy.ps1 @@ -40,7 +40,9 @@ function Install-PyPy New-Item -ItemType Directory -Path $pypyVersionPath -Force | Out-Null Write-Host "Move PyPy '${pythonVersion}' files to '${pypyArchPath}'" - Move-Item -Path $tempFolder -Destination $pypyArchPath | Out-Null + Invoke-SBWithRetry -Command { + Move-Item -Path $tempFolder -Destination $pypyArchPath -ErrorAction Stop | Out-Null + } Write-Host "Install PyPy '${pythonVersion}' in '${pypyArchPath}'" if (Test-Path "$pypyArchPath\python.exe") { diff --git a/images/win/scripts/Installers/Install-Ruby.ps1 b/images/win/scripts/Installers/Install-Ruby.ps1 index caf539500..b1d269e7d 100644 --- a/images/win/scripts/Installers/Install-Ruby.ps1 +++ b/images/win/scripts/Installers/Install-Ruby.ps1 @@ -69,7 +69,9 @@ function Install-Ruby New-Item -ItemType Directory -Path $rubyVersionPath -Force | Out-Null Write-Host "Moving Ruby '${rubyVersion}' files to '${rubyArchPath}'" - Move-Item -Path $tempFolder -Destination $rubyArchPath | Out-Null + Invoke-SBWithRetry -Command { + Move-Item -Path $tempFolder -Destination $rubyArchPath -ErrorAction Stop | Out-Null + } Write-Host "Removing Ruby '${rubyVersion}' documentation '${rubyArchPath}\share\doc' folder" Remove-Item -Path "${rubyArchPath}\share\doc" -Force -Recurse -ErrorAction Ignore