summaryrefslogtreecommitdiff
path: root/tools/release.sh
diff options
context:
space:
mode:
authorRod Vagg <rod@vagg.org>2015-01-31 21:55:37 +1100
committerRod Vagg <rod@vagg.org>2015-02-04 09:02:15 +1100
commitdf48fafa92c4ff0caee54c2f7fa214073cbd787e (patch)
treec96c5f5ed4e95a523c0462e268a8d942c73da265 /tools/release.sh
parent14684d3d67ad7c04bec7b63377343dab3e389470 (diff)
downloadnode-new-df48fafa92c4ff0caee54c2f7fa214073cbd787e.tar.gz
tools: add release tool and docs, remove old tools
Also added binary download documentation to the README.md and GPG release key fingerprint for @rvagg. PR-URL: https://github.com/iojs/io.js/pull/681 Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl> Reviewed-By: Fedor Indutny <fedor@indutny.com>
Diffstat (limited to 'tools/release.sh')
-rwxr-xr-xtools/release.sh187
1 files changed, 187 insertions, 0 deletions
diff --git a/tools/release.sh b/tools/release.sh
new file mode 100755
index 0000000000..fca88c97ad
--- /dev/null
+++ b/tools/release.sh
@@ -0,0 +1,187 @@
+#!/usr/bin/env bash
+
+# To promote and sign a release that has been prepared by the build slaves, use:
+# release.sh
+
+# To _only_ sign an existing release, use:
+# release.sh -s vx.y.z
+
+set -e
+
+webhost=iojs.org
+webuser=dist
+promotablecmd=dist-promotable
+promotecmd=dist-promote
+signcmd=dist-sign
+
+
+################################################################################
+## Select a GPG key to use
+
+echo "# Selecting GPG key ..."
+
+gpgkey=$(gpg --list-secret-keys | grep '^sec' | awk -F'( +|/)' '{print $3}')
+keycount=$(echo $gpgkey | wc -w)
+
+if [ $keycount -eq 0 ]; then
+ echo 'Need at least one GPG key, please make one with `gpg --gen-key`'
+ echo 'You will also need to submit your key to a public keyserver, e.g.'
+ echo ' https://sks-keyservers.net/i/#submit'
+ exit 1
+elif [ $keycount -ne 1 ]; then
+ echo -e 'You have multiple GPG keys:\n'
+
+ gpg --list-secret-keys
+
+ while true; do
+ echo $gpgkey | awk '{ for(i = 1; i <= NF; i++) { print i ") " $i; } }'
+ echo -n 'Select a key: '
+ read keynum
+
+ if $(test "$keynum" -eq "$keynum" > /dev/null 2>&1); then
+ _gpgkey=$(echo $gpgkey | awk '{ print $'${keynum}'}')
+ keycount=$(echo $_gpgkey | wc -w)
+ if [ $keycount -eq 1 ]; then
+ echo ""
+ gpgkey=$_gpgkey
+ break
+ fi
+ fi
+ done
+fi
+
+gpgfing=$(gpg --fingerprint $gpgkey | grep 'Key fingerprint =' | awk -F' = ' '{print $2}' | tr -d ' ')
+
+if ! test "$(grep $gpgfing README.md)"; then
+ echo 'Error: this GPG key fingerprint is not listed in ./README.md'
+ exit 1
+fi
+
+echo "Using GPG key: $gpgkey"
+echo " Fingerprint: $gpgfing"
+
+
+################################################################################
+## Create and sign checksums file for a given version
+
+function sign {
+ echo -e "\n# Creating SHASUMS256.txt ..."
+
+ local version=$1
+
+ gpgtagkey=$(git tag -v $version 2>&1 | grep 'key ID' | awk '{print $NF}')
+
+ if [ "X${gpgtagkey}" == "X" ]; then
+ echo "Could not find signed tag for \"${version}\""
+ exit 1
+ fi
+
+ if [ "${gpgtagkey}" != "${gpgkey}" ]; then
+ echo "GPG key for \"${version}\" tag is not yours, cannot sign"
+ fi
+
+ shapath=$(ssh ${webuser}@${webhost} $signcmd $version)
+
+ if ! [[ ${shapath} =~ ^/.+/SHASUMS256.txt$ ]]; then
+ echo 'Error: No SHASUMS file returned by sign!'
+ exit 1
+ fi
+
+ echo -e "\n# Signing SHASUMS for ${version}..."
+
+ shafile=$(basename $shapath)
+ shadir=$(dirname $shapath)
+ tmpdir="/tmp/_iojs_release.$$"
+
+ mkdir -p $tmpdir
+
+ scp ${webuser}@${webhost}:${shapath} ${tmpdir}/${shafile}
+
+ gpg --default-key $gpgkey --clearsign ${tmpdir}/${shafile}
+ gpg --default-key $gpgkey --armor --export --output ${tmpdir}/${shafile}.gpg
+
+ echo "Wrote to ${tmpdir}/"
+
+ echo -e "Your signed ${shafile}.asc:\n"
+
+ cat ${tmpdir}/${shafile}.asc
+
+ echo ""
+
+ while true; do
+ echo -n "Upload files? [y/n] "
+ yorn=""
+ read yorn
+
+ if [ "X${yorn}" == "Xn" ]; then
+ break
+ fi
+
+ if [ "X${yorn}" == "Xy" ]; then
+ scp ${tmpdir}/${shafile} ${tmpdir}/${shafile}.asc ${tmpdir}/${shafile}.gpg ${webuser}@${webhost}:${shadir}/
+ break
+ fi
+ done
+
+ rm -rf $tmpdir
+}
+
+
+if [ "X${1}" == "X-s" ]; then
+ if [ "X${2}" == "X" ]; then
+ echo "Please supply a version string to sign"
+ exit 1
+ fi
+
+ sign $2
+ exit 0
+fi
+
+
+# else: do a normal release & promote
+
+################################################################################
+## Look for releases to promote
+
+echo -e "\n# Checking for releases ..."
+
+promotable=$(ssh ${webuser}@${webhost} $promotablecmd)
+
+if [ "X${promotable}" == "X" ]; then
+ echo "No releases to promote!"
+ exit 0
+fi
+
+echo -e "Found the following releases / builds ready to promote:\n"
+echo "$promotable" | sed 's/^/ * /'
+echo ""
+
+versions=$(echo "$promotable" | cut -d: -f1)
+
+################################################################################
+## Promote releases
+
+for version in $versions; do
+ while true; do
+ files=$(echo "$promotable" | grep "^${version}" | sed 's/^'${version}': //')
+ echo -n "Promote ${version} files (${files})? [y/n] "
+ yorn=""
+ read yorn
+
+ if [ "X${yorn}" == "Xn" ]; then
+ break
+ fi
+
+ if [ "X${yorn}" != "Xy" ]; then
+ continue
+ fi
+
+ echo -e "\n# Promoting ${version}..."
+
+ ssh ${webuser}@${webhost} $promotecmd $version
+
+ sign $version
+
+ break
+ done
+done