Add blueprint.
[tails-test.git] / wiki / src / contribute / release_process.mdwn
blob3cf4e95484362ef92982986df80dfd59f8d25c2c
1 [[!meta title="Release process"]]
3 [[!toc levels=2]]
5 See the [[release_schedule]].
7 Environment
8 ===========
10 Export the following environment variables to be able to copy'n'paste
11 the scripts snippets found on this page:
13 * version numbers:
15       export VERSION=$(dpkg-parsechangelog -SVersion)
16       export TAG=$(echo "$VERSION" | sed -e 's,~,-,')
17       export PREVIOUS_VERSION=$(dpkg-parsechangelog --offset 1 --count 1 -SVersion)
19 * `NEXT_MAJOR_VERSION`: set to the version number of the next Tails release
20   (e.g. 0.23 when releasing 0.22.1, and 1.3 when releasing 1.2)
21 * `MAJOR_RELEASE`: set to 1 if preparing a major release, to 0 else
22 * `ISOS`: the directory where one stores `tails-i386-*`
23   sub-directories like the ones downloaded with BitTorrent.
24 * `ARTIFACTS`: the directory where build artifacts (e.g.
25   the `.packages` file) land.
26 * `MASTER_CHECKOUT`: a checkout of the `master` branch of the main
27   Tails Git repository.
28 * `RELEASE_BRANCH`: the name of the branch of the main Tails Git
29   repository used to prepare the release (`stable` or `testing`).
30 * `RELEASE_CHECKOUT`: a checkout of the branch of the main Tails Git
31   repository used to prepare the release (`stable` or `testing`).
32 * `TAILS_SIGNATURE_KEY=0D24B36AA9A2A651787876451202821CBE2CD9C1`
33 * `IUK_CHECKOUT`: a checkout of the relevant tag of the `iuk`
34   Git repository.
35 * `PERL5LIB_CHECKOUT`: a checkout of the relevant tag of the
36   `perl5lib` Git repository.
38 Pre-freeze
39 ==========
41 The [[contribute/working_together/roles/release_manager]] role
42 documentation has more tasks that should be done early enough.
44 Update Iceweasel preferences
45 ----------------------------
47 * update `extensions.adblockplus.currentVersion` in
48   `config/chroot_local-includes/etc/iceweasel/profile/user.js`
50 Coordinate with Debian security updates
51 ---------------------------------------
53 See [[release_process/Debian_security_updates]].
55 Select the right branch
56 =======================
58 For a major release, the `devel` branch should be merged into the `testing`
59 branch and changes should be made from there.
61 From minor releases, work should happen in `stable`.
63 <div class="caution">
64 Then, read this document from the branch used to prepare the release.
65 </div>
67 Update included files
68 =====================
70 AdBlock patterns
71 ----------------
73 Patterns are stored in
74 `config/chroot_local-includes/etc/iceweasel/profile/adblockplus/`.
76 1. Boot Tails
77 2. Open *Tools* → *Addons*
78 3. Select *Adblock Plus* in extensions
79 4. Open *Preferences* → *Filter preferences…*
80 5. For each filters, click *Actions* → *Update filters*
81 6. Close Iceweasel
82 7. Copy the `.mozilla/firefox/default/adblockplus/patterns.ini` from
83    this Iceweasel instance to the
84    `config/chroot_local-includes/etc/iceweasel/profile/adblockplus`
85    directory in the Tails Git checkout.
86 8. Commit:
88        git commit -m 'Update AdBlock Plus patterns.' \
89           config/chroot_local-includes/etc/iceweasel/profile/adblockplus/patterns.ini
91 Upgrade bundled binary Debian packages
92 --------------------------------------
94 That is: make sure the bundled binary Debian packages contain
95 up-to-date localization files.
97 For each bundled Debian package, `cd` into the package's root
98 directory (e.g. a checkout of the `whisperback` repository),
99 and then run the `import-translations` script that is in the
100 main Tails repository. For example:
102         cd whisperback
103         ../tails/import-translations
105 If the `import-translations` script fails to import translations for
106 the current package, manually copy updated PO files from the
107 Transifex branches of `git://git.torproject.org/translation.git` (e.g.
108 `whisperback_completed`) instead. In this case, skip PO files for
109 [[translation teams that use Git|contribute/how/translate#translate]].
111 Add and commit.
113 Then check the PO files [[using i18nspector|contribute/l10n_tricks]].
114 Correct all the errors that are not in the ignored list of
115 [[`check_po.sh`|contribute/l10n_tricks]]. Commit the changes if any.
117 Then see the relevant release processes:
119 * [[iceweasel]]
120 * [[liveusb-creator]]
121 * [[tails-greeter]]
122 * [[perl5lib]]
123 * [[persistence-setup]]
124 * [[tails-iuk]]
125 * whisperback:
126   * follow [upstream release process](https://git-tails.immerda.ch/whisperback/plain/HACKING)
127   * build a Debian package
128   * upload it to our [[APT repository]]
130 Update PO files
131 ---------------
133 Pull updated translations for languages translated in Transifex:
135         ./import-translations
137 Refresh the code PO files:
139         ./refresh-translations
141 Commit the result, including new PO files:
143         git add po && git commit -m 'Update PO files.'
145 Freeze
146 ------
148 If we are at freeze time for a major release:
150 * Merge the `master` Git branch into `devel`.
151 * Merge the `devel` Git branch into `testing`.
152 * Reset the `testing` APT suite to the state of the `devel` one, as
153   documented on [[contribute/APT_repository#workflow-freeze]].
155 Else, if we are at freeze time for a point-release:
157 * Merge the `master` Git branch into `stable`.
159 Changelog
160 ---------
162 Remove the placeholder entry for next release in `debian/changelog`,
163 and then:
165         ./release $VERSION $PREVIOUS_VERSION
167 This populates the Changelog with the Git log entries.
169 Then, launch an editor for the needed cleanup of the result:
171         dch -e
173 Then, gather other useful information from:
175 * every custom bundled package's own Changelog (Greeter, Persistent
176   Volume Assistant, etc.);
177 * the "Fix committed" section on the [Release Manager
178   View](https://labs.riseup.net/code/projects/tails/issues?query_id=130).
180 Finally, commit:
182         git commit debian/changelog -m "Update changelog for $VERSION."
184 Included website
185 ----------------
187 ### Merge master
189 Merge `master` into the branch used for the release:
191         git fetch origin && git merge origin/master
193 ### version number
195 If preparing a RC, skip this part.
197 In the branch used to build the release, update the `wiki/src/inc/*` files to
198 match the *version number* and *date* of the new release. Set the date
199 at least 24 hours in the future! Between tests and mirror synchronization,
200 the build will not be released on the same day. Try to make sure it
201 matches the date of the future signature.
203         RELEASE_DATE='June 26, 2013'
205         echo "$VERSION"      > wiki/src/inc/stable_i386_version.html
206         echo "$RELEASE_DATE" > wiki/src/inc/stable_i386_date.html
207         sed -ri "s%news/version_.*]]%news/version_$VERSION]]%" wiki/src/inc/stable_i386_release_notes.*
208         $EDITOR wiki/src/inc/*.html
209         ./build-wiki
210         git commit wiki/src/inc/ -m "Update version and date for $VERSION."
212 ### features and design documentation
214 Read the Changelog carefully, and update [[doc/about/features]]
215 pages accordingly.
217 Also:
219         git grep PENDING wiki/src/contribute/design*
221 ... and remove the `PENDING-FOR-N.M` warnings.
223 Website translations
224 --------------------
226 Refresh the website PO files and commit the ones corresponding to
227 pages that were added or changed accordingly to changes coming with
228 the new release. This e.g. ensures that the RC call for translation
229 points translators to up-to-date PO files:
231         ./build-wiki && git add wiki/src && git commit -m 'Update website PO files.'
233 Call for translation
234 ====================
236 If at freeze time:
238 1. Ask on tails-l10n that someone checks the PO files of `po/` and of
239    the website [[using `check_po.sh`|contribute/l10n_tricks]], and
240    corrects all the errors.
241 2. Send a call for translations to tails-l10n, making it clear what
242    Git branch the translations must be based on, and what are the
243    priorities. Also, add a few words to remember the translation teams
244    using Git that they should regularly contact Transifex translators,
245    as detailed on the [[documentation for
246    translators|contribute/how/translate]].
248 Import the signing key
249 ======================
251 You should never import the Tails signing key into your own keyring,
252 and a good practice is to import it to a tmpfs so no key material is
253 written to disk:
255     export GNUPGHOME=$(mktemp -d)
256     sudo mount -t tmpfs tmpfs "$GNUPGHOME"
257     gpg --homedir $HOME/.gnupg --export $TAILS_SIGNATURE_KEY | gpg --import
258     gpg --import path/to/private-key
260 Let's also ensure that strong digest algorithms are used for our
261 signatures, like the defaults we set in Tails:
263     cp config/chroot_local-includes/etc/skel/.gnupg/gpg.conf "$GNUPGHOME"
265 Tag the release in Git
266 ======================
268         git tag -u "$TAILS_SIGNATURE_KEY" -m "tagging version ${VERSION}" "${TAG}"
269         git push --tags
271 (Pushing the tag is needed so that the APT repository is updated, and
272 the Tails APT configuration works at build and boot time. It might be
273 premature, as testing might reveal critical issues, but this is
274 a signed tag, so it can be overridden later. Yes, there is room for
275 improvement here.)
277 Prepare the versioned APT suite
278 ===============================
280 Follow the [[post-tag|contribute/APT_repository#workflow-post-tag]] APT
281 repository documentation.
283 Build images
284 ============
286 Build the almost-final image
287 ----------------------------
289 [[Build images|contribute/build]] and carefully read the build logs to
290 make sure nothing bad happened.
292 SquashFS file order
293 -------------------
295 1. Build an ISO image.
296 1. Burn a DVD.
297 1. Boot this DVD **on bare metal**.
298 1. Add `profile` to the kernel command-line.
299 1. Login.
300 1. Wait for the "Tor is ready" notification.
301 1. Start the web browser.
302 1. A few minutes later, once the `boot-profile` process has been
303    killed, retrieve the new sort file from `/var/log/boot-profile`.
304 1. Copy the new sort file to `config/binary_rootfs/squashfs.sort`.
305 1. Cleanup a bit:
306    - remove `var/log/live/config.pipe`: otherwise the boot is broken
307      or super-slow
308    - remove the bits about `kill-boot-profile` at the end: they're
309      only useful when profiling the boot
310 1. Inspect the Git diff (including diff stat), apply common sense.
311 1. `git commit -m 'Updating SquashFS sort file' config/binary_rootfs/squashfs.sort`
313 Build the final image
314 ---------------------
316 Then all included files should be up-to-date and the versioned APT
317 suite should be ready, so it is time to:
319 * tag the release *again*, with all included files in
320 * `git push --tags`
321 *  build the final image!
323 <a id="prepare-iuk"></a>
325 Generate the OpenPGP signatures and Torrents
326 ============================================
328 First, create a directory with a suitable name and go there:
330         mkdir "$ISOS/tails-i386-$VERSION" && cd "$ISOS/tails-i386-$VERSION"
332 Second, copy the built image to this brand new directory.
333 Then, rename it:
335         mv "$ARTIFACTS/tails-i386-*-$VERSION-*.iso" "tails-i386-$VERSION.iso"
337 Third, generate detached OpenPGP signatures for the image to be
338 published, in the same directory as the image and with a `.sig`
339 extension; e.g.
341         gpg --armor --default-key "$TAILS_SIGNATURE_KEY" --detach-sign *.iso
342         rename 's,\.asc$,.sig,' *.asc
344 Fourth, go up to the parent directory, create a `.torrent` file and
345 check the generated `.torrent` files metainfo:
347         cd .. && \
348         mktorrent -a 'http://torrent.gresille.org/announce' "tails-i386-${VERSION}" && \
349         btshowmetainfo tails-i386-$VERSION.torrent
351 Fifth, generate detached OpenPGP signatures for every published
352 `.torrent` file:
354         gpg --armor --default-key "$TAILS_SIGNATURE_KEY" --detach-sign \
355           tails-i386-$VERSION.torrent && \
356         mv tails-i386-$VERSION.torrent.{asc,sig}
358 Prepare incremental upgrades
359 ============================
361 Build the Incremental Upgrade Kits
362 ----------------------------------
364 Use `tails-create-iuk` to build the following IUKs:
366 * From the previous stable release, e.g. 1.0 to 1.0.1 or 1.0 to
367   1.0.1~rc1. This may be skipped if the delta is too big (like when
368   migrating to a new Debian release) or if there are changes outside
369   of the scope for IUKs (like partition table changes).
371 * From the last RC for the version being released, e.g. 1.0~rc1 to
372   1.0. This should be done even if there was no IUK generated from the
373   previous stable release since it is a good way to test the iuk code
374   that'll be used for the incremental upgrade paths to the
375   next version.
377 Example (for RC, replace `$PREVIOUS_VERSION` with e.g. `$VERSION~rc1`
378 below):
380     sudo su -c "cd $IUK_CHECKOUT && \
381       PERL5LIB=\"$PERL5LIB_CHECKOUT/lib\" \
382         ./bin/tails-create-iuk \
383            --squashfs-diff-name \"$VERSION.squashfs\"           \
384            --old-iso \"$ISOS/tails-i386-$PREVIOUS_VERSION/tails-i386-$PREVIOUS_VERSION.iso\" \
385            --new-iso \"$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso\"          \
386            --outfile \"$ISOS/Tails_i386_${PREVIOUS_VERSION}_to_${VERSION}.iuk\""
388 Note that developer tools for creating IUK and upgrade-description
389 files were only tested on Debian sid. It should hopefully work well on
390 Wheezy too.
392 <a id="prepare-upgrade-description-files"></a>
394 Prepare upgrade-description files
395 ---------------------------------
397 1. Prepare upgrade-description files (see the [[upgrade-description
398    files
399    specification|contribute/design/incremental_upgrades#upgrade-description-files]]
400    for details). The idea is to:
402    * update (create if needed) an upgrade-description file for every
403      *previous* supported release (e.g. N~rc1, N-1, N-1~rc2) that replaces
404      all existing upgrade paths with the path to the version being
405      released;
406    * create a new upgrade-description for the version being released,
407      that expresses that *no* upgrade is available for that one yet.
409    This is what `tails-iuk-generate-ugrade-description-files` tool
410    does:
412        ( cd $IUK_CHECKOUT && \
413        ./bin/tails-iuk-generate-upgrade-description-files \
414            --version "$VERSION" \
415            --next-version "$NEXT_MAJOR_VERSION" \
416            --next-version "${NEXT_MAJOR_VERSION}~rc1" \
417            --next-version "${VERSION}.1" \
418            --next-version "${VERSION}.1~rc1" \
419            --iso "$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso" \
420            --previous-version "$PREVIOUS_VERSION" \
421            --previous-version "${VERSION}~rc1" \
422            --iuks "$ISOS" \
423            --release-checkout "$RELEASE_CHECKOUT" \
424            --major-release "$MAJOR_RELEASE" \
425        )
427    Note:
428    * The `--iuks` argument must point to the directory where the IUKs
429      generated at the previous step are stored.
430    * At least the last stable release and the previous release
431      candidates for the version being released must be passed to
432      `--previous-version`.
433    * A few (say, 2 or 3) older versions must be passed with
434      `--previous-version`, so that users who skipped a release or two
435      are directly informed of the new one.
436    * If preparing a release candidate, add `--channel alpha`
437    * If preparing a release candidate, drop all `--next-version`
438      arguments, and instead pass (**untested!**)
439      `--next-version $(echo $VERSION | sed -e 's,~rc*$,,')`
440    * If preparing a point-release, pass neither
441      `--next-version "${VERSION}.1"`,
442      nor `--next-version "${VERSION}.1~rc1"`
444 1. Create an armoured detached signature for each created or modified
445    upgrade-description file.
447        find "$RELEASE_CHECKOUT/wiki/src/upgrade/" \
448           -type f -name upgrades.yml -exec \
449              gpg -u "$TAILS_SIGNATURE_KEY" --armor --detach-sign {} \;
451 1. Rename each detached signature to `.pgp`:
453        find "$RELEASE_CHECKOUT/wiki/src/upgrade/" -type f \
454           -name upgrades.yml.asc -exec rename -f 's,\.asc$,.pgp,' {} \;
456 1. Add and commit the upgrade-description files and their detached
457    signatures to the Git branch used to prepare the release (`stable`
458    or `testing`):
460        ( cd "$RELEASE_CHECKOUT" && git add wiki/src/upgrade && \
461           git commit -m "Update upgrade-description files." )
463 1. Check the syntactic correctness of all upgrade-description files:
465        ( cd $IUK_CHECKOUT && \
466           ./bin/tails-iuk-check-upgrade-description-file \
467              ${RELEASE_CHECKOUT}/wiki/src/upgrade/v1/*/*/*/*/upgrades.yml )
469 1. If preparing a release candidate, move the generated or updated
470    files to `$MASTER_CHECKOUT`, commit and push: given the updates are
471    advertised on the *alpha* channel, while all users use the *stable*
472    one by default, this will allow you to more easily test the IUK
473    without impacting anyone.
475 Upload images
476 =============
478 Sanity check
479 ------------
481 Verify that the current source for Firefox is still the same we've
482 used when preparing our custom Iceweasel package: e.g. FF17.0.8 got
483 re-tagged and re-uploaded at the last minute, due to a test failure.
485 Better catch this before people spend time doing manual tests.
487 ## Announce, seed and test the Torrents
489 Announce and seed the Torrents.
491 Test them with a BitTorrent client running in a different place.
493 ## Download and seed image from lizard
495     scp "$ISOS/tails-i386-$VERSION.torrent" \
496        bittorrent.lizard: && \
497        ssh bittorrent.lizard transmission-remote --add tails-i386-$VERSION.torrent
499 Publish the ISO over HTTP
500 -------------------------
502 Upload the images to the primary rsync mirror. Best practice is to first
503 let bittorrent.lizard download the image, and then copy it from there to
504 rsync.lizard:
506     ssh lizard.tails.boum.org \
507         scp -3 -r \
508             bittorrent.lizard:/var/lib/transmission-daemon/downloads/tails-i386-$VERSION \
509             rsync.lizard:
510     # set DIST to either 'alpha' (for RC:s) or 'stable' (for actual releases)
511     ssh rsync.lizard << EOF
512       chown -R root:rsync_tails tails-i386-$VERSION
513       chmod -R u=rwX,go=rX tails-i386-$VERSION
514       sudo mv tails-i386-$VERSION /srv/rsync/tails/tails/$DIST/
515     EOF
517 Update the time in `project/trace` file on the primary rsync mirror
518 and on the live wiki (even for a release candidate):
520         TRACE_TIME=$(date +%s) &&
521         echo $TRACE_TIME | ssh rsync.lizard "cat > /srv/rsync/tails/tails/project/trace" && \
522         [ -n "$MASTER_CHECKOUT" ] && \
523         echo $TRACE_TIME > "$MASTER_CHECKOUT/wiki/src/inc/trace" &&
524         (
525            cd "$MASTER_CHECKOUT" && \
526            git commit wiki/src/inc/trace -m "Updating trace file after uploading $VERSION."
527         )
529 <a id="publish-iuk"></a>
531 Publish the IUKs
532 ----------------
534 Same as for the ISO, but the IUKs should land into
535 `/srv/rsync/tails/tails/$DIST/iuk/`.
537 Wait for the HTTP mirrors to catch up
538 -------------------------------------
540 Wait for the next rsync pull.
542 Make sure every webserver listed in the `dl.amnesia.boum.org` round
543 robin pool has the new version. Drop those that are lagging behind and
544 notify their administrators.
546 Test downloading the ISO and IUK over HTTP.
548 Update the website and Git repository
549 =====================================
551 What follows in this section happens on the release branch in
552 `$RELEASE_CHECKOUT`.
554 If preparing a final release
555 ----------------------------
557 Skip this part if preparing a RC.
559 In order to get any new documentation into the website, merge either
560 `stable` or `testing` (depending on which release you just did) into
561 `master`.
563 Rename the `.packages` file to remove the `.iso` and build date parts
564 of its name:
566         mv "$ARTIFACTS"/tails-i386-*-"$VERSION"-*.iso.packages \
567            "$ARTIFACTS/tails-i386-$VERSION.packages"
569 Copy the `.iso.sig`, `.packages`, `.torrent` and `.torrent.sig` files
570 into the website repository:
572         cp "$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso.sig" \
573            "$ARTIFACTS/tails-i386-$VERSION.packages" \
574            "$ISOS/tails-i386-$VERSION.torrent" \
575            "$ISOS/tails-i386-$VERSION.torrent.sig" \
576            "$RELEASE_CHECKOUT/wiki/src/torrents/files/"
578 Remove from `wiki/src/torrents/files/` any remaining file from the
579 previous release (including any RC).
581 Generate the SHA-256 hash of every image
582 to be released in `inc/*`:
584         sha256sum $ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso | \
585           cut -f 1 -d ' ' | tr -d '\n' \
586           > "$RELEASE_CHECKOUT/wiki/src/inc/stable_i386_hash.html"
588 Update the [[support/known_issues]] page:
590 - Add regressions brought by the new release.
591 - Remove older known issues that are fixed by the new release.
593 Write the announcement for the release in
594 `news/version_$TAG.mdwn`, including:
596 - Update the `meta title` directive.
597 - Update the `meta date` directive.
598 - Make sure there's an `announce` tag to have an email sent to the
599   news mailing-list.
600 - Document important config changes that persistence users have to do
601   themselves (e.g. the Pidgin proxy settings change in
602   [[!tails_gitweb_commit 9925321]] breaks all existing persistent
603   profiles).
604 - Document known issues.
605 - Update the link(s) to these release notes in
606   `wiki/src/doc/first_steps/upgrade.mdwn`.
608 Write an announcement listing the security bugs affecting the previous
609 version in `security/` in order to let the users of the old versions
610 know that they have to upgrade. Date it a few days before the ISO
611 image to be released was *built*. Including:
613 - the list of CVE fixed in Linux since the one shipped in the previous
614   release of Tails:
615   <http://ftp-master.metadata.debian.org/changelogs/main/l/linux/unstable_changelog>
616 - the list of DSA fixed in packages we ship since those that were in
617   the previous release of Tails: <http://security.debian.org/>
618 - the list of BSA fixed in packages we ship since those that were in
619   the previous release of Tails:
620   <https://lists.debian.org/debian-backports-announce/>
621 - the list of MFSA fixed by the iceweasel update:
622   <https://www.mozilla.org/security/announce/>
624 If preparing a release candidate
625 --------------------------------
627 Skip this part if preparing a final release.
629 Copy the `.iso.sig` file into the website repository:
631         cp "$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso.sig" \
632            "$MASTER_CHECKOUT/wiki/src/torrents/files/"
634 Write the announcement for the release in
635 `$MASTER_CHECKOUT/wiki/src/news/test_$TAG.mdwn`, including:
637 - Update the `meta title` directive.
638 - Update the `meta date` directive.
639 - Document important config changes that persistence users have to do
640   themselves (e.g. the Pidgin proxy settings change in
641   [[!tails_gitweb_commit 9925321]] breaks all existing persistent
642   profiles).
643 - Document known issues.
645 In any case
646 -----------
648 Generate PO files for the announcements with `./build-wiki`.
650 Then, send them to <tails-l10n@boum.org> so that they get translated
651 shortly, perhaps even soon enough to integrate them before pushing the
652 release out officially.
654 Then, record the last commit before putting the release out for real:
656         git add wiki/src && \
657         git commit -m "releasing version ${VERSION}"
659 Testing
660 =======
662 1. Set up a Gobby document and copy the [[manual test
663    suite|contribute/release_process/test]] in it.
664 1. Email to <tails@boum.org> and potential contributors that tests may start:
665    - make it clear what's the deadline
666    - make it clear where and how you expect to get feedback
667    - attach the Torrent
668    - attach the `.packages` file
669 1. Email <tails-testers@boum.org> to ask them to test the tentative ISO.
670 1. Make sure someone is committed to run the automated test suite.
671 1. Make sure that enough people are here to run the tests, that they
672    report their results in due time, and that they make it clear when
673    they're leaving for good.
675 Go wild!
676 ========
678 Sanity check
679 ------------
681 Verify once more that the current source for Firefox is still the same
682 we've used when preparing our custom Iceweasel packages.
684 Push
685 ----
687 ### Git
689 Push the last commits to our Git repository:
691         ( cd "$RELEASE_CHECKOUT" && git push ) && \
692         ( cd "$MASTER_CHECKOUT" && git fetch && git merge "$RELEASE_BRANCH" && git push )
694 ... and ask <root@boum.org> to refresh the ikiwiki wrappers for
695 our website.
697 Bug tracker
698 -----------
700 Skip this part if preparing a release candidate.
702 Mark all issues fixed in this release as `Status: Resolved` in our bug
703 tracker. For a list of candidates, see:
705 * the [issues in *Fix committed*
706   status](https://labs.riseup.net/code/projects/tails/issues?query_id=111);
707 * the "Fix committed" section on the [Release Manager
708   View](https://labs.riseup.net/code/projects/tails/issues?query_id=130).
710 Then, mark the just-released Redmine milestone as done: go to the
711 target version page, click *Edit*, and set *Status* to *Closed*.
713 ### Tickets linked from the website
715 Go through the tickets linked from the documentation and support sections of the
716 website and point documentation writers to the ticket that might be resolved in
717 this release.
719     git grep tails_ticket -- "wiki/src/[ds]*/*.mdwn"
721 Test suite
722 ----------
724 Remove indications of known broken tests that were fixed by this
725 release:
727         git grep XXX -- features
732 Update the topic in our [[chatroom|chat]].
734 Twitter
735 -------
737 Announce the release by tweeting a link to the "news" page.
739 Tor blog
740 --------
742 We announce *major* releases on the Tor blog:
744 - [login to their Drupal](https://blog.torproject.org/user)
745 - *Add a New Blog Post*
746 - add the same tags as the previous release announce had
747 - choose *Filtered HTML* as the *Input format*
748 - paste the HTML generated by ikiwiki from the announce in `news/`
749   into the textarea in the blog post editor
750 - cleanup a bit to make it shorter
751 - add a link to our [[download page|download]]
752 - change the internal links into external links
753 - turn `<h1>` into `<strong>`
754 - direct users to [[our communication channels|support/talk]] for
755   comments and feedback
756 - disable comments
758 Tor weekly news
759 ---------------
761 Write a short announcement for the Tor weekly news, or find someone
762 who's happy to do it.
764 Prepare for the next release
765 ============================
767 XXX: adapt / fork for release candidates. In the meantime, read all
768 this, and skip what does not make sense for a RC.
770 1. Move the previous stable release to `obsolete` on the mirrors.
771 1. Remove any remaining RC for the just-published release from
772    the mirrors.
773 1. Pull `master` back and merge it into `devel`.
774 1. Follow the
775    [[post-release|contribute/APT_repository#workflow-post-release]] APT
776    repository documentation.
777 1. Push the resulting `devel` branch.
778 1. If this was a major release, then reset experimental:
779    - take note of branches merged into `experimental`, but not into
780      `devel`:
782          git log --pretty=oneline --color=never --merges devel..experimental \
783            | /bin/grep 'into experimental$' \
784            | sed -e 's,^[a-f0-9]\+\s\+,,' | sort -u
786    - `git checkout experimental && git reset --hard devel`
787    - [[hard reset|contribute/APT_repository#workflow-reset]] the `experimental`
788      APT suite to the state of the `devel` one.
789    - merge additional branches into experimental (both at the Git and
790      APT levels)
792          for branch in $UNMERGED_BRANCHES ; do
793             git merge $branch
794             suite=$(echo $branch | sed -e 's,[/_],-,g')
795             if [ $(ssh reprepro@incoming.deb.tails.boum.org reprepro list $suite | wc -l) -gt 0 ] ; then
796                ssh reprepro@incoming.deb.tails.boum.org tails-merge-suite $suite experimental
797             fi
798          done
800    - `git push --force origin experimental`
801 1. Make sure Jenkins manages to build all updated major branches fine:
802    <https://jenkins.tails.boum.org/>.
803 1. Delete the _Release Manager View for $VERSION_ Redmine custom query.
804 1. Ensure the next few releases have their own _Release Manager View_.
805 1. On the [[!tails_roadmap]], update the *Due date* for the *Broken
806    windows* so that this section appears after the next release.
808 Related pages
809 =============
811 [[!map pages="contribute/release_process/*"]]