Skip to content

Commit

Permalink
[build] create powershell file for creating Windows dev environment
Browse files Browse the repository at this point in the history
  • Loading branch information
titusfortner committed Dec 16, 2023
1 parent a2ff220 commit 3792243
Showing 1 changed file with 165 additions and 0 deletions.
165 changes: 165 additions & 0 deletions scripts/dev-environment-setup.ps1
@@ -0,0 +1,165 @@
# 1. Open PowerShell as an Administrator
# 2. Change directory to where you want Selenium repo to be cloned to
# 3. Execute: `Set-ExecutionPolicy Bypass -Scope Process -Force`
# 4. Run this script in the PowerShell terminal

Function Install-ChocoPackage {
param (
[string]$PackageName,
[string]$ExecutableName,
[string]$AdditionalParams = ""
)

Write-Host "Checking installation of $PackageName"
if (-Not (Get-Command $ExecutableName -ErrorAction SilentlyContinue)) {
Write-Host "Installing $PackageName..."
choco install $PackageName -y $AdditionalParams
refreshenv -Path ...
} else {
Write-Host "$PackageName is already installed."
}
}

Function Install-JDK17 {
$javacInstalled = Get-Command javac -ErrorAction SilentlyContinue
$javaVersion = if ($javacInstalled) { & javac -version 2>&1 | Select-String -Pattern '"(\d+)' | ForEach-Object { $_.Matches.Groups[1].Value } }

if (-Not $javacInstalled -or [int]$javaVersion -ne 17) {
Install-ChocoPackage -PackageName "openjdk17" -ExecutableName "javac"
} else {
Write-Host "JDK 17 is already installed."
}
}

Function Set-JavaEnvironmentVariable {
$javacPath = Get-ChildItem -Path 'C:\Program Files\' -Recurse -Filter 'javac.exe' | Select-Object -First 1 -ExpandProperty DirectoryName
$javaHome = Split-Path -Path $javacPath
Write-Host "Set JAVA_HOME environment variable to $javaHome"
[System.Environment]::SetEnvironmentVariable('JAVA_HOME', $javaHome, [System.EnvironmentVariableTarget]::Machine)
refreshenv -JAVA_HOME ...
}

Function Update-EnvironmentVariables {
Param ([string]$VariableName, [string]$Value)
$currentValue = [Environment]::GetEnvironmentVariable($VariableName, [EnvironmentVariableTarget]::User)
if (-not $currentValue -or $currentValue -ne $Value) {
Write-Host "Setting $VariableName to $Value"
[Environment]::SetEnvironmentVariable($VariableName, $Value, [System.EnvironmentVariableTarget]::User)
refreshenv -$VariableName ...
} else {
Write-Host "$VariableName is already set to $currentValue"
}
}

Function Clone-Repository {
param (
[string]$RepoUrl
)
$cloneChoice = Read-Host "Do you want to clone the repository at $RepoUrl (Y/N)"
if ($cloneChoice -eq 'Y' -or $cloneChoice -eq 'y') {
Write-Host "Cloning the repository from $RepoUrl into the current directory"
$cloneOptions = ""
$depthChoice = Read-Host -Prompt "Do you want [C]omplete or [S]hallow clone?"
if ($depthChoice -ne 'C' -and $depthChoice -ne 'c') {
$cloneOptions = "--depth=1"
}

$gitPath = "C:\Program Files\Git\bin\git.exe"
Write-Host "$gitPath clone $RepoUrl $cloneOptions"
& $gitPath clone $RepoUrl $cloneOptions
}
}

Function Install-IntelliJ {
Install-ChocoPackage -PackageName "intellijidea-community" -ExecutableName "idea64"

$ideaPath = Get-ChildItem -Path "C:\Program Files\JetBrains" -Filter idea64.exe -Recurse -ErrorAction SilentlyContinue -Force | Select-Object -First 1 -ExpandProperty FullName
& $ideaPath installPlugins "com.google.idea.bazel.ijwb"
& $ideaPath installPlugins "google-java-format"

Write-Host "Setting up Java Format IntelliJ plugin"

$ideaDirectory = Split-Path -Path $ideaPath -Parent
$intelliJInstallationFolder = Split-Path -Path $ideaDirectory -Parent
$fullVersion = (Split-Path -Path $intelliJInstallationFolder -Leaf) -replace "IntelliJ IDEA Community Edition ", ""
$intelliJVersionName = "IdeaIC" + (($fullVersion -split '\.')[0,1] -join '.')
$ideaDataPath = Join-Path -Path $env:APPDATA -ChildPath "JetBrains\$intelliJVersionName"

if (-not (Test-Path -Path $ideaDataPath)) {
New-Item -ItemType Directory -Path $ideaDataPath -Force | Out-Null
}

$vmOptionsFilePath = Join-Path -Path $ideaDataPath -ChildPath "idea64.exe.vmoptions"
if (-not (Test-Path -Path $vmOptionsFilePath)) {
New-Item -ItemType File -Path $vmOptionsFilePath | Out-Null
}
$linesToAdd = @(
"--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED",
"--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED"
)
Add-Content -Path $vmOptionsFilePath -Value $linesToAdd
}

Write-Host "Set Execution Policy for future processes; (Ignore Warning)"
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned

Write-Host "Enable Developer Mode"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"

Write-Host "Install Chocolatey if not already installed"
if (-Not (Get-Command choco -ErrorAction SilentlyContinue)) {
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
}

Install-JDK17
Set-JavaEnvironmentVariable
Install-ChocoPackage -PackageName "git" -ExecutableName "git"
Install-ChocoPackage -PackageName "bazelisk" -ExecutableName "bazel"
Install-ChocoPackage -PackageName "msys2" -ExecutableName "C:\tools\msys64\usr\bin\bash.exe" -AdditionalParams "--params '/InstallDir=C:\tools\msys64'"
Update-EnvironmentVariables -VariableName "PATH" -Value "C:\tools\msys64\usr\bin"
Update-EnvironmentVariables -VariableName "BAZEL_SH" -Value "C:\tools\msys64\usr\bin\bash.exe"
Install-ChocoPackage -PackageName "visualstudio2022community" -ExecutableName "devenv"

Start-Process "C:\Program Files (x86)\Microsoft Visual Studio\Installer\setup.exe"
Read-Host -Prompt "Install C++ in Visual Studio then Press Enter to continue"

$bazelVcPath = "C:\Program Files\Microsoft Visual Studio\2022\Community\VC"
Update-EnvironmentVariables -VariableName "BAZEL_VC" -Value $bazelVcPath

$vcToolsPath = Get-ChildItem -Path "$bazelVcPath\Tools\MSVC" | Sort-Object Name -Descending | Select-Object -First 1
$vcToolsVersion = $vcToolsPath.Name
Update-EnvironmentVariables -VariableName "BAZEL_VC_FULL_VERSION" -Value $vcToolsVersion

Clone-Repository -RepoUrl "https://github.com/SeleniumHQ/selenium.git"

$longPathSupport = Read-Host "Do you want to change settings to better manage long file paths (recommended) (Y/N)"
if ($longPathSupport -eq 'Y' -or $longPathSupport -eq 'y')
{
Write-Host "Enable UNC Path support"
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor" /t REG_DWORD /f /v "DisableUNCCheck" /d "1"

Write-Host "Enable Long Path support"
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem" /t REG_DWORD /f /v "LongPathsEnabled" /d "1"

Write-Host "Enable creating short name versions of long file paths"
fsutil 8dot3name set 0

Write-Host "Set bazel output to C:/tmp instead of nested inside project directory"
Set-Content -Path ".bazelrc.windows.local" -Value "startup --output_user_root=C:/tmp" -Encoding UTF8
}

$intelliJChoice = Read-Host "Do you want to install and setup IntelliJ (Y/N)"
if ($intelliJChoice -eq 'Y' -or $intelliJChoice -eq 'y')
{
Install-IntelliJ
}

$restartChoice = Read-Host "Do you want to restart the computer now? (Y/N)"
if ($restartChoice -eq 'Y' -or $restartChoice -eq 'y') {
Restart-Computer
}

0 comments on commit 3792243

Please sign in to comment.