diff --git a/images/win/Windows2016-Azure.json b/images/win/Windows2016-Azure.json index 2f304145..92d984c2 100644 --- a/images/win/Windows2016-Azure.json +++ b/images/win/Windows2016-Azure.json @@ -469,6 +469,14 @@ "{{ template_dir }}/scripts/Installers/Install-MysqlCli.ps1" ] }, + { + "type": "powershell", + "elevated_user": "SYSTEM", + "elevated_password": "", + "scripts":[ + "{{ template_dir }}/scripts/Installers/Install-SQLExpress.ps1" + ] + }, { "type": "powershell", "scripts":[ @@ -730,6 +738,12 @@ "{{ template_dir }}/scripts/Installers/Validate-Bazel.ps1" ] }, + { + "type": "powershell", + "scripts":[ + "{{ template_dir }}/scripts/Installers/Validate-SQLExpress.ps1" + ] + }, { "type": "powershell", "scripts":[ diff --git a/images/win/Windows2019-Azure.json b/images/win/Windows2019-Azure.json index 9d197301..28cb297a 100644 --- a/images/win/Windows2019-Azure.json +++ b/images/win/Windows2019-Azure.json @@ -450,6 +450,14 @@ "{{ template_dir }}/scripts/Installers/Install-MysqlCli.ps1" ] }, + { + "type": "powershell", + "elevated_user": "SYSTEM", + "elevated_password": "", + "scripts":[ + "{{ template_dir }}/scripts/Installers/Install-SQLExpress.ps1" + ] + }, { "type": "powershell", "scripts":[ @@ -741,6 +749,12 @@ "{{ template_dir }}/scripts/Installers/Validate-MysqlCli.ps1" ] }, + { + "type": "powershell", + "scripts":[ + "{{ template_dir }}/scripts/Installers/Validate-SQLExpress.ps1" + ] + }, { "type": "powershell", "scripts":[ @@ -895,4 +909,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/images/win/scripts/ImageHelpers/ImageHelpers.psm1 b/images/win/scripts/ImageHelpers/ImageHelpers.psm1 index 743dc7a1..c40b1098 100644 --- a/images/win/scripts/ImageHelpers/ImageHelpers.psm1 +++ b/images/win/scripts/ImageHelpers/ImageHelpers.psm1 @@ -20,6 +20,7 @@ Export-ModuleMember -Function @( 'Add-SoftwareDetailsToMarkdown' 'Stop-SvcWithErrHandling' 'Set-SvcWithErrHandling' + 'Start-DownloadWithRetry' 'Install-VsixExtension' 'Get-VSExtensionVersion' 'Get-WinVersion' diff --git a/images/win/scripts/ImageHelpers/InstallHelpers.ps1 b/images/win/scripts/ImageHelpers/InstallHelpers.ps1 index 61dce562..03c4b98f 100644 --- a/images/win/scripts/ImageHelpers/InstallHelpers.ps1 +++ b/images/win/scripts/ImageHelpers/InstallHelpers.ps1 @@ -161,6 +161,46 @@ Hashtable for service arguments } } +function Start-DownloadWithRetry +{ + param ( + [Parameter(Mandatory)] + [string] $Url, + [Parameter(Mandatory)] + [string] $Name, + [string] $DownloadPath = "${env:Temp}", + [int] $retries = 20 + ) + $FilePath = Join-Path $DownloadPath $Name + #Default retry logic for the package. + while($retries -gt 0) + { + try + { + Write-Host "Downloading package from: $Url to path $FilePath ." + (New-Object System.Net.WebClient).DownloadFile($Url, $FilePath) + break + } + catch + { + Write-Host "There is an error during package downloading" + $_ + $retries-- + + if ($retries -eq 0) + { + Write-Host "File can't be downloaded. Please try later or check that file exists by url: $Url" + $_ + exit 1 + } + Write-Host "Waiting 30 seconds before retrying. Retries left: $retries" + Start-Sleep -Seconds 30 + } + } + return $FilePath +} + + function Install-VsixExtension { Param @@ -177,34 +217,7 @@ function Install-VsixExtension if (!$InstallOnly) { - $FilePath = "${env:Temp}\$Name" - - while($retries -gt 0) - { - try - { - Write-Host "Downloading $Name..." - (New-Object System.Net.WebClient).DownloadFile($Url, $FilePath) - break - } - catch - { - Write-Host "There is an error during $Name downloading" - $_ - - $retries-- - - if ($retries -eq 0) - { - Write-Host "File can't be downloaded" - $_ - exit 1 - } - - Write-Host "Waiting 30 seconds before retrying. Retries left: $retries" - Start-Sleep -Seconds 30 - } - } + $FilePath = Start-DownloadWithRetry -Url $Url -Name $Name } $ArgumentList = ('/quiet', "`"$FilePath`"") @@ -311,4 +324,3 @@ function Test-IsWin16 { (Get-WinVersion) -match "2016" } - diff --git a/images/win/scripts/Installers/Install-SQLExpress.ps1 b/images/win/scripts/Installers/Install-SQLExpress.ps1 new file mode 100644 index 00000000..f1913088 --- /dev/null +++ b/images/win/scripts/Installers/Install-SQLExpress.ps1 @@ -0,0 +1,78 @@ +################################################################################ +## File: Install-SQLExpress.ps1 +## Desc: Install SQL Express for Windows +################################################################################ +Import-Module -Name ImageHelpers -Force; + +function Download-FullSQLPackage { + param( + [String]$InstallerPath, + [String]$DownloadPath, + [String]$Arguments = ("/MEDIAPATH=$DownloadPath", "/MEDIATYPE=Core","/Action=Download", "/QUIET") + ) + Write-Host "Downloading full package to $DownloadPath..." + $process = Start-Process -FilePath $InstallerPath -ArgumentList $Arguments -Wait -PassThru + $exitCode = $process.ExitCode + if ($exitCode -eq 0) + { + Write-Host -Object "Full SQL Express package has been successfully downloaded to $DownloadPath : ExitCode: $exitCode" + } + else + { + Write-Host -Object "Full package downloading process was unsuccessful. Exit code: $exitCode." + exit $exitCode + } +} + +function Unpack-SQLInstaller { + param( + [String]$InstallPath, + [String]$Arguments = ("/Q", "/IACCEPTSQLSERVERLICENSETERMS") + ) + Write-Host "Start unpacking procedure to $InstallPath..." + $process = Start-Process -FilePath $InstallPath -ArgumentList $Arguments -Wait -PassThru + $exitCode = $process.ExitCode +# Exit code -2067529716 is added since SQL Unpack procedure returns it on success. + if ($exitCode -eq 0 -or $exitCode -eq -2067529716) + { + Write-Host -Object "SQL installer unpacking has been completed." + } + else + { + Write-Host -Object "SQL installer unpacking was interrupted : $exitCode." + exit $exitCode + } +} + +function Start-Installer { + param( + [String]$InstallerPath, + [String]$Arguments = ("/Q", "/IACCEPTSQLSERVERLICENSETERMS", "/Action=Install", "/INSTANCEID=SQL2019", "/INSTANCENAME=SQL2019", "/SECURITYMODE=SQL", "/SAPWD=P@ssword!!", "/TCPENABLED=1") + ) + Write-Host "Installating SQL Express..." + $process = Start-Process -FilePath $InstallerPath -ArgumentList $Arguments -Wait -PassThru + $exitCode = $process.ExitCode + if ($exitCode -eq 0) + { + Write-Host -Object "SQL Express has been successfully installed: ExitCode: $exitCode" + } + else + { + Write-Host -Object "Installation procedure was not correctly completed. Exit code: $exitCode." + exit $exitCode + } +} +#Main function +$installerUrl = "https://go.microsoft.com/fwlink/?linkid=866658" +$downloadPath = "C:\SQLInstall" +$setupPath = Join-Path $downloadPath "SQLEXPR_x64_ENU" +#Create directory for temporary files +New-Item -Path $downloadPath -ItemType Directory +Set-Location -Path $downloadPath +$installerPath = Start-DownloadWithRetry -Url $installerUrl -DownloadPath $downloadPath -Name "SQL2019-SSEI-Expr.exe" +Download-FullSQLPackage -InstallerPath $installerPath -DownloadPath $downloadPath +Unpack-SQLInstaller -InstallPath "$setupPath.exe" +$resultPath = Join-Path $setupPath "SETUP.exe" +Start-Installer -InstallerPath $resultPath +#Cleanup folder with installation packages. +Remove-Item $downloadPath -Recurse -Force diff --git a/images/win/scripts/Installers/Validate-SQLExpress.ps1 b/images/win/scripts/Installers/Validate-SQLExpress.ps1 new file mode 100644 index 00000000..1b5a3578 --- /dev/null +++ b/images/win/scripts/Installers/Validate-SQLExpress.ps1 @@ -0,0 +1,52 @@ +################################################################################ +## File: Validate-SQLExpress.ps1 +## Desc: Validate Microsoft SQL Express installation +################################################################################ + +#Parameters for database access +$sqlUser = "sa" +$sqlPassword = "P@ssword!!" +$sqlInstance = "SQL2019" + +function Test-SqlConnection { + param( + [Parameter(Mandatory)] + [string]$ServerName, + [Parameter(Mandatory)] + [string]$IntegratedSecurity, + [Parameter(Mandatory)] + [string]$UserName, + [Parameter(Mandatory)] + [string]$Password + ) + $ErrorActionPreference = 'Stop' + try { + $connectionString = 'Server={0};Integrated Security={1};User ID={2};Password={3}' -f $ServerName,$IntegratedSecurity,$UserName,$Password + $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $connectionString + $sqlConnection.Open() + Write-Host -Object "Connection to SQL Express was successful." + return $sqlConnection.ServerVersion + + } catch { + Write-Host -Object "Connection to SQL Express cannot be established." + exit 1 + + } finally { + ## Close the connection when we're done + $sqlConnection.Close() + } +} +$instanceName = "$env:computername\$sqlInstance" +$version = Test-SqlConnection -ServerName $instanceName -IntegratedSecurity "false" -UserName $sqlUser -Password $sqlPassword + +# Adding description of the software to Markdown +$SoftwareName = "Git" +$Description = @" +_Version:_ $version
+_InstanceName:_ $sqlInstance
+_Username:_ $sqlUser
+_Password:_ $sqlPassword
+_Default Path:_ C:\Program Files (x86)\Microsoft SQL Server +"@ + +Add-SoftwareDetailsToMarkdown -SoftwareName $SoftwareName -DescriptionMarkdown $Description