application-workloads/octopus/octopusdeploy3-single-vm-windows/Install-OctopusDeploy.ps1 (239 lines of code) (raw):

param ( [string] $SqlDbConnectionString, [string] $LicenseFullName, [string] $LicenseOrganisationName, [string] $LicenseEmailAddress, [string] $OctopusAdminUsername, [string] $OctopusAdminPassword ) $config = @{} $octopusDeployVersion = "Octopus.3.0.12.2366-x64" $msiFileName = "Octopus.3.0.12.2366-x64.msi" $downloadBaseUrl = "https://download.octopusdeploy.com/octopus/" $downloadUrl = $downloadBaseUrl + $msiFileName $installBasePath = "D:\Install\" $msiPath = $installBasePath + $msiFileName $msiLogPath = $installBasePath + $msiFileName + '.log' $installerLogPath = $installBasePath + 'Install-OctopusDeploy.ps1.log' $octopusLicenseUrl = "https://octopusdeploy.com/api/licenses/trial" $OFS = "`r`n" function Write-Log { param ( [string] $message ) $timestamp = ([System.DateTime]::UTCNow).ToString("yyyy'-'MM'-'dd'T'HH':'mm':'ss") Write-Output "[$timestamp] $message" } function Write-CommandOutput { param ( [string] $output ) if ($output -eq "") { return } Write-Output "" $output.Trim().Split("`n") |% { Write-Output "`t| $($_.Trim())" } Write-Output "" } function Get-Config { Write-Log "======================================" Write-Log " Get Config" Write-Log "" Write-Log "Parsing script parameters ..." $config.Add("sqlDbConnectionString", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($SqlDbConnectionString))) $config.Add("licenseFullName", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($LicenseFullName))) $config.Add("licenseOrganisationName", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($LicenseOrganisationName))) $config.Add("licenseEmailAddress", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($LicenseEmailAddress))) $config.Add("octopusAdminUsername", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($OctopusAdminUsername))) $config.Add("octopusAdminPassword", [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($OctopusAdminPassword))) Write-Log "done." Write-Log "" } function Create-InstallLocation { Write-Log "======================================" Write-Log " Create Install Location" Write-Log "" if (!(Test-Path $installBasePath)) { Write-Log "Creating installation folder at '$installBasePath' ..." New-Item -ItemType Directory -Path $installBasePath | Out-Null Write-Log "done." } else { Write-Log "Installation folder at '$installBasePath' already exists." } Write-Log "" } function Install-OctopusDeploy { Write-Log "======================================" Write-Log " Install Octopus Deploy" Write-Log "" Write-Log "Downloading Octopus Deploy installer '$downloadUrl' to '$msiPath' ..." (New-Object Net.WebClient).DownloadFile($downloadUrl, $msiPath) Write-Log "done." Write-Log "Installing via '$msiPath' ..." $exe = 'msiexec.exe' $args = @( '/qn', '/i', $msiPath, '/l*v', $msiLogPath ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "" } function Configure-OctopusDeploy { Write-Log "======================================" Write-Log " Configure Octopus Deploy" Write-Log "" $exe = 'C:\Program Files\Octopus Deploy\Octopus\Octopus.Server.exe' $count = 0 while(!(Test-Path $exe) -and $count -lt 5) { Write-Log "$exe - not available yet ... waiting 10s ..." Start-Sleep -s 10 $count = $count + 1 } Write-Log "Creating Octopus Deploy instance ..." $args = @( 'create-instance', '--console', '--instance', 'OctopusServer', '--config', 'C:\Octopus\OctopusServer.config' ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "Configuring Octopus Deploy instance ..." $args = @( 'configure', '--console', '--instance', 'OctopusServer', '--home', 'C:\Octopus', '--storageConnectionString', $($config.sqlDbConnectionString), '--upgradeCheck', 'True', '--upgradeCheckWithStatistics', 'True', '--webAuthenticationMode', 'UsernamePassword', '--webForceSSL', 'False', '--webListenPrefixes', 'http://localhost:80/', '--commsListenPort', '10943' ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "Creating Octopus Deploy database ..." $args = @( 'database', '--console', '--instance', 'OctopusServer', '--create' ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "Stopping Octopus Deploy instance ..." $args = @( 'service', '--console', '--instance', 'OctopusServer', '--stop' ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "Creating Admin User for Octopus Deploy instance ..." $args = @( 'admin', '--console', '--instance', 'OctopusServer', '--username', $($config.octopusAdminUserName), '--password', $($config.octopusAdminPassword) ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "Obtaining a trial license for Full Name: $($config.licenseFullName), Organisation Name: $($config.licenseOrganisationName), Email Address: $($config.licenseEmailAddress) ..." $postParams = @{ FullName="$($config.licenseFullName)";Organization="$($config.licenseOrganisationName)";EmailAddress="$($config.licenseEmailAddress)" } $response = Invoke-WebRequest -UseBasicParsing -Uri "$octopusLicenseUrl" -Method POST -Body $postParams $utf8NoBOM = New-Object System.Text.UTF8Encoding($false) $bytes = $utf8NoBOM.GetBytes($response.Content) $licenseBase64 = [System.Convert]::ToBase64String($bytes) Write-Log "done." Write-Log "Installing license for Octopus Deploy instance ..." $args = @( 'license', '--console', '--instance', 'OctopusServer', '--licenseBase64', $licenseBase64 ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "Reconfigure and start Octopus Deploy instance ..." $args = @( 'service', '--console', '--instance', 'OctopusServer', '--install', '--reconfigure', '--start' ) $output = .$exe $args Write-CommandOutput $output Write-Log "done." Write-Log "" } function Configure-Firewall { Write-Log "======================================" Write-Log " Configure Firewall" Write-Log "" $firewallRuleName = "Allow_Port80_HTTP" if ((Get-NetFirewallRule -Name $firewallRuleName -ErrorAction Ignore) -eq $null) { Write-Log "Creating firewall rule to allow port 80 HTTP traffic ..." $firewallRule = @{ Name=$firewallRuleName DisplayName ="Allow Port 80 (HTTP)" Description="Port 80 for HTTP traffic" Direction='Inbound' Protocol='TCP' LocalPort=80 Enabled='True' Profile='Any' Action='Allow' } $output = (New-NetFirewallRule @firewallRule | Out-String) Write-CommandOutput $output Write-Log "done." } else { Write-Log "Firewall rule to allow port 80 HTTP traffic already exists." } Write-Log "" } try { Write-Log "======================================" Write-Log " Installing '$octopusDeployVersion'" Write-Log "======================================" Write-Log "" Get-Config Create-InstallLocation Install-OctopusDeploy Configure-OctopusDeploy Configure-Firewall Write-Log "Installation successful." Write-Log "" } catch { Write-Log $_ }