Updates of things that have aged
[tools.git] / HOWTO-make-a-release.md
1 # HOW TO MAKE A RELEASE
2
3 This file documents how to make an OpenSSL release.  Please fix any errors
4 you find while doing, or just after, your next release!
5
6 Releases are done by one person, with a second person acting as the reviewer
7 and additional tester.
8
9 # Table of contents
10
11 -   [Prerequisites](#prerequisites)
12     -   [Software](#software)
13     -   [Repositories](#repositories)
14     -   [PGP / GnuPG key](#pgp-gnupg-key)
15     -   [SSH access](#check-your-access)
16     -   [A method for reviewing](#a-way-to-reviewing)
17 -   [Pre-publishing tasks](#pre-publishing-tasks)
18     -   [Prepare your repository checkouts](#prepare-your-repository-checkouts)
19     -   [Freeze the source repository](#freeze-the-source-repository) [three business days before release]
20     -   [Make sure that the openssl source is up to date](#make-sure-that-the-openssl-source-is-up-to-date)
21     -   [Generate the tarball and announcement text](#generating-the-tarball-and-announcement-text)
22         -   [OpenSSL 3.0 and on](#openssl-3.0-and-on)
23         -   [OpenSSL before 3.0](#openssl-before-3.0)
24     -   [Update the release data locally](#update-the-release-data-locally)
25         [do not push]
26 -   [Publish the release](#publish-the-release)
27     -   [Updating the release data](#updating-the-release-data)
28 -   [Post-publishing tasks](#post-publishing-tasks)
29     -   [Check the website](#check-the-website)
30     -   [Send the announcement mail](#send-the-announcement-mail)
31     -   [Send out the Security Advisory](#send-out-the-security-advisory)
32     -   [Unfreeze the source repository](#unfreeze-the-source-repository)
33     -   [Security fixes](#security-fixes)
34     -   [Keep in touch](#keep-in-touch)
35
36
37 # Prerequisites
38
39 ## Software
40
41 Apart from the basic operating system utilities, you must have the following
42 programs in you `$PATH`:
43
44 - openssl
45 - ssh
46 - gpg
47 - git
48
49 (note: this may not be a complete list)
50
51 ## Repositories
52
53 You must have access to the following repositories:
54
55 -   `git@github.openssl.org:openssl/openssl.git`
56
57     This is the usual main source repository
58
59 -   `git@github.openssl.org:otc/tools.git`
60
61     This contains certain common tools
62
63 -   `git@github.openssl.org:omc/data.git`
64
65     This contains files to be updated as part of any release
66
67 ## PGP / GnuPG key
68
69 You must have a PGP / GnuPG key, and its fingerprint should be present in
70 the file `doc/fingerprints.txt` in the source of the immediately prior
71 OpenSSL release.
72
73 ## SSH access
74
75 To perform a release, you must have appropriate access to OpenSSL's
76 development host, dev.openssl.org.  To test this, try to log in with ssh:
77
78     ssh dev.openssl.org
79
80 You must also check that you can perform tasks as the user 'openssl' on
81 dev.openssl.org.  When you have successfully logged in, test your access to
82 that user with sudo:
83
84     sudo -u openssl id
85
86 ## A method for reviewing
87
88 For reviewing to take place, the release person and the reviewer need a way
89 to share changes that are being applied.  Most commonly, that's done as PRs
90 (for normal releases) or security advisories (for undisclosed security
91 fixes) through Github.
92
93 Security advisories are created using the Github Security tab, and will
94 generate a private repository, to which you can add collaborators (the
95 reviewer, for instance), and use it to fix the issue via pull requests.
96 For more information, please read Github's [creating a security advisory],
97 including the "Next Steps" at the end of that page.
98
99 [creating a security advisory]:
100 <https://docs.github.com/en/free-pro-team@latest/github/managing-security-vulnerabilities/creating-a-security-advisory>
101
102 The release person and the reviewer are allowed to use other means to share
103 the commits to be reviewed if they desire.
104
105 The release person and the reviewer must have a conversation to confirm or
106 figure out how the review shall be done.
107
108 # Pre-publishing tasks
109
110 Some of the actions in this section need to be repeated for each OpenSSL
111 version released.
112
113 ## Prepare your repository checkouts
114
115 You will need to checkout at least three working trees:
116
117 -   one for extra tools
118
119         git clone git@github.openssl.org:otc/tools.git tools
120
121     The resulting directory will be referred to as `$TOOLS`
122
123 -   one for release data
124
125         git clone git@github.openssl.org:omc/data.git data
126
127 -   At least one for openssl source
128
129         git clone git@github.openssl.org:openssl/openssl.git
130
131     If you're doing multiple releases in one go, there are many ways to deal
132     with it.  One possibility, available since git 2.5, is to use `git
133     worktree`:
134
135         (cd openssl;
136          git worktree add ../openssl-1.1.1 OpenSSL_1_1_1-stable)
137
138 ## Freeze the source repository
139
140 Three business day before the release, freeze the main repository.  This
141 locks out everyone but the named user, who is doing the release, from doing
142 any pushes.  Someone other than the person doing the release should run the
143 command.
144
145 This must be done from a checkout of `git@github.openssl.org:openssl/openssl.git`.
146
147     git push git@github.openssl.org:openssl/openssl.git master:refs/frozen/NAME
148
149 Where `NAME` is the github username of the user doing the release.
150
151 Note: it currently doesn't matter what source branch is used when pushing,
152 the whole repository is frozen either way.  The example above uses master.
153
154 ## Make sure that the openssl source is up to date
155
156 The person doing the release and the reviewer should both sanity-check the
157 source to be released at this point.  Checks to consider include building
158 and verifying that make test passes on multiple plaforms - Linux, Windows,
159 etc.
160
161 *NOTE: the files CHANGES and NEWS are called CHANGES.md and NEWS.md in
162 OpenSSL versions from version 3.0 and on*
163
164 For each source checkout, make sure that the CHANGES and NEWS files have
165 been updated and reviewed.
166
167 The NEWS file should contain a summary of any changes for the release;
168 for a security release, it's often simply a list of the CVEs addressed.
169 You should also update NEWS.md in the master branch to include details of
170 all releases.  Only update the bullet points - do not change the release
171 date, keep it as **under development**.
172
173 Add any security fixes to the tree and commit them.
174
175 Make sure that the copyrights are updated.  This script will update the
176 copyright markers and commit the changes (where $TOOLS stands for the
177 openssl-tools.git checkout directory):
178
179     $TOOLS/release-tools/do-copyright-year
180
181 Obtain approval for these commits from the reviewer and add the Release and
182 Reviewed-By trailers as required.
183
184 *Do* send the auto-generated commits to the reviewer and await their
185 approval.
186
187 *Do not push* changes to the main source repo at this stage.
188 (the main source repo being `git@github.openssl.org:openssl/openssl.git`)
189
190 ## Generate the tarball and announcement text
191
192 *The changes in this section should be made in your clone of the openssl
193 source repo*
194
195 The method to generate a release tarball and announcement text has changed
196 with OpenSSL 3.0, so while we continue to make pre-3.0 OpenSSL releases,
197 there are two methods to be aware of.
198
199 Both methods will leave a handful of files, most importantly the release
200 tarball.  When they are done, they display a set of instructions on how to
201 perform the publishing tasks, *please take note of them*.
202
203 After having run the release script, verify that its results are sensible.
204 Check the commits that were added, using for example `git log`.  Check the
205 signed announcement .asc file.  Check that the tarball length and hashes
206 match in the .md5, .sha1, .sha256, and review the announcment file.
207
208 *Do* send the auto-generated commits to the reviewer and await their
209 approval.
210
211 *Do not push* changes to the main source repo at this stage.
212 (the main source repo being `git@github.openssl.org:openssl/openssl.git`)
213
214 ### OpenSSL 3.0 and on
215
216 The release generating script is in the OpenSSL source checkout, and is
217 generally called like this:
218
219     dev/release.sh --reviewer=NAME
220
221 This script has a multitude of other options that are useful for specific
222 cases, and is also self-documented:
223
224 -   To get a quick usage reminder:
225
226         dev/release.sh --help
227
228 -   To get a man-page:
229
230         dev/release.sh --manual
231
232 ### OpenSSL before 3.0
233
234 The release generating script is in the tools checkout, represented here
235 with $TOOLS, and is generally called like this:
236
237     $TOOLS/release-tools/mkrelease.pl --reviewer=NAME
238
239 The manual for that script is found in `$TOOLS/release-tools/MKRELEASE.md`
240
241 ## Update the release data locally
242
243 *The changes in this section should be made in your clone of the release
244 data repo*
245
246 Update the newsflash.txt file.  This normally is one or two lines.  Just
247 copy and paste existing announcements making minor changes for the date and
248 version number as necessary.  If there is an advisory then ensure you
249 include a link to it.
250
251 Update the vulnerabilities.xml file if appropriate.
252
253 If there is a Security Advisory then copy it into the secadv directory.
254
255 *Do* send the commits to the reviewer and await their approval.
256
257 Make a pull request from your changes, against the release data repo (the
258 release data repo being `git@github.openssl.org:omc/data.git`).
259
260 *Do not merge the pull request at this point*, even if the reviewer already
261 approved it.
262
263 # Publish the release
264
265 *BE CAREFUL*  This section makes everything visible and is therefore largely
266 irreversible.  If you are performing a dry run then DO NOT perform any steps
267 in this section.
268
269 Check that the release has been uploaded properly.  The release tarballs and
270 associated files should be in ~openssl/dist/new.  They should be owned by
271 the openssl userid and world-readable.
272
273 Copy the tarballs to appropriate directories.  This can be done using the
274 do-release.pl script.  See $TOOLS/release-tools/DO-RELEASE.md for a
275 description of the options.  For example:
276
277     sudo -u openssl perl ~openssl/do-release.pl --copy --move
278
279 This will copy the relevant files to the website and move them from
280 `~openssl/dist/new` to `~openssl/dist/old` so they will not seen by a
281 subsequent release.  Alternatively if you want to perform one release at a
282 time or copy/move the files manually, see below.
283
284 The do-release.pl script will display the commands you will need to issue to
285 send the announcement emails later.  Keep a note of those commands for
286 future reference.
287
288 Verify that the tarballs are available via FTP:
289
290     ftp://ftp.openssl.org/source/
291
292 And that they are ready for the website:
293
294     ls /var/www/openssl/source
295
296 *For OpenSSL 3.0 and on*, push your local changes to the main source repo as
297 instructed by `dev/release.sh`.  You may want to sanity check the pushes by
298 inserting the `-n` (dry-run) option.
299
300 *For OpenSSL before 3.0*, simply push your local changes to the main source
301 repo, and please do remember to push the release tags as well. You may want to
302 sanity check the pushes by inserting the `-n` (dry-run) option. You must specify
303 the repository / remote and tag to be pushed:
304
305     git push <repository> <tagname>
306
307 ## Updating the release data
308
309 Merge the PR against the release data repo now.
310
311 When you do this, the website will get updated and a script to flush the
312 Akamai CDN cache will be run.
313
314 You can look at <https://automation.openssl.org/> to see the automation
315 builds in action.  The builder called `web` is of particular interest.
316
317 You can also look at the result at <https://www-origin.openssl.org>; the
318 CDN-hosted www.openssl.org should get updated withing minutes later.
319
320 # Post-publishing tasks
321
322 ## Check the website
323
324 Verify that the release notes, which are built from the CHANGES.md file
325 in the release, have been updated.  This is done automatically by OpenSSL
326 automation; if you see a problem, check if the web build job has been
327 performed yet, you may have to wait a few minutes before it kicks in.
328
329 Wait for a while for the Akamai flush to work (normally within a few minutes).
330 Have a look at the website and news announcement at:
331
332 -   <https://www.openssl.org/>
333 -   <https://www.openssl.org/news/>
334
335 Check the download page has updated properly:
336
337 -   <https://www.openssl.org/source/>
338
339 Check the notes look sensible at:
340
341 -   <https://www.openssl.org/news/newslog.html>
342
343 Also check the notes here:
344
345 -   <https://www.openssl.org/news/openssl-1.0.2-notes.html>
346 -   <https://www.openssl.org/news/openssl-1.1.0-notes.html>
347 -   <https://www.openssl.org/news/openssl-1.1.1-notes.html>
348
349 ## Send the announcement mail
350
351 Send out the announcements.  Generic release announcement messages will be
352 created automatically by the build script and the commands you need to use
353 to send them were displayed when you executed do-release.pl above.
354 These are sent to openssl-users, openssl-project, and openssl-announce. They
355 should be sent from the account of the person that owns the key used for signing
356 the release announcement. Ensure that mutt is configured correctly - send a test
357 email first if necessary.
358
359 If do-release.pl was used with `--move` be sure to move the announcement
360 text files away from the staging directory after they have been sent.  This
361 is done as follows (with VERSION replaced with the version of OpenSSL to
362 announce):
363
364     REPLYTO="openssl@openssl.org" mutt -s "OpenSSL version VERSION published" \
365             openssl-project openssl-users openssl-announce \
366             < /home/openssl/dist/new/openssl-VERSION.txt.asc
367     sudo -u openssl \
368         mv ~openssl/dist/new/openssl-VERSION.txt.asc ~openssl/dist/old
369
370 ## Send out the Security Advisory
371
372 *The secadv file mentioned in this section is the Security Advisory
373 that you copied into the release data repo, up in the section
374 [Update the release data locally](#update-the-release-data-locally)*
375  
376 *This section is only applicable if this is a security release*
377
378 Start with signing the Security Advisory as yourself:
379
380     gpg --clearsign secadv_FILENAME.txt
381
382 Then copy the result to the temporary directory on dev.openssl.org:
383
384     scp secadv_FILENAME.txt.asc dev.openssl.org:/tmp
385
386 To finish, log in on dev.openssl.org and send the signed Security
387 Advisory by email as the user that signed the advisory, and then remove it:
388
389     REPLYTO="openssl@openssl.org" mutt -s "OpenSSL Security Advisory" \
390             openssl-project openssl-users openssl-announce \
391             </tmp/secadv_FILENAME.txt.asc
392     rm /tmp/secadv_FILENAME.txt.asc
393
394 Approve the openssl-announce email.  Go to
395 <https://mta.openssl.org/mailman/admindb/openssl-announce>
396 and approve the messages.
397
398 Check the mailing list messages have arrived.
399
400 ## Unfreeze the source repository.
401
402 This must be done from a checkout of the main source repo.
403
404     git push --delete git@github.openssl.org:openssl/openssl.git \
405         refs/frozen/NAME
406
407 ## Security fixes
408
409 If this release includes security fixes with a CVE then you should inform
410 MITRE about them.  See the instructions at the top of cvepool.txt in omc.
411
412 Close the github advisory without pushing to github and remove the private
413 github fork if there was one.
414
415 ## Keep in touch
416
417 Check mailing lists over the next few hours for reports of any success or
418 failure.  If necessary fix these and in the worst case make another
419 release.
420