| # Stop on action error. |
| $ErrorActionPreference = "Stop" |
| |
| if (-Not (Test-Path c:\bazel_ci)) { |
| New-Item c:\bazel_ci -type directory |
| } |
| Set-Location c:\bazel_ci |
| |
| # TODO(philwo) remove if it turns out we don't need Chocolatey. |
| # Upgrade Chocolatey. |
| # Write-Host "Updating Chocolatey..." |
| # & "C:\ProgramData\chocolatey\choco.exe" upgrade chocolatey |
| # & "C:\ProgramData\chocolatey\choco.exe" upgrade all |
| |
| # Update MSYS2 once. |
| Write-Host "Updating MSYS2 packages (round 1)..." |
| Start-Process -Wait "c:\msys64\msys2_shell.cmd" -ArgumentList "-c", "pacman --noconfirm -Syuu" |
| |
| # Update again, in case the first round only upgraded core packages. |
| Write-Host "Updating MSYS2 packages (round 2)..." |
| Start-Process -Wait "c:\msys64\msys2_shell.cmd" -ArgumentList "-c", "pacman --noconfirm -Syuu" |
| |
| # Install a couple of Python modules required by TensorFlow. |
| Write-Host "Updating Python packages..." |
| & "C:\Python3\Scripts\pip.exe" install --upgrade ` |
| autograd ` |
| numpy ` |
| portpicker ` |
| protobuf ` |
| pyreadline ` |
| six ` |
| wheel |
| |
| # Fetch the instance ID from GCE. |
| Write-Host "Fetching instance ID from GCE..." |
| $webclient = (New-Object Net.WebClient) |
| $webclient.Headers.Add("Metadata-Flavor", "Google") |
| $jenkins_node = $webclient.DownloadString("http://metadata/computeMetadata/v1/instance/attributes/jenkins_node") |
| |
| # Get the latest release version number of Bazel. |
| Write-Host "Grabbing latest Bazel version number from GitHub..." |
| $url = "https://github.com/bazelbuild/bazel/releases/latest" |
| $req = [system.Net.HttpWebRequest]::Create($url); |
| $res = $req.getresponse(); |
| $res.Close(); |
| $bazel_version = $res.ResponseUri.AbsolutePath.TrimStart("/bazelbuild/bazel/releases/tag/") |
| |
| # Download the latest bazel. |
| $folder = "c:\bazel_ci\installs\${bazel_version}" |
| if (-Not (Test-Path "${folder}\bazel.exe")) { |
| Write-Host "Downloading Bazel ${bazel_version}..." |
| $url = "https://releases.bazel.build/${bazel_version}/release/bazel-${bazel_version}-without-jdk-windows-x86_64.exe" |
| New-Item $folder -type directory -force |
| (New-Object Net.WebClient).DownloadFile("${url}", "${folder}\bazel.exe") |
| } else { |
| Write-Host "Bazel ${bazel_version} was already downloaded, skipping..." |
| } |
| |
| # Create a junction to the latest release. |
| Write-Host "Creating helper junctions..." |
| $latest_folder = "C:\bazel_ci\installs\latest" |
| if (Test-Path $latest_folder) { |
| Remove-Item -Force -Recurse $latest_folder |
| } |
| New-Item -ItemType Junction $latest_folder -Value $folder |
| |
| $bootstrap_folder = "C:\bazel_ci\installs\bootstrap" |
| if (Test-Path $bootstrap_folder) { |
| Remove-Item -Force -Recurse $bootstrap_folder |
| } |
| New-Item -ItemType Junction $bootstrap_folder -Value $folder |
| |
| # Find the JDK. The path changes frequently, so hardcoding it is not enough. |
| $java = Get-ChildItem "c:\Program Files\Java\jdk*" | Select-Object -Index 0 | foreach { $_.FullName } |
| Write-Host "Found latest JDK at ${java}..." |
| |
| # Save the Jenkins slave.jar to a suitable location. |
| Write-Host "Downloading https://ci.bazel.build/jnlpJars/slave.jar..." |
| Invoke-WebRequest https://ci.bazel.build/jnlpJars/slave.jar -OutFile slave.jar |
| |
| # Create the service that runs the Jenkins slave |
| # We can't execute Java directly because then it mysteriously fails with |
| # "Sockets error: 10106: create", so we redirect through Powershell |
| # The path change is needed because Jenkins cannot execute a different git |
| # binary on different nodes, so we need to simply use "git" |
| Write-Host "Creating Jenkins slave startup script..." |
| $jnlpUrl = "https://ci.bazel.build/computer/${jenkins_node}/slave-agent.jnlp" |
| $agent_script = @" |
| `$env:path="c:\tools\msys64\usr\bin;`$env:path" |
| cd c:\bazel_ci |
| # A path name with c:\ in the JNLP URL makes Java hang. I don't know why. |
| # Jenkins tries to reconnect to the wrong port if the server is restarted. |
| # -noReconnect makes the agent die, and it is then subsequently restarted by |
| # Windows because it is a service, and then all is well. |
| & "${java}\bin\java" -jar c:\bazel_ci\slave.jar -jnlpUrl ${jnlpUrl} -noReconnect |
| "@ |
| Write-Output $agent_script | Out-File -Encoding ascii agent_script.ps1 |
| |
| Write-Host "Creating Jenkins slave service..." |
| & nssm install bazel_ci powershell c:\bazel_ci\agent_script.ps1 |
| & nssm set bazel_ci AppStdout c:\bazel_ci\stdout.log |
| & nssm set bazel_ci AppStderr c:\bazel_ci\stderr.log |
| & nssm start bazel_ci |