Update website PO files.
[tails-test.git] / wiki / src / contribute / release_process.mdwn
blob2d4850f7744d10322e24b120853ca8fe0cd7cc5d
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_VERSION`: set to the version number of the next Tails release
20   (e.g. 0.23 when releasing 0.22.1)
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 Update included files
64 =====================
66 AdBlock patterns
67 ----------------
69 Patterns are stored in
70 `config/chroot_local-includes/etc/iceweasel/profile/adblockplus/`.
72 1. Boot Tails
73 2. Open *Tools* → *Addons*
74 3. Select *Adblock Plus* in extensions
75 4. Open *Preferences* → *Filter preferences…*
76 5. For each filters, click *Actions* → *Update filters*
77 6. Close Iceweasel
78 7. Copy the `.mozilla/firefox/default/adblockplus/patterns.ini` from
79    this Iceweasel instance to the
80    `config/chroot_local-includes/etc/iceweasel/profile/adblockplus`
81    directory in the Tails Git checkout.
82 8. Commit:
84        git commit -m 'Update AdBlock Plus patterns.' \
85           config/chroot_local-includes/etc/iceweasel/profile/adblockplus/patterns.ini
87 Upgrade bundled binary Debian packages
88 --------------------------------------
90 That is: make sure the bundled binary Debian packages contain
91 up-to-date localization files.
93 For each bundled Debian package, `cd` into the package's root
94 directory (e.g. a checkout of the `whisperback` repository),
95 and then run the `import-translations` script that is in the
96 main Tails repository. For example:
98         cd whisperback
99         ../tails/import-translations
101 If the `import-translations` script fails to import translations for
102 the current package, manually copy updated PO files from the
103 Transifex branches of `git://git.torproject.org/translation.git` (e.g.
104 `whisperback_completed`) instead. In this case, skip PO files for
105 [[translation teams that use Git|contribute/how/translate#translate]].
107 Add and commit.
109 Then check the PO files [[using i18nspector|contribute/l10n_tricks]].
110 Correct all the errors that are not in the ignored list of
111 [[`check_po.sh`|contribute/l10n_tricks]]. Commit the changes if any.
113 Then see the relevant release processes:
115 * [[iceweasel]]
116 * [[liveusb-creator]]
117 * [[tails-greeter]]
118 * [[perl5lib]]
119 * [[persistence-setup]]
120 * [[tails-iuk]]
121 * whisperback:
122   * follow [upstream release process](https://git-tails.immerda.ch/whisperback/plain/HACKING)
123   * build a Debian package
124   * upload it to our [[APT repository]]
126 Update PO files
127 ---------------
129 Pull updated translations for languages translated in Transifex:
131         ./import-translations
133 Refresh the code PO files:
135         ./refresh-translations
137 Commit the result, including new PO files:
139         git add po && git commit -m 'Update PO files.'
141 Freeze
142 ------
144 If we are at freeze time for a major release:
146 * Merge the `master` Git branch into `devel`.
147 * Merge the `devel` Git branch into `testing`.
148 * Reset the `testing` APT suite to the state of the `devel` one, as
149   documented on [[contribute/APT_repository#workflow-freeze]].
151 Else, if we are at freeze time for a point-release:
153 * Merge the `master` Git branch into `stable`.
155 Changelog
156 ---------
158 Remove the placeholder entry for next release in `debian/changelog`,
159 and then:
161         ./release $VERSION $PREVIOUS_VERSION
163 This populates the Changelog with the Git log entries.
165 Then, launch an editor for the needed cleanup of the result:
167         dch -e
169 Then, gather other useful information from:
171 * every custom bundled package's own Changelog (Greeter, Persistent
172   Volume Assistant, etc.);
173 * the "Fix committed" section on the [Release Manager
174   View](https://labs.riseup.net/code/projects/tails/issues?query_id=130).
176 Finally, commit:
178         git commit debian/changelog -m "Update changelog for $VERSION."
180 Included website
181 ----------------
183 ### Merge master
185 Merge `master` into the branch used for the release:
187         git fetch origin && git merge origin/master
189 ### version number
191 If preparing a RC, skip this part.
193 In the branch used to build the release, update the `wiki/src/inc/*` files to
194 match the *version number* and *date* of the new release. Set the date
195 at least 24 hours in the future! Between tests and mirror synchronization,
196 the build will not be released on the same day. Try to make sure it
197 matches the date of the future signature.
199         RELEASE_DATE='June 26, 2013'
201         echo "$VERSION"      > wiki/src/inc/stable_i386_version.html
202         echo "$RELEASE_DATE" > wiki/src/inc/stable_i386_date.html
203         $EDITOR wiki/src/inc/*.html
204         ./build-wiki
205         git commit wiki/src/inc/ -m "Update version and date for $VERSION."
207 ### features and design documentation
209 Read the Changelog carefully, and update [[doc/about/features]]
210 pages accordingly.
212 Also:
214         git grep PENDING wiki/src/contribute/design*
216 ... and remove the `PENDING-FOR-N.M` warnings.
218 Website translations
219 --------------------
221 Refresh the website PO files and commit the ones corresponding to
222 pages that were added or changed accordingly to changes coming with
223 the new release. This e.g. ensures that the RC call for translation
224 points translators to up-to-date PO files:
226         ./build-wiki && git add wiki/src && git commit -m 'Update website PO files.'
228 Call for translation
229 ====================
231 If at freeze time:
233 1. Ask on tails-l10n that someone checks the PO files of `po/` and of
234    the website [[using `check_po.sh`|contribute/l10n_tricks]], and
235    corrects all the errors.
236 2. Send a call for translations to tails-l10n, making it clear what
237    Git branch the translations must be based on, and what are the
238    priorities. Also, add a few words to remember the translation teams
239    using Git that they should regularly contact Transifex translators,
240    as detailed on the [[documentation for
241    translators|contribute/how/translate]].
243 Import the signing key
244 ======================
246 You should never import the Tails signing key into your own keyring,
247 and a good practice is to import it to a tmpfs so no key material is
248 written to disk:
250     export GNUPGHOME=$(mktemp -d)
251     sudo mount -t tmpfs tmpfs "$GNUPGHOME"
252     gpg --homedir $HOME/.gnupg --export $TAILS_SIGNATURE_KEY | gpg --import
253     gpg --import path/to/private-key
255 Let's also ensure that strong digest algorithms are used for our
256 signatures, like the defaults we set in Tails:
258     cp config/chroot_local-includes/etc/skel/.gnupg/gpg.conf "$GNUPGHOME"
260 Tag the release in Git
261 ======================
263         git tag -u "$TAILS_SIGNATURE_KEY" -m "tagging version ${VERSION}" "${TAG}"
264         git push --tags
266 (Pushing the tag is needed so that the APT repository is updated, and
267 the Tails APT configuration works at build and boot time. It might be
268 premature, as testing might reveal critical issues, but this is
269 a signed tag, so it can be overridden later. Yes, there is room for
270 improvement here.)
272 Prepare the versioned APT suite
273 ===============================
275 Follow the [[post-tag|contribute/APT_repository#workflow-post-tag]] APT
276 repository documentation.
278 Build images
279 ============
281 Build the almost-final image
282 ----------------------------
284 [[Build images|contribute/build]] and carefully read the build logs to
285 make sure nothing bad happened.
287 SquashFS file order
288 -------------------
290 1. Build an ISO image.
291 1. Burn a DVD.
292 1. Boot this DVD **on bare metal**.
293 1. Add `profile` to the kernel command-line.
294 1. Three minutes after `iceweasel` has been loaded, retrieve the new sort
295    file from `/var/log/boot-profile`.
296 1. Copy the new sort file to `config/binary_rootfs/squashfs.sort`.
297 1. Cleanup a bit.
298 1. Inspect the Git diff (including diff stat), apply common sense.
299 1. `git commit -m 'Updating SquashFS sort file' config/binary_rootfs/squashfs.sort`
301 Build the final image
302 ---------------------
304 Then all included files should be up-to-date and the versioned APT
305 suite should be ready, so it is time to:
307 * tag the release *again*, with all included files in
308 * `git push --tags`
309 *  build the final image!
311 <a id="prepare-iuk"></a>
313 Generate the OpenPGP signatures and Torrents
314 ============================================
316 First, create a directory with a suitable name and go there:
318         mkdir "$ISOS/tails-i386-$VERSION" && cd "$ISOS/tails-i386-$VERSION"
320 Second, copy the built image to this brand new directory.
321 Then, rename it:
323         mv "$ARTIFACTS/tails-i386-*-$VERSION-*.iso" "tails-i386-$VERSION.iso"
325 Third, generate detached OpenPGP signatures for the image to be
326 published, in the same directory as the image and with a `.sig`
327 extension; e.g.
329         gpg --armor --default-key "$TAILS_SIGNATURE_KEY" --detach-sign *.iso
330         rename 's,\.asc$,.sig,' *.asc
332 Fourth, go up to the parent directory, create a `.torrent` file and
333 check the generated `.torrent` files metainfo:
335         cd .. && \
336         mktorrent -a 'http://torrent.gresille.org/announce' "tails-i386-${VERSION}" && \
337         btshowmetainfo tails-i386-$VERSION.torrent
339 Fifth, generate detached OpenPGP signatures for every published
340 `.torrent` file:
342         gpg --armor --default-key "$TAILS_SIGNATURE_KEY" --detach-sign \
343           tails-i386-$VERSION.torrent && \
344         mv tails-i386-$VERSION.torrent.{asc,sig}
346 Prepare incremental upgrades
347 ============================
349 Build the Incremental Upgrade Kits
350 ----------------------------------
352 Use `tails-create-iuk` to build an IUK for the previous stable release
353 and (if applicable) the last RC for the version being released. Example:
355     sudo su -c "cd $IUK_CHECKOUT && \
356       PERL5LIB=\"$PERL5LIB_CHECKOUT/lib\" \
357         ./bin/tails-create-iuk \
358            --squashfs-diff-name \"$VERSION.squashfs\"           \
359            --old-iso \"$ISOS/tails-i386-$PREVIOUS_VERSION/tails-i386-$PREVIOUS_VERSION.iso\" \
360            --new-iso \"$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso\"          \
361            --outfile \"$ISOS/Tails_i386_${PREVIOUS_VERSION}_to_${VERSION}.iuk\""
363 Note that developer tools for creating IUK and upgrade-description
364 files were only tested on Debian sid. It should hopefully work well on
365 Wheezy too.
367 <a id="prepare-upgrade-description-files"></a>
369 Prepare upgrade-description files
370 ---------------------------------
372 1. Prepare upgrade-description files (see the [[upgrade-description
373    files
374    specification|contribute/design/incremental_upgrades#upgrade-description-files]]
375    for details). The idea is to:
377    * update (create if needed) an upgrade-description file for every
378      *previous* supported release (e.g. N~rc1, N-1, N-1~rc2) that replaces
379      all existing upgrade paths with the path to the version being
380      released;
381    * create a new upgrade-description for the version being released,
382      that expresses that *no* upgrade is available for that one yet.
384    This is what `tails-iuk-generate-ugrade-description-files` tool
385    does:
387        ( cd $IUK_CHECKOUT && \
388        ./bin/tails-iuk-generate-upgrade-description-files \
389            --version "$VERSION" \
390            --next-version "$NEXT_VERSION" \
391            --next-version "${NEXT_VERSION}~rc1" \
392            --iso "$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso" \
393            --previous-version "$PREVIOUS_VERSION" \
394            --previous-version "${VERSION}~rc1" \
395            --iuks "$ISOS" \
396            --release-checkout "$RELEASE_CHECKOUT" \
397            --major-release "$MAJOR_RELEASE" \
398        )
400    Note:
401    * The `--iuks` argument must point to the directory where the IUKs
402      generated at the previous step are stored.
403    * At least the last stable release and the previous release
404      candidates for the version being released must be passed to
405      `--previous-version`.
406    * A few (say, 2 or 3) older versions must be passed with
407      `--previous-version`, so that users who skipped a release or two
408      are directly informed of the new one.
409    * If preparing a release candidate, add `--channel alpha`
410    * If preparing a release candidate, do not pass
411      `--next-version "${NEXT_VERSION}~rc1"`
413 1. Create an armoured detached signature for each created or modified
414    upgrade-description file.
416        find "$RELEASE_CHECKOUT/wiki/src/upgrade/" \
417           -type f -name upgrades.yml -exec \
418              gpg -u "$TAILS_SIGNATURE_KEY" --armor --detach-sign {} \;
420 1. Rename each detached signature to `.pgp`:
422        find "$RELEASE_CHECKOUT/wiki/src/upgrade/" -type f \
423           -name upgrades.yml.asc -exec rename -f 's,\.asc$,.pgp,' {} \;
425 1. Add and commit the upgrade-description files and their detached
426    signatures to the Git branch used to prepare the release (`stable`
427    or `testing`):
429        ( cd "$RELEASE_CHECKOUT" && git add wiki/src/upgrade && \
430           git commit -m "Update upgrade-description files." )
432 1. Check the syntactic correctness of all upgrade-description files:
434        ( cd $IUK_CHECKOUT && \
435           ./bin/tails-iuk-check-upgrade-description-file \
436              ${RELEASE_CHECKOUT}/wiki/src/upgrade/v1/*/*/*/*/upgrades.yml )
438 1. If preparing a release candidate, move the generated or updated
439    files to `$MASTER_CHECKOUT`, commit and push: given the updates are
440    advertised on the *alpha* channel, while all users use the *stable*
441    one by default, this will allow you to more easily test the IUK
442    without impacting anyone.
444 Upload images
445 =============
447 Sanity check
448 ------------
450 Verify that the current source for Firefox is still the same we've
451 used when preparing our custom Iceweasel package: e.g. FF17.0.8 got
452 re-tagged and re-uploaded at the last minute, due to a test failure.
454 Better catch this before people spend time doing manual tests.
456 ## Announce, seed and test the Torrents
458 Announce and seed the Torrents.
460 Test them with a BitTorrent client running in a different place.
462 ## Download and seed image from lizard
464     scp "$ISOS/tails-i386-$VERSION.torrent" \
465        bittorrent.lizard: && \
466        ssh bittorrent.lizard transmission-remote --add tails-i386-$VERSION.torrent
468 Publish the ISO over HTTP
469 -------------------------
471 Upload the images to the primary rsync mirror. Best practice is to first
472 let bittorrent.lizard download the image, and then copy it from there to
473 rsync.lizard:
475     ssh lizard.tails.boum.org \
476         scp -3 -r \
477             bittorrent.lizard:/var/lib/transmission-daemon/downloads/tails-i386-$VERSION \
478             rsync.lizard:
479     # set DIST to either 'alpha' (for RC:s) or 'stable' (for actual releases)
480     ssh rsync.lizard << EOF
481       chown -R root:rsync_tails tails-i386-$VERSION
482       chmod -R u=rwX,go=rX tails-i386-$VERSION
483       sudo mv tails-i386-$VERSION /srv/rsync/tails/tails/$DIST/
484     EOF
486 Update the time in `project/trace` file on the primary rsync mirror
487 and on the live wiki (even for a release candidate):
489         TRACE_TIME=$(date +%s) &&
490         echo $TRACE_TIME | ssh rsync.lizard "cat > /srv/rsync/tails/tails/project/trace" && \
491         [ -n "$MASTER_CHECKOUT" ] && \
492         echo $TRACE_TIME > "$MASTER_CHECKOUT/wiki/src/inc/trace" &&
493         (
494            cd "$MASTER_CHECKOUT" && \
495            git commit wiki/src/inc/trace -m "Updating trace file after uploading $VERSION."
496         )
498 <a id="publish-iuk"></a>
500 Publish the IUKs
501 ----------------
503 Same as for the ISO, but the IUKs should land into
504 `/srv/rsync/tails/tails/$DIST/iuk/`.
506 Wait for the HTTP mirrors to catch up
507 -------------------------------------
509 Wait for the next rsync pull.
511 Make sure every webserver listed in the `dl.amnesia.boum.org` round
512 robin pool has the new version. Drop those that are lagging behind and
513 notify their administrators.
515 Test downloading the ISO and IUK over HTTP.
517 Testing
518 =======
520 1. Set up a Gobby document and copy the [[manual test
521    suite|contribute/release_process/test]] in it.
522 1. Email to <tails@boum.org> and potential contributors that tests may start:
523    - make it clear what's the deadline
524    - make it clear where and how you expect to get feedback
525    - attach the Torrent
526    - attach the `.packages` file
527 1. Email <tails-testers@boum.org> to ask them to test the tentative ISO.
528 1. Make sure someone is committed to run the automated test suite.
529 1. Make sure that enough people are here to run the tests, that they
530    report their results in due time, and that they make it clear when
531    they're leaving for good.
533 While this happens, the release manager should prepare for the next
534 steps. Please read on!
536 Update the website and Git repository
537 =====================================
539 What follows in this section happens on the release branch in
540 `$RELEASE_CHECKOUT`.
542 If preparing a final release
543 ----------------------------
545 Skip this part if preparing a RC.
547 In order to get any new documentation into the website, merge either
548 `stable` or `testing` (depending on which release you just did) into
549 `master`.
551 Rename the `.packages` file to remove the `.iso` and build date parts
552 of its name:
554         mv "$ARTIFACTS"/tails-i386-*-"$VERSION"-*.iso.packages \
555            "$ARTIFACTS/tails-i386-$VERSION.packages"
557 Copy the `.iso.sig`, `.packages`, `.torrent` and `.torrent.sig` files
558 into the website repository:
560         cp "$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso.sig" \
561            "$ARTIFACTS/tails-i386-$VERSION.packages" \
562            "$ISOS/tails-i386-$VERSION.torrent" \
563            "$ISOS/tails-i386-$VERSION.torrent.sig" \
564            "$RELEASE_CHECKOUT/wiki/src/torrents/files/"
566 Remove from `wiki/src/torrents/files/` any remaining file from the
567 previous release (including any RC).
569 Generate the SHA-256 hash of every image
570 to be released in `inc/*`:
572         sha256sum $ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso | \
573           cut -f 1 -d ' ' | tr -d '\n' \
574           > "$RELEASE_CHECKOUT/wiki/src/inc/stable_i386_hash.html"
576 Update the [[support/known_issues]] page:
578 - Add regressions brought by the new release.
579 - Remove older known issues that are fixed by the new release.
581 Write the announcement for the release in
582 `news/version_$TAG.mdwn`, including:
584 - Update the `meta title` directive.
585 - Update the `meta date` directive.
586 - Make sure there's an `announce` tag to have an email sent to the
587   news mailing-list.
588 - Document important config changes that persistence users have to do
589   themselves (e.g. the Pidgin proxy settings change in
590   [[!tails_gitweb_commit 9925321]] breaks all existing persistent
591   profiles).
592 - Document known issues.
594 Write an announcement listing the security bugs affecting the previous
595 version in `security/` in order to let the users of the old versions
596 know that they have to upgrade. Date it a few days before the ISO
597 image to be released was *built*. Including:
599 - the list of CVE fixed in Linux since the one shipped in the previous
600   release of Tails:
601   <http://ftp-master.metadata.debian.org/changelogs/main/l/linux/unstable_changelog>
602 - the list of DSA fixed in packages we ship since those that were in
603   the previous release of Tails: <http://security.debian.org/>
604 - the list of BSA fixed in packages we ship since those that were in
605   the previous release of Tails:
606   <https://lists.debian.org/debian-backports-announce/>
607 - the list of MFSA fixed by the iceweasel update:
608   <https://www.mozilla.org/security/announce/>
610 If preparing a release candidate
611 --------------------------------
613 Skip this part if preparing a final release.
615 Copy the `.iso.sig` file into the website repository:
617         cp "$ISOS/tails-i386-$VERSION/tails-i386-$VERSION.iso.sig" \
618            "$MASTER_CHECKOUT/wiki/src/torrents/files/"
620 Write the announcement for the release in
621 `$MASTER_CHECKOUT/wiki/src/news/test_$TAG.mdwn`, including:
623 - Update the `meta title` directive.
624 - Update the `meta date` directive.
625 - Document important config changes that persistence users have to do
626   themselves (e.g. the Pidgin proxy settings change in
627   [[!tails_gitweb_commit 9925321]] breaks all existing persistent
628   profiles).
629 - Document known issues.
631 In any case
632 -----------
634 Generate PO files for the announcements with `./build-wiki`.
636 Then, send them to <tails-l10n@boum.org> so that they get translated
637 shortly, perhaps even soon enough to integrate them before pushing the
638 release out officially.
640 Then, record the last commit before putting the release out for real:
642         git add wiki/src && \
643         git commit -m "releasing version ${VERSION}"
645 Go wild!
646 ========
648 Sanity check
649 ------------
651 Verify once more that the current source for Firefox is still the same
652 we've used when preparing our custom Iceweasel packages.
654 Push
655 ----
657 ### Git
659 Push the last commits to our Git repository:
661         ( cd "$RELEASE_CHECKOUT" && git push ) && \
662         ( cd "$MASTER_CHECKOUT" && git fetch && git merge "$RELEASE_BRANCH" && git push )
664 ... and ask <root@boum.org> to refresh the ikiwiki wrappers for
665 our website.
667 Bug tracker
668 -----------
670 Skip this part if preparing a release candidate.
672 Mark all issues fixed in this release as `Status: Resolved` in our bug
673 tracker. For a list of candidates, see:
675 * the [issues in *Fix committed*
676   status](https://labs.riseup.net/code/projects/tails/issues?query_id=111);
677 * the "Fix committed" section on the [Release Manager
678   View](https://labs.riseup.net/code/projects/tails/issues?query_id=130).
680 Then, mark the just-released Redmine milestone as done: go to the
681 target version page, click *Edit*, and set *Status* to *Closed*.
683 ### Tickets linked from the website
685 Go through the tickets linked from the documentation and support sections of the
686 website and point documentation writers to the ticket that might be resolved in
687 this release.
689     git grep tails_ticket -- "wiki/src/[ds]*/*.mdwn"
691 Test suite
692 ----------
694 Remove indications of known broken tests that were fixed by this
695 release:
697         git grep XXX -- features
702 Update the topic in our [[chatroom|chat]].
704 Twitter
705 -------
707 Announce the release by tweeting a link to the "news" page.
709 Tor blog
710 --------
712 We announce *major* releases on the Tor blog:
714 - [login to their Drupal](https://blog.torproject.org/user)
715 - *Add a New Blog Post*
716 - add the same tags as the previous release announce had
717 - choose *Filtered HTML* as the *Input format*
718 - paste the HTML generated by ikiwiki from the announce in `news/`
719   into the textarea in the blog post editor
720 - cleanup a bit to make it shorter
721 - add a link to our [[download page|download]]
722 - change the internal links into external links
723 - turn `<h1>` into `<strong>`
724 - direct users to [[our communication channels|support/talk]] for
725   comments and feedback
726 - disable comments
728 Tor weekly news
729 ---------------
731 Write a short announcement for the Tor weekly news, or find someone
732 who's happy to do it.
734 Prepare for the next release
735 ============================
737 XXX: adapt / fork for release candidates. In the meantime, read all
738 this, and skip what does not make sense for a RC.
740 1. Move the previous stable release to `obsolete` on the mirrors.
741 1. Remove any remaining RC for the just-published release from
742    the mirrors.
743 1. Pull `master` back and merge it into `devel`.
744 1. Follow the
745    [[post-release|contribute/APT_repository#workflow-post-release]] APT
746    repository documentation.
747 1. Push the resulting `devel` branch.
748 1. If this was a major release, then reset experimental:
749    - take note of branches merged into `experimental`, but not into
750      `devel`:
752          git log --pretty=oneline --color=never --merges devel..experimental \
753            | /bin/grep 'into experimental$' \
754            | sed -e 's,^[a-f0-9]\+\s\+,,' | sort -u
756    - `git checkout experimental && git reset --hard devel`
757    - [[hard reset|contribute/APT_repository#workflow-reset]] the `experimental`
758      APT suite to the state of the `devel` one.
759    - merge additional branches into experimental (both at the Git and
760      APT levels)
762          for branch in $UNMERGED_BRANCHES ; do
763             git merge $branch
764             suite=$(echo $branch | sed -e 's,[/_],-,g')
765             if [ $(ssh reprepro@incoming.deb.tails.boum.org reprepro list $suite | wc -l) -gt 0 ] ; then
766                ssh reprepro@incoming.deb.tails.boum.org tails-merge-suite $suite experimental
767             fi
768          done
770    - `git push --force origin experimental`
771 1. Push the release tag to lizard for Jenkins' consumption: `git push --tags lizard`
772 1. Force-push all major branches to lizard:
774            for branch in stable testing devel experimental ; do
775               git push --force lizard $branch:$branch
776            done
778 1. Make sure Jenkins manages to build all major branches fine:
779    <https://jenkins.tails.boum.org/>.
780 1. In the [Release Manager
781    View](https://labs.riseup.net/code/projects/tails/issues?query_id=130)
782    custom Redmine query, set *Target version* to the next release. Save.
783 1. On the [[!tails_roadmap]], update the *Due date* for the *Broken
784    windows* so that this section appears after the next release.
786 Related pages
787 =============
789 [[!map pages="contribute/release_process/*"]]