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