Skip to content

Commit c559c79

Browse files
committed
build: backport tools/release.sh
PR-URL: #3965 Reviewed-By: Alexis Campailla <orangemocha@nodejs.org> Reviewed-By: Johan Bergström <bugs@bergstroem.nu>
1 parent 268d2b4 commit c559c79

File tree

1 file changed

+196
-0
lines changed

1 file changed

+196
-0
lines changed

tools/release.sh

+196
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,196 @@
1+
#!/usr/bin/env bash
2+
3+
# To promote and sign a release that has been prepared by the build slaves, use:
4+
# release.sh
5+
6+
# To _only_ sign an existing release, use:
7+
# release.sh -s vx.y.z
8+
9+
set -e
10+
11+
webhost=direct.nodejs.org
12+
webuser=dist
13+
promotablecmd=dist-promotable
14+
promotecmd=dist-promote
15+
signcmd=dist-sign
16+
17+
18+
################################################################################
19+
## Select a GPG key to use
20+
21+
echo "# Selecting GPG key ..."
22+
23+
gpgkey=$(gpg --list-secret-keys | grep '^sec' | awk -F'( +|/)' '{print $3}')
24+
keycount=$(echo $gpgkey | wc -w)
25+
26+
if [ $keycount -eq 0 ]; then
27+
echo 'Need at least one GPG key, please make one with `gpg --gen-key`'
28+
echo 'You will also need to submit your key to a public keyserver, e.g.'
29+
echo ' https://sks-keyservers.net/i/#submit'
30+
exit 1
31+
elif [ $keycount -ne 1 ]; then
32+
echo -e 'You have multiple GPG keys:\n'
33+
34+
gpg --list-secret-keys
35+
36+
while true; do
37+
echo $gpgkey | awk '{ for(i = 1; i <= NF; i++) { print i ") " $i; } }'
38+
echo -n 'Select a key: '
39+
read keynum
40+
41+
if $(test "$keynum" -eq "$keynum" > /dev/null 2>&1); then
42+
_gpgkey=$(echo $gpgkey | awk '{ print $'${keynum}'}')
43+
keycount=$(echo $_gpgkey | wc -w)
44+
if [ $keycount -eq 1 ]; then
45+
echo ""
46+
gpgkey=$_gpgkey
47+
break
48+
fi
49+
fi
50+
done
51+
fi
52+
53+
gpgfing=$(gpg --fingerprint $gpgkey | grep 'Key fingerprint =' | awk -F' = ' '{print $2}' | tr -d ' ')
54+
55+
if ! test "$(grep $gpgfing README.md)"; then
56+
echo 'Error: this GPG key fingerprint is not listed in ./README.md'
57+
exit 1
58+
fi
59+
60+
echo "Using GPG key: $gpgkey"
61+
echo " Fingerprint: $gpgfing"
62+
63+
64+
################################################################################
65+
## Create and sign checksums file for a given version
66+
67+
function sign {
68+
echo -e "\n# Creating SHASUMS256.txt ..."
69+
70+
local version=$1
71+
72+
gpgtagkey=$(git tag -v $version 2>&1 | grep 'key ID' | awk '{print $NF}')
73+
74+
if [ "X${gpgtagkey}" == "X" ]; then
75+
echo "Could not find signed tag for \"${version}\""
76+
exit 1
77+
fi
78+
79+
if [ "${gpgtagkey}" != "${gpgkey}" ]; then
80+
echo "GPG key for \"${version}\" tag is not yours, cannot sign"
81+
fi
82+
83+
shapath=$(ssh ${webuser}@${webhost} $signcmd nodejs $version)
84+
85+
if ! [[ ${shapath} =~ ^/.+/SHASUMS256.txt$ ]]; then
86+
echo 'Error: No SHASUMS file returned by sign!'
87+
exit 1
88+
fi
89+
90+
echo -e "\n# Signing SHASUMS for ${version}..."
91+
92+
shadir=$(dirname $shapath)
93+
tmpdir="/tmp/_node_release.$$"
94+
95+
mkdir -p $tmpdir
96+
97+
scp ${webuser}@${webhost}:${shadir}/SHASUMS*.txt ${tmpdir}/
98+
99+
for i in $(ls ${tmpdir}/SHASUMS*.txt); do
100+
echo "Signing $i..."
101+
gpg --default-key $gpgkey --clearsign ${i}
102+
if [[ $version =~ ^v[0] ]]; then
103+
echo "Encrpting $i..."
104+
gpg --default-key $gpgkey -s ${i}
105+
fi
106+
done
107+
108+
echo "Wrote to ${tmpdir}/"
109+
110+
echo -e "Your signed SHASUMS256.txt.asc:\n"
111+
112+
cat ${tmpdir}/SHASUMS256.txt.asc
113+
114+
echo ""
115+
116+
while true; do
117+
echo -n "Upload files? [y/n] "
118+
yorn=""
119+
read yorn
120+
121+
if [ "X${yorn}" == "Xn" ]; then
122+
break
123+
fi
124+
125+
if [ "X${yorn}" == "Xy" ]; then
126+
if [[ $version =~ ^v[0] ]]; then
127+
scp ${tmpdir}/SHASUMS* ${webuser}@${webhost}:${shadir}/
128+
else
129+
scp ${tmpdir}/SHASUMS256.txt ${tmpdir}/SHASUMS256.txt.asc ${webuser}@${webhost}:${shadir}/
130+
fi
131+
break
132+
fi
133+
done
134+
135+
rm -rf $tmpdir
136+
}
137+
138+
139+
if [ "X${1}" == "X-s" ]; then
140+
if [ "X${2}" == "X" ]; then
141+
echo "Please supply a version string to sign"
142+
exit 1
143+
fi
144+
145+
sign $2
146+
exit 0
147+
fi
148+
149+
150+
# else: do a normal release & promote
151+
152+
################################################################################
153+
## Look for releases to promote
154+
155+
echo -e "\n# Checking for releases ..."
156+
157+
promotable=$(ssh ${webuser}@${webhost} $promotablecmd nodejs)
158+
159+
if [ "X${promotable}" == "X" ]; then
160+
echo "No releases to promote!"
161+
exit 0
162+
fi
163+
164+
echo -e "Found the following releases / builds ready to promote:\n"
165+
echo "$promotable" | sed 's/^/ * /'
166+
echo ""
167+
168+
versions=$(echo "$promotable" | cut -d: -f1)
169+
170+
################################################################################
171+
## Promote releases
172+
173+
for version in $versions; do
174+
while true; do
175+
files=$(echo "$promotable" | grep "^${version}" | sed 's/^'${version}': //')
176+
echo -n "Promote ${version} files (${files})? [y/n] "
177+
yorn=""
178+
read yorn
179+
180+
if [ "X${yorn}" == "Xn" ]; then
181+
break
182+
fi
183+
184+
if [ "X${yorn}" != "Xy" ]; then
185+
continue
186+
fi
187+
188+
echo -e "\n# Promoting ${version}..."
189+
190+
ssh ${webuser}@${webhost} $promotecmd nodejs $version
191+
192+
sign $version
193+
194+
break
195+
done
196+
done

0 commit comments

Comments
 (0)