add -b option to makerel to make a .bz2 file
[p5sagit/p5-mst-13.2.git] / Porting / release_managers_guide.pod
1
2 =head1 NAME
3
4 release_managers_guide - Releasing a new version of perl 5.x
5
6 XXX as of Jul 2009, this file is still a work-in-progress. I think it
7 contains all the actions needed to build a release, but things may have
8 got skipped, and some things could do with polishing. Note that things
9 change each release, there may be new things not covered here, or
10 tools may need updating. DAPM
11
12 =head1 SYNOPSIS
13
14 This document describes the series of tasks required - some automatic, some
15 manual - to produce a perl release of some description, be that a snaphot,
16 release candidate, or final release.
17
18 The release process is primarily executed by the current pumpking.
19
20 This document both helps as a check-list for the pumpking and is
21 a base for ideas on how the various tasks could be automated or 
22 distributed.
23
24 The outline of a typical release cycle is as follows:
25
26     (5.10.1 is released, and post-release actions have been done)
27
28     ...time passes...
29
30     an occasional snapshot is released, that still identifies itself as
31         5.10.1
32
33     ...time passes...
34
35     a few weeks before the release, a number of steps are performed,
36         including bumping the version to 5.10.2
37
38     ...a few weeks passes...
39     
40     perl-5.10.2-RC1 is released
41
42     perl-5.10.2 is released
43
44     post-release actions are performed, including creating new
45         perl5103delta.pod
46
47     ... the cycle continues ...
48
49 =head1 DETAILS
50
51
52 =head2 Building a snapshot
53
54 A snapshot is intended to encourage in-depth testing from time-to-time,
55 for example after a key point in the stabilisation of a branch. It
56 requires less steps than a full release, and the version number of perl in
57 the tarball will usually still be the old one.
58
59 =over 4
60
61 =item *
62
63 As there are no regular smokes [ XXX yet - please fix?] find out about the
64 state of VMS. If it's bad, think again.
65
66 =item *
67
68 Rebuild META.yml:
69
70     $ rm META.yml
71     $ make META.yml
72
73 and commit it if it's changed.
74
75 =item *
76
77 Check that the manifest is sorted and correct:
78
79     $ make distclean 
80     $ perl Porting/manisort
81     $ perl Porting/manicheck
82
83 =item *
84
85 If this is a release candidate or final release, add an entry to
86 F<pod/perlhist.pod> with the current date, e.g.
87
88           5.8.9-RC1     2008-Nov-10
89
90 Make sure the correct pumpking is listed, and if this is your first time,
91 append your name to C<THE KEEPERS OF THE PUMPKIN>.
92
93 =item *
94
95 Build perl, then make sure it passes its own test suite, and installs.
96
97 =item *
98
99 Create a tarball. Use the C<-s> option to specify a suitable suffix for
100 the tarball and directory name:
101
102     $ cd root/of/perl/tree
103     $ git clean -xdf            #  make sure perl and git agree on files
104
105     $ perl Porting/makerel -b -s `git describe` # for a snapshot
106     $ perl Porting/makerel -b -s RC1            # for a release candidate
107     $ perl Porting/makerel -b                   # for a final release
108
109 This creates the  directory F<../perl-x.y.z-RC1> or similar, copies all
110 the MANIFEST files into it, sets the correct permissions on them,
111 adds DOS line endings to some, then tars it up as
112 F<../perl-x.y.z-RC1.tar.gz>. With C<-b>, it also creates a C<tar.bz2> file.
113
114 XXX if we go for extra tags and branches stuff, then add the extra details
115 here
116
117 =item *
118
119 Copy the tarballs (.gz and possibly .bz2) to a web server somewhere you
120 have access to.
121
122 =item *
123
124 Download the tarball to some other machine (for a release candidate, to
125 two or more servers: IRC is good for this).
126
127 =item *
128
129 Check that C<./Configure -des && make all test> works in one place.
130
131 =item *
132
133 Check that C<./Configure ... && make all test_harness install> works.
134
135 =item *
136
137 Check that the output of C<perl -v> and C<perl -V> are as expected,
138 especially as regards version numbers, patch and/or RC levels, and @INC
139 paths. Note that the results may be different without a F<.git/> directory,
140 which is why you should test from the tarball.
141
142 =item *
143
144 Bootstrap the CPAN client on the clean install.
145
146 =item *
147
148 Install CPANPLUS.
149 XXX pick something new; this is now bundled
150
151 =item *
152
153 Bootstrap the CPANPLUS client.
154
155 =item *
156
157 Install an XS module.
158
159 =item *
160
161 If all is well, announce the snapshot to p5p. (For a release candidate,
162 instead follow the further steps described later.)
163
164 =back
165
166 =head2  Actions prior to the first release candidate
167
168 A week or two before the first release candidate, there are some additional
169 tasks you should perform (actually, some of these should be done regularly
170 anyway, but they definitely need doing now):
171
172 =over 4
173
174 =item *
175
176 Check F<Maintainers.pl> for consistency; both these commands should
177 produce no output:
178
179     perl Porting/Maintainers --checkmani
180     perl Porting/Maintainers --checkmani lib/ ext/
181
182 =item *
183
184 Ensure that dual-life CPAN modules are synchronised with CPAN.  Basically,
185 run the following:
186
187     ./perl -Ilib Porting/core-cpan-diff -a -o /tmp/corediffs
188
189 to see any inconsistencies between the core and CPAN versions of distros,
190 then fix the core, or cajole CPAN authors as appropriate. See also the
191 C<-d> and C<-v> options for more detail.  You'll probably want to use the
192 C<-c cachedir> option to avoid repeated CPAN downloads.
193
194 To see which core distro versions differ from the current CPAN versions:
195
196     ./perl -Ilib Porting/core-cpan-diff -x -a
197
198 if you are making a maint release, run C<core-cpan-diff> on both blead and
199 maint, then diff the two outputs. Compare this with what you expect, and if
200 necessary, fix things up. For example, you might think that both blead
201 and maint are synchronised with a particular CPAN module, but one might
202 have some extra changes. 
203
204 =item *
205
206 Ensure dual-life CPAN modules are stable, which comes down to:
207
208     for each module that fails its regression tests on $current
209         did it fail identically on $previous?
210         if yes, "SEP" (Somebody Else's Problem)
211         else work out why it failed (a bisect is useful for this)
212
213     attempt to group failure causes
214
215     for each failure cause
216         is that a regression?
217         if yes, figure out how to fix it
218             (more code? revert the code that broke it)
219         else
220             (presumably) it's relying on something un-or-under-documented
221             should the existing behaviour stay?
222                 yes - goto "regression"
223                 no - note it in perldelta as a significant bugfix
224                 (also, try to inform the module's author)
225
226 =item *
227
228 Similarly, monitor the smoking of core tests, and try to fix.
229
230 =item *
231
232 Similarly, monitor the smoking of perl for compiler warnings, and try to
233 fix.
234
235 =item *
236
237 Run F<Porting/cmpVERSION.pl> to compare the current source tree with the
238 previous version to check for for modules that have identical version
239 numbers but different contents, e.g.:
240
241      $ cd ~/some-perl-root
242      $ ./perl -Ilib Porting/cmpVERSION.pl -xd ~/my_perl-tarballs/perl-5.10.0 .
243
244 then bump the version numbers of any non-dual-life modules that have
245 changed since the previous release, but which still have the old version
246 number. If there is more than one maintenance branch (e.g. 5.8.x, 5.10.x),
247 then compare against both.
248
249 Note that some of the files listed may be generated (e.g. copied from ext/
250 to lib/, or a script like lib/lib_pm.PL is run to produce lib/lib.pm);
251 make sure you edit the correct file!
252
253 Once all version numbers have been bumped, re-run the checks.
254
255 Then run again without the -x option, to check that dual-life modules are
256 also sensible.
257
258
259 =item *
260
261 Get perldelta in a mostly finished state.
262 Peruse  F<Porting/how_to_write_a_perldelta.pod>, and try to make sure that
263 every section it lists is, if necessary, populated and complete. Copy
264 edit the whole document.
265
266 =item *
267
268 Bump the perl version number (e.g. from 5.10.0 to 5.10.1).
269
270 There is a tool to semi-automate this process. It works in two stages.
271 First, it generates a list of suggested changes, which you review and
272 edit; then you feed this list back and it applies the edits. So, first
273 scan the source dir looking for likely  candidates:
274
275     $ Porting/bump-perl-version -s 5.10.0 5.10.1 > /tmp/scan
276
277 This produces a file containing a list of suggested edits, eg:
278
279     NetWare/Makefile
280
281        89: -MODULE_DESC     = "Perl 5.10.0 for NetWare"
282            +MODULE_DESC     = "Perl 5.10.1 for NetWare"
283
284 i.e. in the file F<NetWare/Makefile>, line 89 would be changed as shown.
285 Review the file carefully, and delete any -/+ line pairs that you don't
286 want changing. Remember that this tool is largely just grepping for '5.10.0'
287 or whatever, so it will generate false positives. Be careful not change
288 text like "this was fixed in 5.10.0"! Then run:
289
290     $ Porting/bump-perl-version -u < /tmp/scan
291
292 which will update all the files shown; then commit the changes.
293
294 Be particularly careful with F<INSTALL>, which contains a mixture of
295 C<5.10.0>-type strings, some of which need bumping on every release, and
296 some of which need to be left. Also note that this tool currently only
297 performs a single change per line, so in particular, this line in
298 README.vms needs special handling:
299
300     rename perl-5^.10^.1.dir perl-5_10_1.dir
301
302
303 =item *
304
305 Review and update INSTALL to account for the change in version number;
306 in particular, the "Coexistence with earlier versions of perl 5" section.
307
308 =item *
309
310 Update the F<Changes> file to contain the git log command which would show
311 all the changes in this release. You will need assume the existence of a
312 not-yet created tag for the forthcoming release; e.g.
313
314     git log ... perl-5.10.0..perl5.12.0
315
316 Due to warts in the perforce-to-git migration, some branches require extra
317 exclusions to avoid other branches being pulled in. Make sure you have the
318 correct incantation: replace the not-yet-created tag with C<HEAD> and see
319 if git log produces roughly the right number of commits across roughly the
320 right time period.
321
322
323 =item *
324
325 Check some more build configurations, e.g.
326
327      -Duseshrplib -Dd_dosuid
328      make suidperl
329
330 Check that setuid installs works (for < 5.11.0 only).
331 XXX any other configs?
332
333 =item *
334
335 Make sure you have a PAUSE account suitable for uploading a perl release.
336 If you don't have a PAUSE account, then request one:
337
338     https://pause.perl.org/pause/query?ACTION=request_id
339
340 Check that your account is allowed to upload perl distros: goto
341 https://pause.perl.org/, login, then select 'upload file to CPAN'; there
342 should be a "For pumpkings only: Send a CC" tickbox.  If not, ask Andreas
343 to add your ID to the list of people allowed to upload something called
344 perl.
345
346 =item *
347
348 Update F<AUTHORS>, using the C<Porting/checkAUTHORS.pl> script, and if
349 necessary, update the script to include new alias mappings.
350
351 XXX This script is currently broken (7/2009). It needs updating to work
352 with git and a lack of Changes files.
353
354 =back
355
356 =head2  Building a release candidate
357
358 (At this point you should already have performed the actions described in
359 L</"Actions prior to the first release candidate">.) You should review
360 that section to ensure that everything there has done, and to see whether
361 any of those actions (such as consistency checks) need to be repeated.
362
363 =over 4
364
365 =item *
366
367 Re-read the perldelta to try to find any embarrassing typos and thinkos;
368 remove any C<TODO> or C<XXX> flags; and run through pod and spell
369 checkers, e.g.
370
371     podchecker -warnings -warnings pod/perl5101delta.pod
372     spell pod/perl5101delta.pod
373
374 =item *
375
376 Update patchlevel.h to add a C<-RC1>-or-whatever string; or, if this is a
377 final release, remove it.  [ XXX how now?? see 34813 for old way ]
378
379 =item *
380
381 Update C<Module::Corelist>.
382
383 Note that if this is a maint release, you should run the following actions
384 from the maint directory, but edit the C<Corelist.pm> in I<blead> and
385 subsequently cherry-pick it.
386
387 First, in order to update the C<%upstream> and C<%bug_tracker> hashes,
388 the C<Porting/corelist.pl> script requires you to have a local CPAN
389 mirror.  See http://www.cpan.org/misc/cpan-faq.html#How_mirror_CPAN for
390 more details, but basically:
391
392     $ mkdir ~/cpan-mirror
393     $ rsync -av --delete ftp.funet.fi::CPAN ~/cpan-mirror/
394
395 (and re-run the rsync each time you need it to be up-to-date).
396 [XXX this really needs fixing to not require a whole CPAN mirror]
397
398 If necessary, bump C<$VERSION> (there's no need to do this for
399 every RC; in RC1, bump the version to a new clean number that will
400 appear in the final release, and leave as-is for the later RCs and final).
401
402 Then do
403
404     $ cd ~/perl/root; make perl
405     $ ./perl -Ilib Porting/corelist.pl ~/cpan-mirror/ > /tmp/corelist
406
407 This creates a file that looks something like
408
409     5.010001 => {
410         'AnyDBM_File'           => '1.00',
411         ...
412     },
413
414     %upstream = (
415         'App::Prove'            => undef,
416         ...
417     );
418
419     %bug_tracker = (
420         'App::Prove'            => 'http://rt.cpan.org/...',
421         ...
422     );
423
424 Cut and paste these tables into F<lib/Module/CoreList.pm>: the module
425 version list should be appended as the last entry in the C<%version> hash
426 (or replaced, if we've already added it for an earlier release candidate),
427 while the existing C<%upstream> and C<%bug_tracker> hashes should be
428 replaced with the new versions.
429
430 Edit the version number in the new C<< 'Module::CoreList' => 'X.YZ' >>
431 entry, as that is likely to reflect the previous version number.
432
433 Then, add the current perl version to the C<CAVEATS> paragraph.
434
435 Add or update an entry to the C<%released> hash, including today's date
436 (if this is just a release candidate, set the date to '????-??-??').
437
438
439 =item *
440
441 Follow the instructions in the section L</"Building a snapshot">, then
442 carry on with the extra steps that follow here.
443
444 =item *
445
446 Disarm the patchlevel.h change [ XXX expand ]
447
448 =item *
449
450 Wait for the smoke tests to catch up with the commit which this release is
451 based on (or at least the last commit of any consequence).
452
453 Then check that the smoke tests pass (particularly on Win32). If not, go
454 back and fix things.
455
456
457 =item *
458
459 Once smoking is okay, upload it to PAUSE. This is the point of no return.
460 You may wish to create a .bz2 version of the tarball and upload that too.
461
462 =item *
463
464 create a tag [XXX and branches and stuff ????], e.g.:
465
466     $ git tag perl-5.10.1-RC1 -m'Release Candidate 1 of Perl 5.10.1'
467     $ git push origin tag perl-5.10.1-RC1
468
469 =item *
470
471 Mail p5p to announce it, with a quote you prepared earlier.
472
473 =item *
474
475 Wait 24 hours or so, then post the announcement to use.perl.org.
476 (if you don't have access rights to post news, ask someone like Rafael to
477 do it for you.)
478
479 =back
480
481
482 =head2  Making a final release
483
484 At this point you should have a working release candidate with few or no
485 changes since.
486
487 It's essentially the same procedure as for making a release candidate, but
488 with a whole bunch of extra post-release steps.
489
490 =over 4
491
492 =item *
493
494 Follow the same steps as for making a release candidate, then
495
496 =item *
497
498 Ask Jarkko to update http://www.cpan.org/src/README.html and
499 Rafael to update http://dev.perl.org/perl5/
500
501 =item *
502
503 Create a new empty perlNNNdelta.pod file for the current release + 1;
504 see F<Porting/how_to_write_a_perldelta.pod>.
505 [ XXX Perhaps we should have an empty template file we can copy in. ]
506
507 In addition, edit F<pod.lst>, adding the new entry as 'D', and unmark previous
508 entry as 'D', then run C<perl pod/buildtoc --build-all> to update the
509 following files:
510
511     MANIFEST
512     pod/perl.pod
513     win32/pod.mak
514     vms/descrip_mms.template
515
516 (F<vms/descrip_mms.template> still needs a manual edit to bump the
517 C<perldelta.pod> entry - it would be good for someone to figure out the fix.)
518
519 and change perlNNNdelta references to the new version in these files
520
521     INSTALL
522     win32/Makefile.mk
523     win32/Makefile
524     Makefile.SH
525     README
526
527 Also, edit the previous delta file to change the C<NAME> from C<perldelta>
528 to C<perlNNNdelta>.
529
530 These two lists of files probably aren't exhaustive; do a recursive grep
531 on the previous filename to look for suitable candidates.
532
533 (see 16410843ea for an example).
534
535 =item *
536
537 If this was a maintenance release, then edit F<Porting/mergelog> to change
538 all the C<d> (deferred) flags to C<.> (needs review).
539
540
541 =item *
542
543 If this was a major release, then
544
545 =over
546
547 =item *
548
549 bump the version, e.g. 5.12.0 to 5.13.0;
550
551 =item * 
552
553 [ XXX probably lots more stuff to do, including perldelta,
554 C<lib/feature.pm> ]
555
556 =item *
557
558 Create a new maint branch with an empty Porting/mergelog file
559 [ XXX and lots of other stuff too, probably ]
560
561 =back
562
563 =item *
564
565 Copy the perlNNNdelta.pod for this release into the other branches, and
566 remember to update these files on those branches too:
567
568     MANIFEST
569     pod.lst
570     pod/perl.pod
571     vms/descrip_mms.template
572     win32/pod.mak
573
574 (see fc5be80860 for an example).
575
576 =item *
577
578 Make sure any recent F<pod/perlhist.pod> entries are copied to
579 F<perlhist.pod> on other branches; typically the RC* and final entries,
580 e.g.
581
582           5.8.9-RC1     2008-Nov-10
583           5.8.9-RC2     2008-Dec-06
584           5.8.9         2008-Dec-14
585
586 =item *
587
588 Remind the current maintainer of C<Module::CoreList> to push a new release
589 to CPAN.
590
591 =back
592
593 =head1 SOURCE
594
595 Based on
596 http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2009-05/msg00608.html,
597 plus a whole bunch of other sources, including private correspondence.
598
599 =cut
600