소스 검색

Add update-docker-compose.ps1 to contrib/update/

Updates Windows' installed version of docker-compose to the latest
release.

Fixes #5790

Signed-off-by: Dakota Hawkins <[email protected]>
Dakota Hawkins 7 년 전
부모
커밋
5184f4f78d
1개의 변경된 파일116개의 추가작업 그리고 0개의 파일을 삭제
  1. 116 0
      contrib/update/update-docker-compose.ps1

+ 116 - 0
contrib/update/update-docker-compose.ps1

@@ -0,0 +1,116 @@
+# Self-elevate the script if required
+# http://www.expta.com/2017/03/how-to-self-elevate-powershell-script.html
+If (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
+    If ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
+        $CommandLine = "-File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
+        Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
+        Exit
+    }
+}
+
+$SectionSeparator = "--------------------------------------------------"
+
+# Update docker-compose if required
+Function UpdateDockerCompose() {
+    Write-Host "Updating docker-compose if required..."
+    Write-Host $SectionSeparator
+
+    # Find the installed docker-compose.exe location
+    Try {
+        $DockerComposePath = Get-Command docker-compose.exe -ErrorAction Stop | `
+            Select-Object -First 1 -ExpandProperty Definition
+    }
+    Catch {
+        Write-Host "Error: Could not find path to docker-compose.exe" `
+            -ForegroundColor Red
+        Return $false
+    }
+
+    # Prefer/enable TLS 1.2
+    # https://stackoverflow.com/a/48030563/153079
+    [Net.ServicePointManager]::SecurityProtocol = "tls12, tls11, tls"
+
+    # Query for the latest release version
+    Try {
+        $URI = "https://api.github.com/repos/docker/compose/releases/latest"
+        $LatestComposeVersion = [System.Version](Invoke-RestMethod -Method Get -Uri $URI).tag_name
+    }
+    Catch {
+        Write-Host "Error: Query for the latest docker-compose release version failed" `
+            -ForegroundColor Red
+        Return $false
+    }
+
+    # Check the installed version and compare with latest release
+    $UpdateDockerCompose = $false
+    Try {
+        $InstalledComposeVersion = `
+            [System.Version]((docker-compose.exe version --short) | Out-String)
+
+        If ($InstalledComposeVersion -eq $LatestComposeVersion) {
+            Write-Host ("Installed docker-compose version ({0}) same as latest ({1})." `
+                -f $InstalledComposeVersion.ToString(), $LatestComposeVersion.ToString())
+        }
+        ElseIf ($InstalledComposeVersion -lt $LatestComposeVersion) {
+            Write-Host ("Installed docker-compose version ({0}) older than latest ({1})." `
+                -f $InstalledComposeVersion.ToString(), $LatestComposeVersion.ToString())
+            $UpdateDockerCompose = $true
+        }
+        Else {
+            Write-Host ("Installed docker-compose version ({0}) newer than latest ({1})." `
+                -f $InstalledComposeVersion.ToString(), $LatestComposeVersion.ToString()) `
+                -ForegroundColor Yellow
+        }
+    }
+    Catch {
+        Write-Host `
+            "Warning: Couldn't get docker-compose version, assuming an update is required..." `
+            -ForegroundColor Yellow
+        $UpdateDockerCompose = $true
+    }
+
+    If (-Not $UpdateDockerCompose) {
+        # Nothing to do!
+        Return $false
+    }
+
+    # Download the latest version of docker-compose.exe
+    Try {
+        $RemoteFileName = "docker-compose-Windows-x86_64.exe"
+        $URI = ("https://github.com/docker/compose/releases/download/{0}/{1}" `
+            -f $LatestComposeVersion.ToString(), $RemoteFileName)
+        Invoke-WebRequest -UseBasicParsing -Uri $URI `
+            -OutFile $DockerComposePath
+        Return $true
+    }
+    Catch {
+        Write-Host ("Error: Failed to download the latest version of docker-compose`n{0}" `
+            -f $_.Exception.Message) -ForegroundColor Red
+        Return $false
+    }
+
+    Return $false
+}
+
+If (UpdateDockerCompose) {
+    Write-Host "Updated to latest-version of docker-compose, running update again to verify.`n"
+    If (UpdateDockerCompose) {
+        Write-Host "Error: Should not have updated twice." -ForegroundColor Red
+    }
+}
+
+# Assuming elevation popped up a new powershell window, pause so the user can see what happened
+# https://stackoverflow.com/a/22362868/153079
+Function Pause ($Message = "Press any key to continue . . . ") {
+    If ((Test-Path variable:psISE) -and $psISE) {
+        $Shell = New-Object -ComObject "WScript.Shell"
+        $Shell.Popup("Click OK to continue.", 0, "Script Paused", 0)
+    }
+    Else {
+        Write-Host "`n$SectionSeparator"
+        Write-Host -NoNewline $Message
+        [void][System.Console]::ReadKey($true)
+        Write-Host
+    }
+}
+Pause