[Python-checkins] Adds new upload script for Windows releases (GH-7268)

Steve Dower webhook-mailer at python.org
Thu May 31 01:13:48 EDT 2018


https://github.com/python/cpython/commit/e1c54f4330bc8eb61dbcbd4f9b14d4e222f2be29
commit: e1c54f4330bc8eb61dbcbd4f9b14d4e222f2be29
branch: master
author: Steve Dower <steve.dower at microsoft.com>
committer: GitHub <noreply at github.com>
date: 2018-05-30T22:13:43-07:00
summary:

Adds new upload script for Windows releases (GH-7268)

files:
A Tools/msi/uploadrelease.ps1

diff --git a/Tools/msi/uploadrelease.ps1 b/Tools/msi/uploadrelease.ps1
new file mode 100644
index 000000000000..1fe9bca0cc5b
--- /dev/null
+++ b/Tools/msi/uploadrelease.ps1
@@ -0,0 +1,121 @@
+<#
+.Synopsis
+    Uploads from a VSTS release build layout to python.org
+.Description
+    Given the downloaded/extracted build artifact from a release
+    build run on python.visualstudio.com, this script uploads
+    the files to the correct locations.
+.Parameter build
+    The location on disk of the extracted build artifact.
+.Parameter user
+    The username to use when logging into the host.
+.Parameter server
+    The host or PuTTY session name.
+.Parameter target
+    The subdirectory on the host to copy files to.
+.Parameter tests
+    The path to run download tests in.
+.Parameter skipupload
+    Skip uploading
+.Parameter skippurge
+    Skip purging the CDN
+.Parameter skiptest
+    Skip the download tests
+.Parameter skiphash
+    Skip displaying hashes
+#>
+param(
+    [Parameter(Mandatory=$true)][string]$build,
+    [Parameter(Mandatory=$true)][string]$user,
+    [string]$server="python-downloads",
+    [string]$target="/srv/www.python.org/ftp/python",
+    [string]$tests=${env:TEMP},
+    [switch]$skipupload,
+    [switch]$skippurge,
+    [switch]$skiptest,
+    [switch]$skiphash
+)
+
+if (-not $build) { throw "-build option is required" }
+if (-not $user) { throw "-user option is required" }
+
+function find-putty-tool {
+    param ([string]$n)
+    $t = gcm $n -EA 0
+    if (-not $t) { $t = gcm ".\$n" -EA 0 }
+    if (-not $t) { $t = gcm "${env:ProgramFiles}\PuTTY\$n" -EA 0 }
+    if (-not $t) { $t = gcm "${env:ProgramFiles(x86)}\PuTTY\$n" -EA 0 }
+    if (-not $t) { throw "Unable to locate $n.exe. Please put it on $PATH" }
+    return gi $t.Path
+}
+
+$p = gci -r "$build\python-*.exe" | `
+    ?{ $_.Name -match '^python-(\d+\.\d+\.\d+)((a|b|rc)\d+)?-.+' } | `
+    select -first 1 | `
+    %{ $Matches[1], $Matches[2] }
+
+"Uploading version $($p[0]) $($p[1])"
+"  from: $build"
+"    to: $($server):$target/$($p[0])"
+" using: $plink and $pscp"
+""
+
+if (-not $skipupload) {
+    # Upload files to the server
+    $pscp = find-putty-tool "pscp"
+    $plink = find-putty-tool "plink"
+
+    pushd $build
+    $doc = gci python*.chm, python*.chm.asc
+    popd
+
+    $d = "$target/$($p[0])/"
+    & $plink -batch $user@$server mkdir $d "&&" chgrp downloads $d "&&" chmod g-x,o+rx $d
+    & $pscp -batch $doc.FullName "$user@${server}:$d"
+
+    foreach ($a in gci "$build" -Directory) {
+        "Uploading files from $($a.FullName)"
+        pushd "$($a.FullName)"
+        $exe = gci *.exe, *.exe.asc, *.zip, *.zip.asc
+        $msi = gci *.msi, *.msi.asc, *.msu, *.msu.asc
+        popd
+
+        & $pscp -batch $exe.FullName "$user@${server}:$d"
+
+        $sd = "$d$($a.Name)$($p[1])/"
+        & $plink -batch $user@$server mkdir $sd "&&" chgrp downloads $sd "&&" chmod g-x,o+rx $sd
+        & $pscp -batch $msi.FullName "$user@${server}:$sd"
+        & $plink -batch $user@$server chgrp downloads $sd* "&&" chmod g-x,o+rx $sd*
+    }
+
+    & $plink -batch $user@$server chgrp downloads $d* "&&" chmod g-x,o+rx $d*
+}
+
+if (-not $skippurge) {
+    # Run a CDN purge
+    py purge.py "$($p[0])$($p[1])"
+}
+
+if (-not $skiptest) {
+    # Use each web installer to produce a layout. This will download
+    # each referenced file and validate their signatures/hashes.
+    gci "$build\*-webinstall.exe" -r -File | %{
+        $d = mkdir "$tests\$($_.BaseName)" -Force
+        gci $d -r -File | del
+        $ic = copy $_ $d -PassThru
+        "Checking layout for $($ic.Name)"
+        Start-Process -wait $ic "/passive", "/layout", "$d\layout", "/log", "$d\log\install.log"
+        if (-not $?) {
+            Write-Error "Failed to validate layout of $($inst.Name)"
+        }
+    }
+}
+
+if (-not $skiphash) {
+    # Display MD5 hash and size of each downloadable file
+    pushd $build
+    gci python*.chm, *\*.exe, *\*.zip | `
+        Sort-Object Name | `
+        Format-Table Name, @{Label="MD5"; Expression={(Get-FileHash $_ -Algorithm MD5).Hash}}, Length
+    popd
+}



More information about the Python-checkins mailing list