2021-09-12 04:43:19 +08:00
|
|
|
# Copyright (c) Microsoft Corporation.
|
|
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
#
|
|
|
|
|
|
|
|
<#
|
|
|
|
.SYNOPSIS
|
|
|
|
Creates a Windows virtual machine image, set up for vcpkg's CI.
|
|
|
|
|
|
|
|
.DESCRIPTION
|
|
|
|
create-image.ps1 creates an Azure Windows VM image, set up for vcpkg's CI system.
|
|
|
|
|
|
|
|
This script assumes you have installed Azure tools into PowerShell by following the instructions
|
|
|
|
at https://docs.microsoft.com/en-us/powershell/azure/install-az-ps?view=azps-3.6.1
|
|
|
|
or are running from Azure Cloud Shell.
|
|
|
|
#>
|
|
|
|
|
2024-02-13 07:07:57 +08:00
|
|
|
$Location = 'westus3'
|
2024-03-19 04:26:24 +08:00
|
|
|
$DatePrefixComponent = Get-Date -Format 'yyyy-MM-dd'
|
|
|
|
$Prefix = "Win-$DatePrefixComponent"
|
|
|
|
$GalleryImageVersion = $DatePrefixComponent.Replace('-','.')
|
2024-02-13 07:07:57 +08:00
|
|
|
$VMSize = 'Standard_D8ads_v5'
|
2021-09-12 04:43:19 +08:00
|
|
|
$ProtoVMName = 'PROTOTYPE'
|
2024-02-13 07:07:57 +08:00
|
|
|
$WindowsServerSku = '2022-datacenter-azure-edition'
|
2021-09-12 04:43:19 +08:00
|
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
|
|
|
|
$ProgressActivity = 'Creating Windows Image'
|
2024-03-19 04:26:24 +08:00
|
|
|
$TotalProgress = 17
|
2021-09-12 04:43:19 +08:00
|
|
|
$CurrentProgress = 1
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
# Assigning this to another variable helps when running the commands in this script manually for
|
|
|
|
# debugging
|
|
|
|
$Root = $PSScriptRoot
|
2021-09-12 04:43:19 +08:00
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
Import-Module "$Root/../create-vmss-helpers.psm1" -DisableNameChecking -Force
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
$AdminPW = New-Password
|
|
|
|
$AdminPWSecure = ConvertTo-SecureString $AdminPW -AsPlainText -Force
|
|
|
|
$Credential = New-Object System.Management.Automation.PSCredential ("AdminUser", $AdminPWSecure)
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
$VirtualNetwork = Get-AzVirtualNetwork -ResourceGroupName 'vcpkg-image-minting' -Name 'vcpkg-image-mintingNetwork'
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Creating prototype VM' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
$NicName = $Prefix + 'NIC'
|
2021-09-12 04:43:19 +08:00
|
|
|
$Nic = New-AzNetworkInterface `
|
|
|
|
-Name $NicName `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-Location $Location `
|
2024-03-19 04:26:24 +08:00
|
|
|
-Subnet $VirtualNetwork.Subnets[0] `
|
|
|
|
-EnableAcceleratedNetworking
|
2021-09-12 04:43:19 +08:00
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
$VM = New-AzVMConfig -Name $ProtoVMName -VMSize $VMSize -SecurityType TrustedLaunch -IdentityType SystemAssigned
|
2021-09-12 04:43:19 +08:00
|
|
|
$VM = Set-AzVMOperatingSystem `
|
|
|
|
-VM $VM `
|
|
|
|
-Windows `
|
|
|
|
-ComputerName $ProtoVMName `
|
|
|
|
-Credential $Credential `
|
|
|
|
-ProvisionVMAgent
|
|
|
|
|
|
|
|
$VM = Add-AzVMNetworkInterface -VM $VM -Id $Nic.Id
|
2024-02-13 07:07:57 +08:00
|
|
|
$VM = Set-AzVMOSDisk -VM $VM -StorageAccountType 'Premium_LRS' -CreateOption 'FromImage'
|
2021-09-12 04:43:19 +08:00
|
|
|
$VM = Set-AzVMSourceImage `
|
|
|
|
-VM $VM `
|
|
|
|
-PublisherName 'MicrosoftWindowsServer' `
|
|
|
|
-Offer 'WindowsServer' `
|
|
|
|
-Skus $WindowsServerSku `
|
|
|
|
-Version latest
|
|
|
|
|
|
|
|
$VM = Set-AzVMBootDiagnostic -VM $VM -Disable
|
|
|
|
New-AzVm `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-Location $Location `
|
|
|
|
-VM $VM
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
$VMCreated = Get-AzVM -ResourceGroupName 'vcpkg-image-minting' -Name $ProtoVMName
|
|
|
|
$VMCreatedOsDisk = $VMCreated.StorageProfile.OsDisk.Name
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Granting permissions to use vcpkg-image-minting storage account' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
|
|
|
$VcpkgImageMintingAccount = Get-AzStorageAccount -ResourceGroupName 'vcpkg-image-minting' -Name 'vcpkgimageminting'
|
|
|
|
|
|
|
|
# Grant 'Storage Blob Data Reader' (RoleDefinitionId 2a2b9908-6ea1-4ae2-8e65-a410df84e7d1) to the VM
|
|
|
|
New-AzRoleAssignment `
|
|
|
|
-Scope $VcpkgImageMintingAccount.ID `
|
|
|
|
-RoleDefinitionId '2a2b9908-6ea1-4ae2-8e65-a410df84e7d1' `
|
|
|
|
-ObjectId $VMCreated.Identity.PrincipalId
|
|
|
|
|
2021-09-12 04:43:19 +08:00
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Running provisioning script deploy-tlssettings.ps1 in VM' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
|
|
|
$ProvisionImageResult = Invoke-AzVMRunCommandWithRetries `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-VMName $ProtoVMName `
|
|
|
|
-CommandId 'RunPowerShellScript' `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ScriptPath "$Root\deploy-tlssettings.ps1"
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
Write-Host "deploy-tlssettings.ps1 output: $($ProvisionImageResult.value.Message)"
|
|
|
|
Write-Host 'Waiting 1 minute for VM to reboot...'
|
|
|
|
Start-Sleep -Seconds 60
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Running provisioning script deploy-psexec.ps1 in VM' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
|
|
|
$DeployPsExecResult = Invoke-AzVMRunCommandWithRetries `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-VMName $ProtoVMName `
|
|
|
|
-CommandId 'RunPowerShellScript' `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ScriptPath "$Root\deploy-psexec.ps1"
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
Write-Host "deploy-psexec.ps1 output: $($DeployPsExecResult.value.Message)"
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
function Invoke-ScriptWithPrefix {
|
|
|
|
param(
|
|
|
|
[string]$ScriptName,
|
2024-03-19 04:26:24 +08:00
|
|
|
[switch]$AddAdminPw
|
2021-09-12 04:43:19 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status "Running provisioning script $ScriptName in VM" `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
$DropToAdminUserPrefix = Get-Content "$Root\drop-to-admin-user-prefix.ps1" -Encoding utf8NoBOM -Raw
|
|
|
|
$UtilityPrefixContent = Get-Content "$Root\utility-prefix.ps1" -Encoding utf8NoBOM -Raw
|
2021-09-12 04:43:19 +08:00
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
$tempScriptFilename = "$env:TEMP\temp-script.txt"
|
2021-09-12 04:43:19 +08:00
|
|
|
try {
|
2024-03-19 04:26:24 +08:00
|
|
|
$script = Get-Content "$Root\$ScriptName" -Encoding utf8NoBOM -Raw
|
2021-09-12 04:43:19 +08:00
|
|
|
if ($AddAdminPw) {
|
|
|
|
$script = $script.Replace('# REPLACE WITH DROP-TO-ADMIN-USER-PREFIX.ps1', $DropToAdminUserPrefix)
|
|
|
|
}
|
|
|
|
|
|
|
|
$script = $script.Replace('# REPLACE WITH UTILITY-PREFIX.ps1', $UtilityPrefixContent);
|
|
|
|
Set-Content -Path $tempScriptFilename -Value $script -Encoding utf8NoBOM
|
|
|
|
|
|
|
|
$parameter = $null
|
|
|
|
if ($AddAdminPw) {
|
|
|
|
$parameter = @{AdminUserPassword = $AdminPW;}
|
|
|
|
}
|
|
|
|
|
|
|
|
$InvokeResult = Invoke-AzVMRunCommandWithRetries `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-VMName $ProtoVMName `
|
|
|
|
-CommandId 'RunPowerShellScript' `
|
|
|
|
-ScriptPath $tempScriptFilename `
|
|
|
|
-Parameter $parameter
|
|
|
|
|
|
|
|
Write-Host "$ScriptName output: $($InvokeResult.value.Message)"
|
|
|
|
} finally {
|
|
|
|
Remove-Item $tempScriptFilename -Force
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-azcopy.ps1'
|
|
|
|
|
|
|
|
####################################################################################################
|
2021-09-12 04:43:19 +08:00
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-windows-sdks.ps1' -AddAdminPw
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-visual-studio.ps1' -AddAdminPw
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-mpi.ps1' -AddAdminPw
|
|
|
|
|
|
|
|
####################################################################################################
|
2024-03-19 04:26:24 +08:00
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-cuda.ps1' -AddAdminPw
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-inteloneapi.ps1' -AddAdminPw
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Invoke-ScriptWithPrefix -ScriptName 'deploy-pwsh.ps1' -AddAdminPw
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Running provisioning script deploy-settings.txt (as a .ps1) in VM' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
|
|
|
$ProvisionImageResult = Invoke-AzVMRunCommandWithRetries `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-VMName $ProtoVMName `
|
|
|
|
-CommandId 'RunPowerShellScript' `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ScriptPath "$Root\deploy-settings.txt"
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
Write-Host "deploy-settings.txt output: $($ProvisionImageResult.value.Message)"
|
2024-03-19 04:26:24 +08:00
|
|
|
Restart-AzVM -ResourceGroupName 'vcpkg-image-minting' -Name $ProtoVMName
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Running provisioning script sysprep.ps1 in VM' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
|
|
|
$SysprepResult = Invoke-AzVMRunCommandWithRetries `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-VMName $ProtoVMName `
|
|
|
|
-CommandId 'RunPowerShellScript' `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ScriptPath "$Root\sysprep.ps1"
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
Write-Host "sysprep.ps1 output: $($SysprepResult.value.Message)"
|
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Waiting for VM to shut down' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
Wait-Shutdown -ResourceGroupName 'vcpkg-image-minting' -Name $ProtoVMName
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Converting VM to Image' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
|
|
|
Stop-AzVM `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-Name $ProtoVMName `
|
|
|
|
-Force
|
|
|
|
|
|
|
|
Set-AzVM `
|
2024-03-19 04:26:24 +08:00
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
2021-09-12 04:43:19 +08:00
|
|
|
-Name $ProtoVMName `
|
|
|
|
-Generalized
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
New-AzGalleryImageVersion `
|
|
|
|
-ResourceGroupName 'vcpkg-image-minting' `
|
|
|
|
-GalleryName 'vcpkg_gallery_wus3' `
|
|
|
|
-GalleryImageDefinitionName 'PrWinWus3-TrustedLaunch' `
|
|
|
|
-Name $GalleryImageVersion `
|
|
|
|
-Location $Location `
|
|
|
|
-SourceImageId $VMCreated.ID `
|
|
|
|
-ReplicaCount 1 `
|
|
|
|
-StorageAccountType 'Premium_LRS' `
|
|
|
|
-PublishingProfileExcludeFromLatest
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress `
|
|
|
|
-Activity $ProgressActivity `
|
|
|
|
-Status 'Deleting unused temporary resources' `
|
|
|
|
-PercentComplete (100 / $TotalProgress * $CurrentProgress++)
|
|
|
|
|
2024-03-19 04:26:24 +08:00
|
|
|
Remove-AzRoleAssignment `
|
|
|
|
-Scope $VcpkgImageMintingAccount.ID `
|
|
|
|
-RoleDefinitionId '2a2b9908-6ea1-4ae2-8e65-a410df84e7d1' `
|
|
|
|
-ObjectId $VMCreated.Identity.PrincipalId
|
|
|
|
|
|
|
|
Remove-AzVM -Id $VMCreated.ID -Force
|
|
|
|
Remove-AzDisk -ResourceGroupName 'vcpkg-image-minting' -Name $VMCreatedOsDisk -Force
|
|
|
|
Remove-AzNetworkInterface -ResourceGroupName 'vcpkg-image-minting' -Name $NicName -Force
|
2021-09-12 04:43:19 +08:00
|
|
|
|
|
|
|
####################################################################################################
|
|
|
|
Write-Progress -Activity $ProgressActivity -Completed
|
2024-03-19 04:26:24 +08:00
|
|
|
Write-Host "Generated Image: $GalleryImageVersion"
|
2021-09-12 04:43:19 +08:00
|
|
|
Write-Host 'Finished!'
|