src: enable v8 deprecation warnings and fix them
[platform/upstream/nodejs.git] / tools / release.sh
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   shafile=$(basename $shapath)
93   shadir=$(dirname $shapath)
94   tmpdir="/tmp/_node_release.$$"
95
96   mkdir -p $tmpdir
97
98   scp ${webuser}@${webhost}:${shapath} ${tmpdir}/${shafile}
99
100   gpg --default-key $gpgkey --clearsign ${tmpdir}/${shafile}
101
102   echo "Wrote to ${tmpdir}/"
103
104   echo -e "Your signed ${shafile}.asc:\n"
105
106   cat ${tmpdir}/${shafile}.asc
107
108   echo ""
109
110   while true; do
111     echo -n "Upload files? [y/n] "
112     yorn=""
113     read yorn
114
115     if [ "X${yorn}" == "Xn" ]; then
116       break
117     fi
118
119     if [ "X${yorn}" == "Xy" ]; then
120       scp ${tmpdir}/${shafile} ${tmpdir}/${shafile}.asc ${webuser}@${webhost}:${shadir}/
121       break
122     fi
123   done
124
125   rm -rf $tmpdir
126 }
127
128
129 if [ "X${1}" == "X-s" ]; then
130   if [ "X${2}" == "X" ]; then
131     echo "Please supply a version string to sign"
132     exit 1
133   fi
134
135   sign $2
136   exit 0
137 fi
138
139
140 # else: do a normal release & promote
141
142 ################################################################################
143 ## Look for releases to promote
144
145 echo -e "\n# Checking for releases ..."
146
147 promotable=$(ssh ${webuser}@${webhost} $promotablecmd nodejs)
148
149 if [ "X${promotable}" == "X" ]; then
150   echo "No releases to promote!"
151   exit 0
152 fi
153
154 echo -e "Found the following releases / builds ready to promote:\n"
155 echo "$promotable" | sed 's/^/ * /'
156 echo ""
157
158 versions=$(echo "$promotable" | cut -d: -f1)
159
160 ################################################################################
161 ## Promote releases
162
163 for version in $versions; do
164   while true; do
165     files=$(echo "$promotable" | grep "^${version}" | sed 's/^'${version}': //')
166     echo -n "Promote ${version} files (${files})? [y/n] "
167     yorn=""
168     read yorn
169
170     if [ "X${yorn}" == "Xn" ]; then
171       break
172     fi
173
174     if [ "X${yorn}" != "Xy" ]; then
175       continue
176     fi
177
178     echo -e "\n# Promoting ${version}..."
179
180     ssh ${webuser}@${webhost} $promotecmd nodejs $version
181
182     sign $version
183
184     break
185   done
186 done