summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@microsoft.com>2018-05-31 05:13:43 (GMT)
committerGitHub <noreply@github.com>2018-05-31 05:13:43 (GMT)
commite1c54f4330bc8eb61dbcbd4f9b14d4e222f2be29 (patch)
treee8abb0b468c52e509a2164ed891c19734804164e /Tools
parent0a36ac1a09587735237c5978ebd046313922869c (diff)
downloadcpython-e1c54f4330bc8eb61dbcbd4f9b14d4e222f2be29.zip
cpython-e1c54f4330bc8eb61dbcbd4f9b14d4e222f2be29.tar.gz
cpython-e1c54f4330bc8eb61dbcbd4f9b14d4e222f2be29.tar.bz2
Adds new upload script for Windows releases (GH-7268)
Diffstat (limited to 'Tools')
-rw-r--r--Tools/msi/uploadrelease.ps1121
1 files changed, 121 insertions, 0 deletions
diff --git a/Tools/msi/uploadrelease.ps1 b/Tools/msi/uploadrelease.ps1
new file mode 100644
index 0000000..1fe9bca
--- /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
+}